Files
bot-news-linux-gaming/news-bot-modular.py
Евгений (ХрамычЪ) Храмов 845f96209d Завершение модульной рефакторизации и исправления
Исправлены все основные проблемы:
- Исправлена логика фильтрации сообщений по топикам в 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>
2025-08-11 15:11:39 +03:00

100 lines
3.8 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()