Автопостинг телеграмм бот python

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Бот на Python для автопостинга записей из VK в чаты и каналы Telegram.

mihail64/VKPosterBot

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

readme.md

Бот для автоматического постинга записей из групп и публичных страниц ВКонтакте в Telegram. В данный момент бот находится в разработке, код прокомментирован неполностью.

Работающий бот: @VKPstBot в Telegram

About

Бот на Python для автопостинга записей из VK в чаты и каналы Telegram.

Источник

Автопостинг в каналы

Сам текст написан в 2015-м. В начале 2017 года ВК начал требовать токен пользователя для вызова метода wall.get и многих других. Процесс получения токена для ВК не относится к теме учебника, следовательно, описан не будет. По ссылке https://vk.com/dev/manuals любой желающий сможет найти документацию и описание процесса получения токена. Где-то в 2018-2019 годах метод wall.get начал возвращать другую структуру ответа. Текст и код урока написаны для версии API v5.68

Описание

  1. Не надо зависеть от временных сбоев серверов Telegram при поллинге, т.к. нет входящих сообщений.
  2. Анонимная рассылка сообщений (некоторые люди просили сделать возможность отправлять свои сообщения через “безликого” бота) максимально упростилась.
  3. Не надо вести списки пользователей, которым нужно отправить информацию и внедрять паузы между отправкой сообщения по очереди всем, эту заботу берёт на себя сам Telegram.

Лично я заметил, что некоторые паблики и группы ВКонтакте стали дублировать свои записи в каналы Telegram. Сегодня мы научимся делать то же самое без помощи каких-либо конструкторов или сторонних веб-сайтов. Чтобы не сильно заморачиваться, будем постить только ссылку на пост, превью к ней и так даст необходимый минимум информации о посте.

Читайте также:  Laravel php artisan update

Получаем записи

В качестве “подопытного кролика” выберем официальный блог ВКонтакте. Получать новые записи будем при помощи VK API. Итак, сформируем ссылку, которая будет нам возвращать последние 10 записей от имени сообщества из группы VK Team: https://api.vk.com/method/wall.get?domain=team&count=10&filter=owner&access_token=token&v=5.68 Что здесь что? domain — короткое имя сообщества. Если его нет, то меняем domain=xxx на owner_id=-yyy (обратите внимание на минус перед числом, это важно). count — число выводимых записей. Чем дольше пауза между проверками и чем чаще в сообществе появляются записи, тем большее число нужно выставить, но не более 100. filter=owner просит сервер выводить записи только от имени группы, полезно, если стена открыта, access_token — это токен пользователя, который «дёргает» API от имени одного из приложений, а v=5.68 – номер используемой версии API. При использовании более свежей версии (5.100 и выше), структура ответа будет другой, оставляю это для самостоятельного изучения. Давайте теперь создадим файл bot.py , в котором зададим основные константы и импорты:

import time import eventlet import requests import logging import telebot from time import sleep # Каждый раз получаем по 10 последних записей со стены URL_VK = 'https://api.vk.com/method/wall.get?domain=team&count=10&filter=owner&access_token=Ваш_токен_VK&v=5.68' FILENAME_VK = 'last_known_id.txt' BASE_POST_URL = 'https://vk.com/wall-22822305_' BOT_TOKEN = 'токен бота, постящего в канал' CHANNEL_NAME = '@канал' bot = telebot.TeleBot(BOT_TOKEN) 

Во-первых, не забудьте сделать нужного бота администратором канала, иначе фокус не удастся. Во-вторых, обратите внимание, что в импортах появилась библиотека eventlet , она поможет нам избежать проблем при получении записей из ВК. В-третьих, в указанный txt-файл будем записывать номер верхнего поста на момент проверки, я решил не заморачиваться с созданием key-value хранилищ, ради одного числа-то. В-четвёртых, в качестве параметра BASE_POST_URL указываем ссылку на любой пост из нашей группы без последнего числа.

Иногда ВК начинает дурить и не возвращает список постов за приемлемое время. В этом случае, нам нужно отвалиться по таймауту и пропустить проверку. Можно, конечно, попробовать ещё раз, но мы люди не настойчивые 🙂

def get_data(): timeout = eventlet.Timeout(10) try: feed = requests.get(URL_VK) return feed.json() except eventlet.timeout.Timeout: logging.warning('Got Timeout while retrieving VK JSON data. Cancelling. ') return None finally: timeout.cancel() 

Суть простая: получилось — возвращаем объект с постами. Не получилось — возвращаем None. Теперь перейдем непосредственно к парсингу. Алгоритм будет такой:

  1. Открываем файл, хранящий последний известный номер верхнего поста.
  2. Если метод get_data() вернул объект с записями, начинаем проходить по нему со второго элемента, т.к. первый — какое-то неизвестное мне рандомное число.
  3. Если номер поста меньше или равен последнему известному — завершаем обход.
  4. Проверяем наличие закрепленного поста. Если таковой есть, то передаем функции отправки сообщений все записи, кроме закрепленной. Иначе — просто передаем все.
  5. У каждой проверяемой записи забираем ID, подставляем рядом с BASE_POST_URL и получаем полный ID записи.
  6. Отправляем его в канал.
  7. Как только обход завершился, берем номер первой (второй, если первая — закрепленная) записи и записываем в файл поверх старого значения.
  8. Засыпаем или завершаемся.
Читайте также:  Run java working directory

По поводу п.8: дополнительно предусмотрим в нашей программе два режима: в первом режиме скрипт постоянно работает, засыпая после каждой итерации на 4 минуты; во втором режиме скрипт просто завершает работу, что позволяет ставить его в планировщик cron. В определении режима нам поможет константная переменная SINGLE_RUN, которую надо не забыть указать где-нибудь вверху.

def send_new_posts(items, last_id): for item in items: if item['id'] break link = ''.format(BASE_POST_URL, item['id']) bot.send_message(CHANNEL_NAME, link) # Спим секунду, чтобы избежать разного рода ошибок и ограничений (на всякий случай!) time.sleep(1) return def check_new_posts_vk(): # Пишем текущее время начала logging.info('[VK] Started scanning for new posts') with open(FILENAME_VK, 'rt') as file: last_id = int(file.read()) if last_id is None: logging.error('Could not read from storage. Skipped iteration.') return logging.info('Last ID (VK) = '.format(last_id)) try: feed = get_data() # Если ранее случился таймаут, пропускаем итерацию. Если всё нормально - парсим посты. if feed is not None: entries = feed['response'][1:] try: # Если пост был закреплен, пропускаем его tmp = entries[0]['is_pinned'] # И запускаем отправку сообщений send_new_posts(entries[1:], last_id) except KeyError: send_new_posts(entries, last_id) # Записываем новый last_id в файл. with open(FILENAME_VK, 'wt') as file: try: tmp = entries[0]['is_pinned'] # Если первый пост - закрепленный, то сохраняем ID второго file.write(str(entries[1]['id'])) logging.info('New last_id (VK) is '.format((entries[1]['id']))) except KeyError: file.write(str(entries[0]['id'])) logging.info('New last_id (VK) is '.format((entries[0]['id']))) except Exception as ex: logging.error('Exception of type in check_new_post(): '.format(type(ex).__name__, str(ex))) pass logging.info('[VK] Finished scanning') return 

Осталось дело за малым — написать логику запуска всего процесса и инициализировать логгер, который будет писать в текстовый файлик обо всех событиях в жизни бота:

if __name__ == '__main__': # Избавляемся от спама в логах от библиотеки requests logging.getLogger('requests').setLevel(logging.CRITICAL) # Настраиваем наш логгер logging.basicConfig(format='[%(asctime)s] %(filename)s:%(lineno)d %(levelname)s - %(message)s', level=logging.INFO, filename='bot_log.log', datefmt='%d.%m.%Y %H:%M:%S') if not SINGLE_RUN: while True: check_new_posts_vk() # Пауза в 4 минуты перед повторной проверкой logging.info('[App] Script went to sleep.') time.sleep(60 * 4) else: check_new_posts_vk() logging.info('[App] Script exited.\n') 

Перед запуском бота, создадим вручную файл last_known_id.txt и впишем в него один из последних числовых ID, в моём случае это было чудесное число 1893. После включения бота, в зависимости от значения SINGLE_RUN, он будет либо постоянно работать, проверяя каждые 4 минуты на наличие новых постов, либо завершится после окончания первой проверки. Для себя я выбрал второй вариант, добавив скрипт в cron.

На сегодня всё, теперь вы можете легко и просто настроить автопостинг записей практически из любой группы ВК в свой канал.

Источник

TG_AutoPoster

Бот, пересылающий записи из групп ВК в канал/чат/ЛС в Telegram.

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

pip3 install -U TG-AutoPoster

Настройка

  1. Создайте файл config.yaml , скопируйте в него содержимое файла config.yaml.example и выполните настройку ключа vk
  1. Получите ваши api_id и api_hash на https://my.telegram.org/apps и настройте ключ telegram (подробнее об Telegram API Keys здесь)
  1. Если необходимо, настройте использование SOCKS5 прокси, добавив ключ proxy со следующим содержимым:
Читайте также:  Примечание в таблице html

Запуск

  1. Для запуска используйте TG_AutoPoster.sh или команду python3 -m TG_AutoPoster
  2. Активируйте бота командой /start

Автопостинг рекомендуется настраивать через чат с ботом. Подробнее можно узнать, отправив боту команду /help

Для доступных параметров командой строки используйте bash TG_AutoPoster.sh —help или python3 -m TG_AutoPoster —help

По умолчанию бот проверяет группы на наличие новых постов раз в час. Если необходимо изменить период проверки постов запустите бота с параметром командной строки —sleep N , где N — значение в секундах. Не рекомендуется устанавливать малое значение, так как это может привести к заморозке страницы ВК (подробнее).

Описание настроек группы

Параметр Описание
channel Список ID каналов/чатов в Telegram, разделенных пробелом, в которые отправлять посты из групп ВК
last_id (необязательно) ID последнего отправленного поста. Если параметр отсутствует, он будет добавлен автоматически со значением 0
pinned_id (необязательно) ID закреплённого поста.
last_story_id (необязательно) ID последней отправленной истории.
use_long_poll (необязательно) Использовать Long Poll API для получения постов из своей группы (или в которой вы являетесь администратором) в режиме реального времени. Чтобы использовать Long Poll API, откройте раздел «Управление сообществом», на вкладке «Работа с API»→«Long Poll API» выберите «Включено», «Версия API»: 5.131. Также необходимо включить тип события «Записи на стене»: «Добавление» на вкладке «Типы событий».
Значение параметра по умолчанию: false

Описание настроек автопостинга (ключ settings )

Параметр Возможные значения Описание
sign_posts true, false Указывать ли автора поста (если это возможно) и ссылку на оригинальный пост. По умолчанию: true
send_reposts false, post_only, true Отправлять ли репосты? Подробнее в config.yaml.example. По умолчанию отправка репостов отключена.
send_stories false, true Отправлять ли истории? По умолчанию: false
what_to_send all, text, link, photo, doc, video, music, polls Какие типы вложений отправлять. Подробнее в config.yaml.example. По умолчанию отправляются все вложения.
stop_list Абсолютный путь к файлу, содержащий стоп-слова (в файле должно быть по одному слову на каждой строке). Если вы не хотите использовать стоп-слова удалите этот параметр из файла конфигурации
blacklist Абсолютный путь к файлу, содержащий слова, которые будут удалены из текста отправляемого поста. Поддерживаются регулярные выражения.
disable_notification true, false Отправляет сообщения молча. Пользователи получат уведомление без звука. По умолчанию: false
disable_web_page_preview true, false Отключить предпросмотр ссылок в сообщениях. По умолчанию: true
posts_count Количество отправляемых ботом новых постов за раз. По умолчанию 11.
header Текст с форматированием Markdown Текст, который будет добавлен в начало сообщения
footer Текст с форматированием Markdown Текст, который будет добавлен в конец сообщения

Все параметры ключа settings могут быть заданы индивидуально для каждой группы

Отчеты об ошибках и предложения отправлять в:

Для пожертвований на развитие проекта:

  1. Qiwi
  2. Bitcoin: 1H1UVnXgvcLo3RWmxuYmi7b16ADo6XBWw5
  3. TON: EQD42Z5d8d1gT1uSpKTAaLYHlQ95vdMXrlNlYMpSFpQawwuY

Источник

Оцените статью