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.")