Telegram RSS Botu

Bu Python projesi, bir RSS beslemesinden haberleri çekip bir Telegram kanalında paylaşan bir bot sunar.

Özellikler

- Belirtilen bir RSS URL'sinden yeni içerikleri çeker.
- Daha önce gönderilen haber bağlantılarını kaydeder ve tekrar paylaşmaz.
- Hataları log dosyasına kaydeder.
- Kullanıcı dostu ve özelleştirilebilir.


Gereksinimler

- Python 3.9 veya daha yeni bir sürüm
- Aşağıdaki Python kütüphanelerinin kurulu olması gerekir:
  - asyncio
  - feedparser
  - python-telegram-bot

Kurulumu aşağıdaki kodu terminale yapıştırarak gerçekleştirebilirsiniz:

pip install feedparser python-telegram-bot

 

import asyncio
import feedparser
import json
from datetime import datetime
from telegram import Bot
# Bot Token alanı
BOT_TOKEN = "Telegram Bot TOKEN yeri"
CHANNEL_USERNAME = "@telegramkanalı"

# RSS alanı
RSS_URL = "https://example.com/rss"

SENT_LINKS_FILE = "sent_links.json"
ERROR_LOG_FILE = "error_log.txt"

bot = Bot(token=BOT_TOKEN)

bot_status = "Bot çalışıyor"  

def log_error(error_message):
    """Hataları log dosyasına yazar."""
    with open(ERROR_LOG_FILE, "a") as file:
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        file.write(f"[{timestamp}] {error_message}\n")
    print(f"[{timestamp}] Hata loglandı: {error_message}")

def load_sent_links():
    """Daha önce gönderilen haber bağlantılarını dosyadan yükler."""
    try:
        with open(SENT_LINKS_FILE, "r") as file:
            return json.load(file)
    except FileNotFoundError:
        return []  
    except json.JSONDecodeError:
        log_error("Gönderilen haber dosyası bozuk. Liste sıfırlandı.")
        return []  

def save_sent_links(sent_links):
    """Gönderilen haber bağlantılarını dosyaya kaydeder."""
    with open(SENT_LINKS_FILE, "w") as file:
        json.dump(sent_links, file)

async def fetch_rss():
    """RSS beslemesinden yeni haberleri alır."""
    feed = feedparser.parse(RSS_URL)
    new_entries = []
    for entry in feed.entries:
        if entry.link not in sent_links:
            new_entries.append((entry.title, entry.link))
            sent_links.append(entry.link)  
    save_sent_links(sent_links)
    return new_entries

async def send_to_channel(entries):
    """Kanalda yeni haberleri paylaşır."""
    for entry in entries:
        title, link = entry
        message = f"📰 *{title}*\n \n({link})"
        await bot.send_message(chat_id=CHANNEL_USERNAME, text=message, parse_mode="Markdown")

async def main():
    """Botun ana işleyiş döngüsü."""
    global sent_links, bot_status
    sent_links = load_sent_links()  
    error_logged = False  

    while True:
        try:
            bot_status = "Bot çalışıyor"
            print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {bot_status}")
            new_entries = await fetch_rss()
            if new_entries:
                await send_to_channel(new_entries)
            await asyncio.sleep(30)  
        except Exception as e:
            bot_status = "Bot hataya düştü"
            print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {bot_status}: {e}")
            if not error_logged:
                log_error(str(e))
                error_logged = True  
            await asyncio.sleep(60) 
        finally:
            bot_status = "Bot çalışmıyor"
            print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {bot_status}")

if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("Bot manuel olarak durduruldu.")