Николаев Виталий
<Разработка сайтов>

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

python_and_rss.png

Сегодня мы напишем бота пересылки сообщений из RSS ленты в канал telegram.[spoiler]

Для начала нужно зарегистрировать бота в telegram.

Добавляем в список контактов @BotFather

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

Получаем в ответ сообщение:
Alright, a new bot. How are we going to call it? Please choose a name for your bot.
Придумываем имя боту.


Получаем в ответ сообщение:
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'


Получаем в ответ сообщение:
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.

Все, бот зарегистрирован, самое важное это последние сообщение с токеном бота, ни кому не сообщайте его т.к. зная токен можно полностью управлять ботом.
Done! Congratulations on your new bot. You will find it at t.me/XXXXbot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
For a description of the Bot API, see this page:
https://core.telegram.org/bots/api

Долее создаем новую группу или в уже существующую добавляем бота поиском по имени которое указывали ранее.


Переходим к написанию бота.

Для начала создадим и заполним файл settings.ini в котором будем хранить настройки нашего бота.
[RSS]
feed = https://lenta.ru/rss
datetime = 2019-06-17 04:21:00 +03:00

[Telegram]
bot_token = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
channel = @xxxxxxx
В этом примере источник feed - RSS https://lenta.ru/rss
datetime - строка для хранения даты и времени последнего полученного сообщения RSS
bot_token - токен бота полученного ранее
channel - ваш канал в телеграмме в который будут отправляться сообщения из RSS.

Для начала нам понадобятся стандартные библиотеки, datetime, configparser и urllib

И несколько библиотек не входящих в стандартную поставку python - feedparser и telebot

Установим недостающие библиотеки, в консоли пишем следующие команды:
pip install feedparser
pip install pyTelegramBotAPI

Создаем файл main.py и в самом начале файла импортируем нужные библиотеки:
import feedparser
import datetime
import telebot
import configparser
import urllib.request, urllib.parse, 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 = feedparser.parse(FEED)

Инициализируем телеграмм бота
bot = telebot.TeleBot(BOT_TOKEN)

Запускаем основной цикл получения сообщений RSS и проверяем дату сообщений, в вашем источнике RSS формат даты может отличаться, поэтому в строке time = datetime.datetime.strptime(data, '%a, %d %b %Y %H:%M:%S %z') подставьте свои параметры, все параметры для работы с датой можно посмотреть тут
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')

Пропускаем уже опубликованные посты, если пост не был опубликован - то записываем дату и время поста в файл:
# Пропускаем уже опубликованные посты
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')

Цикл получения и отправки из RSS ленты в Telegram полностью:
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')

Вот и все, бот для отправки из RSS в Telegram готов.

Полный код бота вы можите посмотреть в моем репозитории на github

0
Артем
25.09.2022 19:45:45
Здравствуйте!
Подскажите, что не так:
Traceback (most recent call last):
 File "C:\Python\rumotos_bot\bot.py", line 49, in <module>
   img = post.links[1].href
IndexError: list index out of range

И почему он дату меняет на 16 сентября?!