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()