Отправляем новые статьи из РСС в телеграм

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

Евгений Гончаров, в статье «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()
Отправить
Поделиться
Твитнуть
Запинить