From 073fa1112759dbfd9223b96570247441675e2006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=A5=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=BE=D0=B2?= Date: Wed, 20 Aug 2025 15:33:53 +0300 Subject: [PATCH] =?UTF-8?q?-=20=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20=D0=B4=D1=83=D0=B1=D0=BB=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20telegram?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 102 ++++++++++++++++++++++++++++++++++++++++++--- telegram_client.py | 97 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 176 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index e36efdc..e1573ed 100644 --- a/README.md +++ b/README.md @@ -123,18 +123,54 @@ print("Discord:", bot.discord_client.is_enabled()) bot.start() ``` -## πŸ›  Π£Ρ‚ΠΈΠ»ΠΈΡ‚Ρ‹ +## ⚑ БыстрыС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ -### ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° ΠΊΠ°Π½Π°Π»ΠΎΠ² ```bash -python3 del-tests.py +# Полная пСрСустановка +rm -rf venv keys.py *.session +bash setup_venv.sh +cp keys_example.py keys.py + +# ОбновлСниС зависимостСй +source venv/bin/activate +pip install --upgrade -r requirements.txt + +# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° всСх ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ +python3 -c "from news_bot_modular import NewsBot; bot = NewsBot(); print('βœ“ ВсС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ')" ``` -УдаляСт всС сообщСния ΠΈΠ· всСх настроСнных ΠΊΠ°Π½Π°Π»ΠΎΠ². -### ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° синтаксиса +## πŸ›  Π£Ρ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΈ скрипты + +### Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΠΎΡ‚ΠΎΠΌ ```bash +# Запуск Π±ΠΎΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ +bash run_bot.sh + +# ΠŸΡ€ΡΠΌΠΎΠΉ запуск (Ссли venv Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ) +python3 news-bot-modular.py + +# БистСмная установка ΠΊΠ°ΠΊ сСрвис +bash install-service.sh + +# Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сСрвисом +bash service-control.sh start # Запуск +bash service-control.sh stop # ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° +bash service-control.sh restart # ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊ +bash service-control.sh status # Бтатус +``` + +### ΠžΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Π½ΠΈΠ΅ +```bash +# ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΎΡ‚ тСстовых сообщСний +python3 del-tests.py + +# ΠŸΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ окруТСния +rm -rf venv +bash setup_venv.sh + +# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° синтаксиса python3 -m py_compile news-bot-modular.py -python3 -m py_compile content_processor.py +python3 -m py_compile telegram_client.py ``` ## πŸ› ΠžΡ‚Π»Π°Π΄ΠΊΠ° @@ -146,6 +182,60 @@ python3 -m py_compile content_processor.py - πŸ”΄ ERROR - ошибки - βšͺ CRITICAL - критичСскиС ошибки +## πŸš€ Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Π½Π° сСрвСрС + +### БыстроС Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ +```bash +# 1. ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСпозитория +git clone +cd bot-news-linux-gaming + +# 2. АвтоматичСская установка +bash setup_venv.sh + +# 3. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ +cp keys_example.py keys.py +nano keys.py # Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ всС API ΠΊΠ»ΡŽΡ‡ΠΈ + +# 4. ВСстовый запуск +bash run_bot.sh +``` + +### Установка ΠΊΠ°ΠΊ систСмный сСрвис +```bash +# ПослС настройки ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ +bash install-service.sh + +# Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сСрвисом +sudo systemctl start bot-news-linux-gaming +sudo systemctl enable bot-news-linux-gaming # Автозапуск +sudo systemctl status bot-news-linux-gaming # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° статуса + +# ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π»ΠΎΠ³ΠΎΠ² +journalctl -u bot-news-linux-gaming -f +``` + +### ВрСбования ΠΊ сСрвСру +- **ОБ**: Ubuntu 20.04+ / Debian 11+ +- **Python**: 3.8+ +- **ΠŸΠ°ΠΌΡΡ‚ΡŒ**: ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 512MB RAM +- **Диск**: 100MB свободного мСста +- **Π‘Π΅Ρ‚ΡŒ**: доступ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Ρƒ для API запросов + +## πŸ”§ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Ρ‚ΠΎΠΏΠΈΠΊΠΎΠ² Telegram + +Для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ Ρ‚ΠΎΠΏΠΈΠΊΠ΅ супСргруппы: + +```python +# Π’ Ρ„Π°ΠΉΠ»Π΅ keys.py Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ: +telegram_topic_id = 123456 # ID ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ сообщСния Ρ‚ΠΎΠΏΠΈΠΊΠ° +``` + +ID Ρ‚ΠΎΠΏΠΈΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ: +1. ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Ρ‚ΠΎΠΏΠΈΠΊ супСргруппы +2. Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ссылку Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠ΅ сообщСниС Ρ‚ΠΎΠΏΠΈΠΊΠ° +3. ID Π±ΡƒΠ΄Π΅Ρ‚ Π² ΠΊΠΎΠ½Ρ†Π΅ ссылки: `/c/channel_id/topic_id` + ## πŸ“ ЛицСнзия Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ являСтся частной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ новостСй Linux Gaming. \ No newline at end of file diff --git a/telegram_client.py b/telegram_client.py index aa09f02..048b11e 100644 --- a/telegram_client.py +++ b/telegram_client.py @@ -31,17 +31,7 @@ class TelegramNewsClient: if message.text: # Если ΡƒΠΊΠ°Π·Π°Π½ Ρ‚ΠΎΠΏΠΈΠΊ, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сообщСния ΠΈΠ· этого Ρ‚ΠΎΠΏΠΈΠΊΠ° if self.config['topic_id']: - is_in_topic = False - - # Π’ Telegram Ρ‚ΠΎΠΏΠΈΠΊΠ°Ρ… всС сообщСния ΠΈΠΌΠ΅ΡŽΡ‚ reply_to_msg_id Ρ€Π°Π²Π½Ρ‹ΠΉ ID ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ сообщСния Ρ‚ΠΎΠΏΠΈΠΊΠ° - if hasattr(message, 'reply_to_msg_id') and message.reply_to_msg_id: - # Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ‚ΠΎΠΏΠΈΠΊΡƒ Ссли Π΅Π³ΠΎ reply_to_msg_id Ρ€Π°Π²Π΅Π½ topic_id - if message.reply_to_msg_id == self.config['topic_id']: - is_in_topic = True - - # Π’Π°ΠΊΠΆΠ΅ провСряСм, Ссли само сообщСниС являСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ сообщСниСм Ρ‚ΠΎΠΏΠΈΠΊΠ° - elif message.id == self.config['topic_id']: - is_in_topic = True + is_in_topic = self._is_message_in_topic(message, self.config['topic_id']) self.logger.debug(f"Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ID {message.id}, reply_to_msg_id={getattr(message, 'reply_to_msg_id', None)}, Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠΏΠΈΠΊ {self.config['topic_id']}, Π² Ρ‚ΠΎΠΏΠΈΠΊΠ΅: {is_in_topic}") @@ -57,9 +47,82 @@ class TelegramNewsClient: if title: titles.append(title) - self.logger.debug(f"Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΎ {len(titles)} Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΈΠ· Telegram сообщСний") + self.logger.info(f"Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΎ {len(titles)} Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΈΠ· Telegram сообщСний: {titles[:5]}{'...' if len(titles) > 5 else ''}") return messages, titles + def _is_message_in_topic(self, message, topic_id): + """ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° принадлСТности сообщСния ΠΊ Ρ‚ΠΎΠΏΠΈΠΊΡƒ с ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ""" + # Π‘Π°ΠΌΠΎ сообщСниС являСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ сообщСниСм Ρ‚ΠΎΠΏΠΈΠΊΠ° + if message.id == topic_id: + return True + + # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ прямой ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° сообщСниС Ρ‚ΠΎΠΏΠΈΠΊΠ° + if hasattr(message, 'reply_to_msg_id') and message.reply_to_msg_id: + if message.reply_to_msg_id == topic_id: + return True + + # Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°: ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ это ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ΠΎΡ‚Π²Π΅Ρ‚ Π² Ρ‚ΠΎΠΏΠΈΠΊΠ΅ + # Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Telegram API ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ структуру + try: + # ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ сообщСнии, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π»ΠΈ + reply_to = message.reply_to + if reply_to and hasattr(reply_to, 'reply_to_msg_id'): + # РСкурсивно провСряСм Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² + current_reply_id = reply_to.reply_to_msg_id + depth = 0 + while current_reply_id and depth < 10: # ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ для бСзопасности + if current_reply_id == topic_id: + return True + # Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ случаС здСсь Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сообщСниС ΠΏΠΎ ID + # Но это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слишком Π΄ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎ API запросам + break + except Exception as e: + self.logger.debug(f"Ошибка ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ структуры ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²: {e}") + + return False + + def _check_duplicate_news(self, topic_title, tg_titles, tg_messages): + """Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² новостСй с Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ""" + # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ совпадСниС с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ + title_exists = topic_title in tg_titles + if title_exists: + self.logger.debug(f"НайдСно Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ совпадСниС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°: '{topic_title}'") + return True + + # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ частичныС совпадСния Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ… (Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅) + normalized_topic = topic_title.lower().strip() + for existing_title in tg_titles: + normalized_existing = existing_title.lower().strip() + if normalized_topic == normalized_existing: + self.logger.debug(f"НайдСно Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ совпадСниС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°: '{topic_title}' == '{existing_title}'") + return True + + # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΊΠ°ΠΊ части структурированного сообщСния + # Π˜Ρ‰Π΅ΠΌ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ совпадСниС Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ "### Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ\t" + formatted_title = f"### {topic_title}\t" + for message in tg_messages: + if message and formatted_title in message: + self.logger.debug(f"НайдСно совпадСниС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π² сообщСнии: '{formatted_title}'") + return True + + # Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°: ΠΈΡ‰Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π² Π½Π°Ρ‡Π°Π»Π΅ сообщСний + for message in tg_messages: + if message: + message_lines = message.strip().split('\n') + if message_lines: + first_line = message_lines[0].strip() + # Π£Π±ΠΈΡ€Π°Π΅ΠΌ прСфиксы ΠΈ сравниваСм + import re + cleaned_first_line = re.sub(r'^[#*\s\t]+', '', first_line) + cleaned_first_line = re.sub(r'\t.*$', '', cleaned_first_line).strip() + + if cleaned_first_line.lower() == normalized_topic: + self.logger.debug(f"НайдСно совпадСниС Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС сообщСния: '{cleaned_first_line}' == '{topic_title}'") + return True + + self.logger.debug(f"ΠΠΎΠ²ΠΎΡΡ‚ΡŒ '{topic_title}' Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π° срСди {len(tg_titles)} ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²") + return False + def _extract_title_from_message(self, message_text): """Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈΠ· тСкста сообщСния""" import re @@ -180,14 +243,14 @@ class TelegramNewsClient: # Π€ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅ΠΌ новости для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ list_for_public = [] for topic_id, topic_title in news_list: - # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΏΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ ΠΈ ΠΏΠΎ ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ тСксту сообщСний - title_exists = any(topic_title == title for title in tg_titles) - text_contains = any(topic_title in (msg or '') for msg in tg_messages) + # Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² + is_duplicate = self._check_duplicate_news(topic_title, tg_titles, tg_messages) - if not title_exists and not text_contains: + if not is_duplicate: list_for_public.append((topic_id, topic_title)) + self.logger.debug(f"ΠΠΎΠ²ΠΎΡΡ‚ΡŒ '{topic_title}' Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² список для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ") else: - self.logger.debug(f"ΠΠΎΠ²ΠΎΡΡ‚ΡŒ '{topic_title}' ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π² Telegram (title_exists={title_exists}, text_contains={text_contains})") + self.logger.debug(f"ΠΠΎΠ²ΠΎΡΡ‚ΡŒ '{topic_title}' ΡƒΠΆΠ΅ сущСствуСт Π² Telegram, пропускаСм") if not list_for_public: self.logger.warning("НовостСй для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² Telegram Π½Π΅Ρ‚")