Завершение модульной рефакторизации и исправления
Исправлены все основные проблемы: - Исправлена логика фильтрации сообщений по топикам в Telegram - Исправлен бесконечный цикл в VK клиенте get_wall_posts() - Добавлена асинхронная поддержка для VK в главном файле - Дедупликация работает корректно для всех платформ - Добавлена полная документация в CLAUDE.md и README.md 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
100
news-bot-modular.py
Executable file
100
news-bot-modular.py
Executable file
@@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import asyncio
|
||||
import schedule
|
||||
import time
|
||||
|
||||
from logger import setup_logger
|
||||
from config import DISCORD_CONFIG
|
||||
from content_processor import ContentProcessor
|
||||
from site_api import SiteAPI
|
||||
from telegram_client import TelegramNewsClient
|
||||
from vk_client import VKClient
|
||||
from discord_client import DiscordClient
|
||||
|
||||
|
||||
class NewsBot:
|
||||
def __init__(self):
|
||||
self.logger = setup_logger()
|
||||
self.content_processor = ContentProcessor()
|
||||
self.site_api = SiteAPI()
|
||||
self.telegram_client = TelegramNewsClient(self.content_processor)
|
||||
self.vk_client = VKClient(self.content_processor)
|
||||
self.discord_client = DiscordClient(self.content_processor)
|
||||
|
||||
self.logger.info("Бот инициализирован с модульной архитектурой")
|
||||
if DISCORD_CONFIG['enabled']:
|
||||
self.logger.info("Discord функциональность включена")
|
||||
else:
|
||||
self.logger.info("Discord функциональность отключена")
|
||||
|
||||
async def run_job(self):
|
||||
"""Основная задача бота"""
|
||||
self.logger.info("Запуск основной задачи бота")
|
||||
|
||||
try:
|
||||
# Проверка и публикация новых версий скриптов
|
||||
self.site_api.check_script_versions(self.content_processor)
|
||||
|
||||
# Получение списка новостей
|
||||
news_list = self.site_api.get_news()
|
||||
|
||||
if news_list:
|
||||
self.logger.info(f"Получено {len(news_list)} новостей для обработки")
|
||||
|
||||
# Публикация в Telegram
|
||||
if self.telegram_client.is_enabled():
|
||||
await self.telegram_client.check_and_publish_news(news_list)
|
||||
|
||||
# Публикация в VK
|
||||
if self.vk_client.is_enabled():
|
||||
await asyncio.get_event_loop().run_in_executor(
|
||||
None, self.vk_client.check_and_publish_news, news_list
|
||||
)
|
||||
|
||||
# Публикация в Discord (если включен)
|
||||
if self.discord_client.is_enabled():
|
||||
await self.discord_client.check_and_publish_news(news_list)
|
||||
else:
|
||||
self.logger.warning("Новостей для обработки не найдено")
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Ошибка в основной задаче бота: {e}")
|
||||
|
||||
def run_sync_job(self):
|
||||
"""Синхронная обертка для планировщика"""
|
||||
asyncio.run(self.run_job())
|
||||
|
||||
def start(self):
|
||||
"""Запуск бота"""
|
||||
self.logger.info("Запуск новостного бота")
|
||||
|
||||
# Выполнение задачи при старте
|
||||
self.logger.info("Выполнение первоначальной задачи...")
|
||||
self.run_sync_job()
|
||||
|
||||
# Планирование периодического выполнения
|
||||
schedule.every(30).minutes.do(self.run_sync_job)
|
||||
|
||||
self.logger.info("Запуск планировщика задач (каждые 30 минут)")
|
||||
|
||||
# Основной цикл
|
||||
while True:
|
||||
schedule.run_pending()
|
||||
time.sleep(5)
|
||||
|
||||
|
||||
def main():
|
||||
"""Точка входа в приложение"""
|
||||
bot = NewsBot()
|
||||
|
||||
try:
|
||||
bot.start()
|
||||
except KeyboardInterrupt:
|
||||
bot.logger.info("Бот остановлен пользователем")
|
||||
except Exception as e:
|
||||
bot.logger.error(f"Критическая ошибка бота: {e}")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Reference in New Issue
Block a user