Telegram бот пересылки сообщений из RSS канала
В этой статье разберем, как написать простого Python-бота, который будет брать новые записи из RSS-ленты и автоматически отправлять их в Telegram-канал.
Такой бот может пригодиться для автоматической публикации новостей, статей блога, обновлений сайта или любых других материалов, которые доступны через RSS.
Регистрация Telegram-бота через BotFather
Для начала нужно зарегистрировать нового бота в Telegram.
Добавляем в контакты официального бота @BotFather и отправляем ему команду:
/newbot
В ответ BotFather попросит придумать имя для бота:
Alright, a new bot. How are we going to call it? Please choose a name for your bot.
После этого вводим название бота.
Далее BotFather попросит указать username:
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.
Username обязательно должен заканчиваться на bot.
После успешной регистрации вы получите токен для доступа к Telegram Bot API.
Use this token to access the HTTP API: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Важно: никому не передавайте токен бота. Зная токен, можно полностью управлять вашим Telegram-ботом.
Добавление бота в канал Telegram
После регистрации нужно добавить бота в Telegram-канал или группу, куда он будет публиковать сообщения из RSS.
Если бот должен публиковать записи в канал, не забудьте выдать ему права администратора на отправку сообщений.
Файл настроек settings.ini
Создадим файл settings.ini,
в котором будут храниться настройки RSS-ленты и Telegram-бота:
[RSS]
feed = https://lenta.ru/rss
datetime = 2019-06-17 04:21:00 +03:00
[Telegram]
bot_token = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
channel = @xxxxxxx
В этом файле:
feed— адрес RSS-ленты;datetime— дата и время последней опубликованной записи;bot_token— токен Telegram-бота;channel— Telegram-канал для публикации сообщений.
Установка необходимых библиотек
Для работы бота понадобятся библиотеки feedparser и pyTelegramBotAPI.
Устанавливаем их через pip:
pip install feedparser
pip install pyTelegramBotAPI
Импорт библиотек
Создаем файл main.py и подключаем необходимые библиотеки:
import feedparser
import datetime
import telebot
import configparser
import urllib.request
import urllib.parse
import urllib.error
Чтение настроек из settings.ini
Теперь считаем настройки из файла:
# Считываем настройки
config = configparser.ConfigParser()
config.read('settings.ini')
FEED = config.get('RSS', 'feed')
DATETIME = config.get('RSS', 'datetime')
BOT_TOKEN = config.get('Telegram', 'bot_token')
CHANNEL = config.get('Telegram', 'channel')
Получение RSS-ленты
Получаем данные из RSS:
rss = feedparser.parse(FEED)
Инициализация Telegram-бота
Создаем объект Telegram-бота:
bot = telebot.TeleBot(BOT_TOKEN)
Проверка новых записей в RSS
Далее запускаем цикл по записям RSS-ленты. В примере записи перебираются в обратном порядке, чтобы сначала отправлялись более старые публикации.
for post in reversed(rss.entries):
data = post.published
time = datetime.datetime.strptime(
data,
'%a, %d %b %Y %H:%M:%S %z'
)
time_old = config.get('RSS', 'datetime')
time_old = datetime.datetime.strptime(
time_old,
'%Y-%m-%d %H:%M:%S %z'
)
В разных RSS-лентах формат даты может отличаться.
Если скрипт выдает ошибку на строке с strptime,
нужно изменить формат даты под вашу RSS-ленту.
Пропуск уже опубликованных записей
Чтобы бот не отправлял одни и те же записи повторно, сравниваем дату текущего поста с датой последней публикации.
if time <= time_old:
continue
else:
config.set('RSS', 'datetime', str(time))
with open('settings.ini', 'w') as config_file:
config.write(config_file)
print('---------------------------------')
print(time)
Получение данных из RSS-записи
Получаем заголовок публикации:
text = post.title
print(text)
Получаем изображение:
img = post.links[1].href
print(img)
Получаем ссылку на публикацию:
link = post.links[0].href
print(link)
Скачивание изображения
Скачиваем картинку во временный файл:
urllib.request.urlretrieve(img, 'img.jpg')
Отправка сообщения в Telegram
Отправляем изображение и ссылку на запись в Telegram-канал:
bot.send_photo(CHANNEL, open('img.jpg', 'rb'))
bot.send_message(
CHANNEL,
'<a href="' + link + '">' + text + '</a>',
parse_mode='HTML'
)
Полный цикл обработки RSS
for post in reversed(rss.entries):
data = post.published
time = datetime.datetime.strptime(
data,
'%a, %d %b %Y %H:%M:%S %z'
)
time_old = config.get('RSS', 'datetime')
time_old = datetime.datetime.strptime(
time_old,
'%Y-%m-%d %H:%M:%S %z'
)
print(time)
print(time_old)
# Пропускаем уже опубликованные посты
if time <= time_old:
continue
else:
# Записываем время и дату нового поста в файл
config.set('RSS', 'datetime', str(time))
with open('settings.ini', 'w') as config_file:
config.write(config_file)
print('---------------------------------')
print(time)
# Получаем заголовок поста
text = post.title
print(text)
# Получаем картинку
img = post.links[1].href
print(img)
# Получаем ссылку на пост
link = post.links[0].href
print(link)
# Скачиваем картинку
urllib.request.urlretrieve(img, 'img.jpg')
# Отправляем картинку и текстовое описание в Telegram
bot.send_photo(CHANNEL, open('img.jpg', 'rb'))
bot.send_message(
CHANNEL,
'<a href="' + link + '">' + text + '</a>',
parse_mode='HTML'
)
Репозиторий с кодом
Полный код бота можно посмотреть в моем репозитории на GitHub:
https://github.com/Nikovit/bot_rss_to_telegram
Итог
В результате получается простой Telegram-бот, который читает RSS-ленту, проверяет новые публикации и отправляет их в Telegram-канал.
Такой скрипт можно запускать вручную, по cron или через systemd timer, чтобы публикации из RSS автоматически появлялись в Telegram.
Комментарии