Загрузка...

Help with the code please)

Thread in Python created by Chasterr_Wr Jan 26, 2025. 164 views

  1. Chasterr_Wr
    Chasterr_Wr Topic starter Jan 26, 2025 0 Jan 7, 2025
    Вобщем софт должен в супергруппах которые привязаны к каналу отслеживать сообщения от имени канала и отвечать на них используя текст из text.txt .
    И по итогу это все должно выглядеть как комент к посту в канале.

    Нахожусь и в канале и в его дискуссии. Выходит пост, софт его не видит попросту.


    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 ""
     
  2. ЛЮБЛЮ_ДЕНЬГИ
    ЛЮБЛЮ_ДЕНЬГИ Jan 26, 2025 Ёбанем так сильно, что уроним стены 611 Feb 15, 2021
    Хорошо, давайте разберемся, почему ваш код не видит посты в канале, и как это исправить.

    Проблема:

    Основная проблема заключается в том, что ваш код пытается найти сообщения в супергруппе (дискуссии), которые связаны с постом в канале. Однако, посты в каналах не дублируются как сообщения в супергруппах. В супергруппе (дискуссии) отображаются комментарии к этим постам.

    Ваш код ищет сообщения, которые:

    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 канала.

    Code
    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())
     
    1. Stalkie
      Chasterr_Wr,
      Python
      from telethon.tl.functions.channels import GetFullChannelRequest
Top
Loading...