Вобщем софт должен в супергруппах которые привязаны к каналу отслеживать сообщения от имени канала и отвечать на них используя текст из text.txt . И по итогу это все должно выглядеть как комент к посту в канале. Нахожусь и в канале и в его дискуссии. Выходит пост, софт его не видит попросту. async def monitor_supergroups_async(): """Мониторинг супергрупп.""" global stop_thread # Загрузка текста спама spam_text = load_spam_text('text.txt') # Получение ID супергрупп и каналов supergroups_and_channels = await get_supergroups_and_channels() while not stop_thread: for supergroup_id, channel_id in supergroups_and_channels: try: # Получение последнего сообщения в канале channel_messages = await client.get_messages(channel_id, limit=1) if channel_messages: last_channel_message = channel_messages[0] # Получение сообщений в супергруппе supergroup_messages = await client.get_messages(supergroup_id, limit=10) for message in supergroup_messages: if message.post and message.post.channel_id == channel_id: # Отправка комментария в супергруппу await client.send_message(supergroup_id, spam_text, reply_to=message.id) channel_entity = await client.get_entity(channel_id) print( f"Спам был выложен в супергруппе обсуждения канала {channel_entity.title} (ID: {channel_id})") except Exception as e: print(f"Ошибка при обработке супергруппы {supergroup_id}: {e}") await asyncio.sleep(1) async def get_supergroups_and_channels(): """Получение ID супергрупп и каналов.""" try: # Получение диалогов dialogs = await client.get_dialogs(limit=1000) supergroups_and_channels = [] for dialog in dialogs: if dialog.is_channel and dialog.entity.megagroup: # Получение информации о супергруппе supergroup_info = await client.get_entity(dialog.entity.id) if hasattr(supergroup_info, 'linked_chat_id'): channel_id = supergroup_info.linked_chat_id supergroups_and_channels.append((dialog.entity.id, channel_id)) return supergroups_and_channels except Exception as e: print(f"Ошибка при получении супергрупп и каналов: {e}") return [] def load_spam_text(filename): """Загрузка текста спама из файла.""" try: with open(filename, 'r') as file: return file.read().strip() except Exception as e: print(f"Ошибка при чтении текста спама: {e}") return "" Python async def monitor_supergroups_async(): """Мониторинг супергрупп.""" global stop_thread # Загрузка текста спама spam_text = load_spam_text('text.txt') # Получение ID супергрупп и каналов supergroups_and_channels = await get_supergroups_and_channels() while not stop_thread: for supergroup_id, channel_id in supergroups_and_channels: try: # Получение последнего сообщения в канале channel_messages = await client.get_messages(channel_id, limit=1) if channel_messages: last_channel_message = channel_messages[0] # Получение сообщений в супергруппе supergroup_messages = await client.get_messages(supergroup_id, limit=10) for message in supergroup_messages: if message.post and message.post.channel_id == channel_id: # Отправка комментария в супергруппу await client.send_message(supergroup_id, spam_text, reply_to=message.id) channel_entity = await client.get_entity(channel_id) print( f"Спам был выложен в супергруппе обсуждения канала {channel_entity.title} (ID: {channel_id})") except Exception as e: print(f"Ошибка при обработке супергруппы {supergroup_id}: {e}") await asyncio.sleep(1) async def get_supergroups_and_channels(): """Получение ID супергрупп и каналов.""" try: # Получение диалогов dialogs = await client.get_dialogs(limit=1000) supergroups_and_channels = [] for dialog in dialogs: if dialog.is_channel and dialog.entity.megagroup: # Получение информации о супергруппе supergroup_info = await client.get_entity(dialog.entity.id) if hasattr(supergroup_info, 'linked_chat_id'): channel_id = supergroup_info.linked_chat_id supergroups_and_channels.append((dialog.entity.id, channel_id)) return supergroups_and_channels except Exception as e: print(f"Ошибка при получении супергрупп и каналов: {e}") return [] def load_spam_text(filename): """Загрузка текста спама из файла.""" try: with open(filename, 'r') as file: return file.read().strip() except Exception as e: print(f"Ошибка при чтении текста спама: {e}") return ""
Хорошо, давайте разберемся, почему ваш код не видит посты в канале, и как это исправить. Проблема: Основная проблема заключается в том, что ваш код пытается найти сообщения в супергруппе (дискуссии), которые связаны с постом в канале. Однако, посты в каналах не дублируются как сообщения в супергруппах. В супергруппе (дискуссии) отображаются комментарии к этим постам. Ваш код ищет сообщения, которые: • message.post - Являются постом. Это не то, что нам нужно, так как сами комментарии в обсуждении не являются постами, они относятся к постам. • message.post.channel_id == channel_id - принадлежат каналу. Это не применимо к дискуссии, так как дискуссия не является каналом, она является обсуждением постов. Решение: Вам нужно искать сообщения в супергруппе (дискуссии), которые являются ответами на посты в канале. Для этого нужно: 1. Использовать message.reply_to: У сообщений-комментариев в дискуссии будет поле message.reply_to, которое указывает на ID сообщения в канале, к которому они являются ответами. 2. Проверять message.from_id: Чтобы отслеживать сообщения от имени канала (бота), вам нужно сравнить message.from_id.user_id с ID канала. import asyncio from telethon import TelegramClient, events from telethon.tl.functions.channels import GetFullChannelRequest # Замените на свои значения api_id = YOUR_API_ID api_hash = "YOUR_API_HASH" phone = "YOUR_PHONE_NUMBER" client = TelegramClient("anon", api_id, api_hash) stop_thread = False async def monitor_supergroups_async(): """Мониторинг супергрупп.""" global stop_thread # Загрузка текста спама spam_text = load_spam_text('text.txt') # Получение ID супергрупп и каналов supergroups_and_channels = await get_supergroups_and_channels() while not stop_thread: for supergroup_id, channel_id in supergroups_and_channels: try: # Получение последнего сообщения в канале channel_full = await client(GetFullChannelRequest(channel_id)) if not hasattr(channel_full, 'full_chat'): print(f"Не удалось получить полную информацию о канале {channel_id}") continue channel_entity = channel_full.chats[0] if not hasattr(channel_entity, 'id'): print(f"Не удалось получить ID канала {channel_id}") continue channel_id = channel_entity.id # Получение сообщений в супергруппе supergroup_messages = await client.get_messages(supergroup_id, limit=20) for message in supergroup_messages: if message.reply_to and message.reply_to.reply_to_peer_id and message.from_id: # Проверяем, является ли сообщение ответом на пост в канале if ( hasattr(message.reply_to.reply_to_peer_id, 'channel_id') and message.reply_to.reply_to_peer_id.channel_id == channel_id and hasattr(message.from_id, 'user_id') and message.from_id.user_id == channel_id ): await client.send_message(supergroup_id, spam_text, reply_to=message.id) print(f"Спам был выложен в супергруппе обсуждения канала {channel_entity.title} (ID: {channel_id})") except Exception as e: print(f"Ошибка при обработке супергруппы {supergroup_id}: {e}") await asyncio.sleep(1) async def get_supergroups_and_channels(): """Получение ID супергрупп и каналов.""" try: # Получение диалогов dialogs = await client.get_dialogs(limit=1000) supergroups_and_channels = [] for dialog in dialogs: if dialog.is_channel and dialog.entity.megagroup: # Получение информации о супергруппе supergroup_info = await client.get_entity(dialog.entity.id) if hasattr(supergroup_info, 'linked_chat_id'): channel_id = supergroup_info.linked_chat_id supergroups_and_channels.append((dialog.entity.id, channel_id)) return supergroups_and_channels except Exception as e: print(f"Ошибка при получении супергрупп и каналов: {e}") return [] def load_spam_text(filename): """Загрузка текста спама из файла.""" try: with open(filename, 'r', encoding='utf-8') as file: return file.read().strip() except Exception as e: print(f"Ошибка при чтении текста спама: {e}") return "" async def main(): await client.start(phone=phone) await monitor_supergroups_async() if __name__ == "__main__": asyncio.run(main()) Код import asyncio from telethon import TelegramClient, events from telethon.tl.functions.channels import GetFullChannelRequest # Замените на свои значения api_id = YOUR_API_ID api_hash = "YOUR_API_HASH" phone = "YOUR_PHONE_NUMBER" client = TelegramClient("anon", api_id, api_hash) stop_thread = False async def monitor_supergroups_async(): """Мониторинг супергрупп.""" global stop_thread # Загрузка текста спама spam_text = load_spam_text('text.txt') # Получение ID супергрупп и каналов supergroups_and_channels = await get_supergroups_and_channels() while not stop_thread: for supergroup_id, channel_id in supergroups_and_channels: try: # Получение последнего сообщения в канале channel_full = await client(GetFullChannelRequest(channel_id)) if not hasattr(channel_full, 'full_chat'): print(f"Не удалось получить полную информацию о канале {channel_id}") continue channel_entity = channel_full.chats[0] if not hasattr(channel_entity, 'id'): print(f"Не удалось получить ID канала {channel_id}") continue channel_id = channel_entity.id # Получение сообщений в супергруппе supergroup_messages = await client.get_messages(supergroup_id, limit=20) for message in supergroup_messages: if message.reply_to and message.reply_to.reply_to_peer_id and message.from_id: # Проверяем, является ли сообщение ответом на пост в канале if ( hasattr(message.reply_to.reply_to_peer_id, 'channel_id') and message.reply_to.reply_to_peer_id.channel_id == channel_id and hasattr(message.from_id, 'user_id') and message.from_id.user_id == channel_id ): await client.send_message(supergroup_id, spam_text, reply_to=message.id) print(f"Спам был выложен в супергруппе обсуждения канала {channel_entity.title} (ID: {channel_id})") except Exception as e: print(f"Ошибка при обработке супергруппы {supergroup_id}: {e}") await asyncio.sleep(1) async def get_supergroups_and_channels(): """Получение ID супергрупп и каналов.""" try: # Получение диалогов dialogs = await client.get_dialogs(limit=1000) supergroups_and_channels = [] for dialog in dialogs: if dialog.is_channel and dialog.entity.megagroup: # Получение информации о супергруппе supergroup_info = await client.get_entity(dialog.entity.id) if hasattr(supergroup_info, 'linked_chat_id'): channel_id = supergroup_info.linked_chat_id supergroups_and_channels.append((dialog.entity.id, channel_id)) return supergroups_and_channels except Exception as e: print(f"Ошибка при получении супергрупп и каналов: {e}") return [] def load_spam_text(filename): """Загрузка текста спама из файла.""" try: with open(filename, 'r', encoding='utf-8') as file: return file.read().strip() except Exception as e: print(f"Ошибка при чтении текста спама: {e}") return "" async def main(): await client.start(phone=phone) await monitor_supergroups_async() if __name__ == "__main__": asyncio.run(main())
Chasterr_Wr, from telethon.tl.functions.channels import GetFullChannelRequest Python from telethon.tl.functions.channels import GetFullChannelRequest