Николаев Виталий
Блог веб-разработчика: Битрикс, PHP, Python, Linux и SEO
Python Python
12.04.2018

Пишем бота пересылки сообщений из VK в Telegram на Python

Пишем бота пересылки сообщений из VK в Telegram на Python

Очень часто бывает, что у вас уже есть группа во ВКонтакте, но хочется дополнительно вести Telegram-канал.

Публиковать посты вручную сразу в две соцсети неудобно, поэтому в этой статье мы напишем Telegram-бота на Python, который будет автоматически пересылать сообщения из VK в Telegram.

Бот умеет:

  • пересылать текст постов;
  • отправлять изображения;
  • обрабатывать репосты;
  • публиковать ссылки;
  • избегать повторной отправки постов.

Регистрация Telegram-бота

Для начала регистрируем Telegram-бота через @BotFather

Отправляем команду:

/newbot

После этого BotFather попросит:

  • придумать имя бота;
  • придумать username;
  • username обязательно должен заканчиваться на bot.

После регистрации вы получите токен:

Use this token to access the HTTP API: XXXXXXXXXXXXXXXXXXXXXXXXX

Важно: никому не передавайте токен бота, иначе им смогут управлять посторонние.

Создаем settings.ini

Создаем файл settings.ini с настройками бота:

[Settings]
last_id = 123
include_link = true
preview_link = false

[VK]
login = login
password = pass
domain = oldlentach
count = 30

[Telegram]
bot_token = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
channel = @test

Что означают параметры

  • last_id — ID последнего обработанного поста;
  • include_link — добавлять ссылку на пост VK;
  • preview_link — включить предпросмотр ссылок;
  • login — логин VK;
  • password — пароль VK;
  • domain — домен сообщества VK;
  • count — количество последних постов;
  • bot_token — токен Telegram-бота;
  • channel — Telegram-канал для публикации.

Не забудьте добавить бота администратором Telegram-канала, иначе он не сможет публиковать сообщения.

Установка библиотек

Для работы понадобятся библиотеки:

Устанавливаем их:

pip install vk_api
pip install pyTelegramBotAPI

Импорт библиотек

Создаем файл vk_to_tg.py и импортируем модули:

import os
import sys
import vk_api
import telebot
import configparser
import logging

from telebot.types import InputMediaPhoto

Чтение настроек из settings.ini

config_path = os.path.join(sys.path[0], 'settings.ini')

config = configparser.ConfigParser()

config.read(config_path)

LOGIN = config.get('VK', 'LOGIN')
PASSWORD = config.get('VK', 'PASSWORD')
DOMAIN = config.get('VK', 'DOMAIN')
COUNT = config.get('VK', 'COUNT')

BOT_TOKEN = config.get('Telegram', 'BOT_TOKEN')
CHANNEL = config.get('Telegram', 'CHANNEL')

INCLUDE_LINK = config.getboolean('Settings', 'INCLUDE_LINK')
PREVIEW_LINK = config.getboolean('Settings', 'PREVIEW_LINK')

Инициализация Telegram-бота

bot = telebot.TeleBot(BOT_TOKEN)

Получение данных из VK

Создаем функцию получения постов из VK:

def get_data(domain_vk, count_vk):

    vk_session = vk_api.VkApi(
        LOGIN,
        PASSWORD
    )

    vk_session.auth()

    vk = vk_session.get_api()

    # Метод wall.get
    response = vk.wall.get(
        domain=domain_vk,
        count=count_vk
    )

    return response

Проверка новых постов

Теперь проверяем, какие посты уже были опубликованы, а какие нужно отправить в Telegram.

def check_posts_vk():

    response = get_data(DOMAIN, COUNT)

    response = reversed(response['items'])

    for post in response:

        # Последний обработанный ID
        id = config.get('Settings', 'LAST_ID')

        # Пропускаем старые посты
        if int(post['id']) <= int(id):
            continue

Получение текста поста

text = post['text']

Получение изображений и вложений

Далее проверяем вложения:

images = []
links = []
attachments = []

if 'attachments' in post:

    attach = post['attachments']

    for add in attach:

        if add['type'] == 'photo':

            img = add['photo']
            images.append(img)

        elif add['type'] == 'video':

            video = add['video']

            if 'player' in video:
                links.append(video['player'])

Отправка текста в Telegram

def send_posts_text(text):

    if text == '':

        print('no text')

    else:

        for msg in split(text):

            bot.send_message(
                CHANNEL,
                msg,
                disable_web_page_preview=not PREVIEW_LINK
            )

Разбиение длинных сообщений

В Telegram есть ограничение на длину сообщения, поэтому длинные посты нужно разбивать:

def split(text):

    if len(text) >= max_message_length:

        last_index = max(
            map(
                lambda separator:
                text.rfind(
                    separator,
                    0,
                    max_message_length
                ),
                message_breakers
            )
        )

        good_part = text[:last_index]

        bad_part = text[last_index + 1:]

        return [good_part] + split(bad_part)

    else:

        return [text]

Отправка изображений

def send_posts_img(img):

    # Получаем изображение максимального качества
    url = max(
        img["sizes"],
        key=lambda size: size["type"]
    )["url"]

    bot.send_photo(CHANNEL, url)

Запуск скрипта

В конце файла запускаем обработку:

if __name__ == '__main__':
    check_posts_vk()

Автоматический запуск

Для автоматической публикации скрипт удобно запускать:

  • через cron в Linux;
  • через Планировщик задач Windows.

GitHub репозиторий

Полный код бота доступен на GitHub:

https://github.com/Nikovit/bot_vk_to_telegram

Итог

В результате получается полноценный бот для автоматической пересылки постов из VK в Telegram.

Такой подход позволяет:

  • вести Telegram-канал автоматически;
  • не дублировать публикации вручную;
  • объединить несколько соцсетей;
  • автоматизировать публикацию контента.
27 просмотров

Комментарии

Где заказы?
Почему у одних компаний очередь из клиентов, а у других пустой сайт и тишина?
Телеграм канал «Где заказы?» — про продажи, сайты и ошибки бизнеса на реальных примерах. Подписаться