Пишем бота пересылки сообщений из 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-канал автоматически;
- не дублировать публикации вручную;
- объединить несколько соцсетей;
- автоматизировать публикацию контента.
Комментарии