Исправлены все основные проблемы: - Исправлена логика фильтрации сообщений по топикам в 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>
100 lines
3.8 KiB
Python
Executable File
100 lines
3.8 KiB
Python
Executable File
#!/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() |