Отправляем новые статьи из РСС в телеграм
Удобно присылать новые ссылки на статьи моих подписок РСС в телеграм, так как вся коммуникация уже в нем, фидли почти не использую.
Евгений Гончаров, в статье «RSS фидер на Python с оправкой уведомлений в Телеграм» описал весь принцип отправки и использование базы данных для контроля что отправили. Готовый код на гитхабе Евгения
Я внес небольшие изменения в код:
- Сообщения в телеграм отправляются с задержкой 1 секунда. Если не использовать таймаут, сервер телеграма, может отправить не все сообщения.
- Изменил вид отправки сообщений: добавил переносы строк и автора, если он есть.
В канал телеграма приходят новые сообщения. Проверка РСС проходит с 7 утра до 11 вечера, с интервалом 30 минут.
Канал открытый, можно подписаться на «Почитаем», там 95 источников РСС: например, избранное блогов на Эгее, Илья Бирман, Максим Ильяхов, Николай Товеровский, и другие.
В примере скрипта: блоги на Эгее и мой блог.
Скрипт:
#!/usr/bin/python3
# Created by Yevgeniy Goncharov, https://sys-adm.in
# Script for reading and forwarding to Telegram, rss feeds
# Imports
import sqlite3
import requests
import feedparser
import os
import urllib
import random
import time
# Bot creds
bot_token = 'bot_token'
bot_chatID = 'bot_chatID'
# Feeds
myfeeds = [
'https://blogengine.ru/blogs/rss/',
'http://blog.fossko.ru/rss/',
]
# User agents
uags = [
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
]
# Random User Agent (from uags list)
ua = random.choice(uags)
# Header
headers = {
"Connection" : "close", # another way to cover tracks
"User-Agent" : ua
}
# Proxies
proxies = {
}
# DB
scriptDir = os.path.dirname(os.path.realpath(__file__))
db_connection = sqlite3.connect(scriptDir + '/rss.sqlite')
db = db_connection.cursor()
db.execute('CREATE TABLE IF NOT EXISTS myrss (title TEXT, date TEXT)')
# Get posts from DB and print
def get_posts():
with db_connection:
db.execute("SELECT * FROM myrss")
# print(db.fetchall())
# Check post in DB
def article_is_not_db(article_title, article_date):
db.execute("SELECT * from myrss WHERE title=? AND date=?", (article_title, article_date))
if not db.fetchall():
return True
else:
return False
# Add post to DB
def add_article_to_db(article_title, article_date):
db.execute("INSERT INTO myrss VALUES (?,?)", (article_title, article_date))
db_connection.commit()
# Send notify to Telegram bot
def bot_sendtext(bot_message):
#bot_message = urllib.parse.quote(bot_message)
bot_message = bot_message
send_text = 'https://api.telegram.org/bot' + bot_token + '/sendMessage?chat_id=' + bot_chatID + '&parse_mode=Markdown&text=' + bot_message
requests.get(send_text, proxies=proxies, headers=headers)
print(send_text)
# Check, read articles
def read_article_feed(feed):
""" Get articles from RSS feed """
feedparser.USER_AGENT = ua
feed = feedparser.parse(feed)
print(feed)
for article in feed['entries']:
if article_is_not_db(article['title'], article['published']):
add_article_to_db(article['title'], article['published'])
# bot_sendtext('New feed found ' + article['title'] +', ' + article['link'] + ', ' + article['description'])
try:
rss_autor = article['author'] +'%0A%0A'
except:
rss_autor = ""
MSGsend='*'+ article['title'] + '*%0A%0A' + rss_autor + article['link']
MSGsend=MSGsend.replace("_", "\_") # замена подчеркивания для отправки в ТГ
bot_sendtext(MSGsend)
time.sleep(1)
# print(article)
# Rotate feeds array
def spin_feds():
for x in myfeeds:
# print(x)
read_article_feed(x)
# Runner :)
if __name__ == '__main__':
spin_feds()
# get_posts()
db_connection.close()