Buyrun daha önce hazırlamıştım. İstediğiniz yapay zeka ile geliştirebilirsiniz. from abc import ABC, abstractmethod
import feedparser
from datetime import datetime
import logging
from typing import Dict, List, Optional
import json
import os
class NewsSource(ABC):
@abstractmethod
def get_news(self, category: str) -> List[dict]:
pass
@abstractmethod
def get_categories(self) -> List[str]:
pass
class BBCNews(NewsSource):
def __init__(self):
self.rss_feeds = {
"world": "http://feeds.bbci.co.uk/news/world/rss.xml",
"technology": "http://feeds.bbci.co.uk/news/technology/rss.xml",
"business": "http://feeds.bbci.co.uk/news/business/rss.xml",
"health": "http://feeds.bbci.co.uk/news/health/rss.xml",
"science": "http://feeds.bbci.co.uk/news/science_and_environment/rss.xml",
"sport": "http://feeds.bbci.co.uk/sport/rss.xml",
"entertainment": "http://feeds.bbci.co.uk/news/entertainment_and_arts/rss.xml",
}
def get_categories(self) -> List[str]:
return list(self.rss_feeds.keys())
def get_news(self, category: str = "world") -> List[dict]:
if category not in self.rss_feeds:
raise ValueError(f"Geçersiz kategori. Mevcut kategoriler: {', '.join(self.get_categories())}")
feed = feedparser.parse(self.rss_feeds[category])
return [
{
'title': entry.title,
'summary': entry.summary,
'link': entry.link,
'published': datetime.strptime(entry.published, "%a, %d %b %Y %H:%M:%S %Z"),
}
for entry in feed.entries[:10]
]
class NewsFormatter:
@staticmethod
def format_news(news: dict) -> str:
formatted_date = news['published'].strftime("%Y-%m-%d %H:%M:%S")
return (
f"🕒 {formatted_date}\n"
f"🔹 {news['title']}\n"
f" {news['summary']}\n"
f" 🌍 Kaynak: {news['link']}\n"
f"{'-' * 50}"
)
class NewsManager:
def __init__(self, news_source: NewsSource):
self.news_source = news_source
self.formatter = NewsFormatter()
self.logger = self._setup_logger()
def _setup_logger(self) -> logging.Logger:
logger = logging.getLogger('HaberBot')
logger.setLevel(logging.INFO)
if not logger.handlers:
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
def display_news(self, category: str = "world"):
try:
self.logger.info(f"{category.upper()} kategorisi için haberler getiriliyor...")
print(f"\n📢 BBC News - {category.upper()} Kategorisi 📢\n" + "=" * 50)
news_list = self.news_source.get_news(category)
for news in news_list:
print(self.formatter.format_news(news))
except Exception as e:
self.logger.error(f"Haber alınırken hata oluştu: {str(e)}")
print(f"❌ Hata: {str(e)}")
class NewsBot:
def __init__(self):
self.news_manager = NewsManager(BBCNews())
self.settings = self._load_settings()
def _load_settings(self) -> dict:
if os.path.exists('settings.json'):
with open('settings.json', 'r', encoding='utf-8') as f:
return json.load(f)
return {'default_category': 'world'}
def run(self):
print("🤖 HaberBot'a Hoş Geldiniz! 🤖")
print("\nMevcut kategoriler:")
categories = self.news_manager.news_source.get_categories()
print(", ".join(categories))
while True:
category = input("\nHangi kategori? (çıkış için 'q'): ").strip().lower()
if category == 'q':
print("\n👋 HaberBot'u kullandığınız için teşekkürler!")
break
if category in categories:
self.news_manager.display_news(category)
else:
print("❌ Geçersiz kategori! Lütfen listeden bir kategori seçin.")
def main():
bot = NewsBot()
bot.run()
if __name__ == "__main__":
main()