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

Telegram бот пересылки сообщений из RSS канала

Telegram бот пересылки сообщений из RSS канала

В этой статье разберем, как написать простого Python-бота, который будет брать новые записи из RSS-ленты и автоматически отправлять их в Telegram-канал.

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

Бот для отправки RSS в Telegram

Регистрация 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.

26 просмотров

Комментарии

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