Завершение модульной рефакторизации и исправления

Исправлены все основные проблемы:
- Исправлена логика фильтрации сообщений по топикам в 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:
2025-08-11 15:11:39 +03:00
parent 188acdd812
commit 845f96209d
15 changed files with 569071 additions and 1 deletions

100
news-bot-modular.py Executable file
View 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()