Загрузка...

How to look for tg channels by keywords in the Pyrogram library?

Thread in Python created by sjl10va1 Mar 27, 2025. 148 views

  1. sjl10va1
    sjl10va1 Topic starter Mar 27, 2025 2 Jul 15, 2018
    Я написал небольшой кусок кода который должен искать каналы в ТГ по ключевым словам, но по какой то причине он ищет только чаты в ЛС.

    Вот код:

    async def search_giveaways(client):
    """Ищет официальные розыгрыши Telegram Premium в найденных каналах"""
    joined_channels = []

    for keyword in KEYWORDS:
    print(f"[INFO] Ищем каналы по ключевому слову: {keyword}")

    try:
    async for message in client.search_global(query=keyword): # Поиск сообщений и каналов
    print(message)
    chat = message.chat
    if chat and chat.type == "channel": # Оставляем только каналы
    chat_id = chat.id
    title = chat.title
    print(f"[INFO] Найден канал: {title} ({chat_id})")

    # Вступаем в канал
    try:
    await client.join_chat(chat_id)
    print(f"[SUCCESS] Вступили в канал: {title}")
    joined_channels.append(chat_id)
    except FloodWait as e:
    print(f"[WARNING] FloodWait {e.value} секунд, ждем...")
    await asyncio.sleep(e.value)
    except Exception as e:
    print(f"[ERROR] Не удалось вступить в {title}: {e}")
    continue

    # Теперь ищем розыгрыши в этом канале
    try:
    async for message in client.get_chat_history(chat_id, limit=50):
    if message.giveaway:
    giveaway = message.giveaway
    if giveaway.premium_subscription_month_count: # Проверяем, разыгрывается ли Telegram Premium
    print(f"[🎉] Найден розыгрыш Telegram Premium в {title}!")
    print(f"🔹 {giveaway.winner_count} победителей | Дата выбора: {giveaway.winners_selection_date}")
    break # Достаточно одного розыгрыша
    except Exception as e:
    print(f"[ERROR] Не удалось просканировать {title}: {e}")

    except Exception as e:
    print(f"[ERROR] Ошибка поиска каналов: {e}")
    Кто знает как решить?
     
    1. Y4sperMaglot
      sjl10va1, что значит искать каналы в тг? Глобального поиска в апи тг нет, и global_search этого не делает
  2. NingaGo
    NingaGo Mar 27, 2025 43 Feb 9, 2024
    1. sjl10va1 Topic starter
      NingaGo, Не совсем то, там скрипт который ищет в диалогах, а не в глобальном поиске
  3. Магнит
    Магнит Mar 27, 2025 guest —> :cai::cai::cai: 765 Dec 18, 2021
    Я даун в pyrogram'е воспользуюсь chatgpt
    1. Проблема: search_global() ищет по всем чатам


    Метод client.search_global() ищет сообщения во всех чатах, включая ЛС, группы и супергруппы, а не только в каналах. Вот почему вы видите в результатах личные чаты.

    💡 Решение:
    Чтобы искать именно каналы, нужно сначала найти их с помощью client.search_contacts() или client.search_public_chat().


    🛠 2. Исправление кода


    Вот как можно переписать ваш код, чтобы Pyrogram искал только публичные каналы:
    Code

    from pyrogram.errors import FloodWait
    import asyncio

    KEYWORDS = ["Telegram Premium", "розыгрыш", "giveaway"] # Ваши ключевые слова

    async def search_giveaways(client):
    """Ищет официальные розыгрыши Telegram Premium в найденных каналах"""
    joined_channels = []

    for keyword in KEYWORDS:
    print(f"[INFO] Ищем каналы по ключевому слову: {keyword}")

    try:
    async for chat in client.search_public_chats(keyword):
    if chat and chat.type == "channel": # Проверяем, что это канал
    chat_id = chat.id
    title = chat.title
    print(f"[INFO] Найден канал: {title} ({chat_id})")

    # Вступаем в канал
    try:
    await client.join_chat(chat_id)
    print(f"[SUCCESS] Вступили в канал: {title}")
    joined_channels.append(chat_id)
    except FloodWait as e:
    print(f"[WARNING] FloodWait {e.value} секунд, ждем...")
    await asyncio.sleep(e.value)
    except Exception as e:
    print(f"[ERROR] Не удалось вступить в {title}: {e}")
    continue

    # Теперь ищем розыгрыши в этом канале
    try:
    async for message in client.get_chat_history(chat_id, limit=50):
    if message.giveaway:
    giveaway = message.giveaway
    if giveaway.premium_subscription_month_count:
    print(f"[🎉] Найден розыгрыш Telegram Premium в {title}!")
    print(f"🔹 {giveaway.winner_count} победителей | Дата выбора: {giveaway.winners_selection_date}")
    break # Достаточно одного розыгрыша
    except Exception as e:
    print(f"[ERROR] Не удалось просканировать {title}: {e}")

    except Exception as e:
    print(f"[ERROR] Ошибка поиска каналов: {e}")



    🔥 3. Объяснение изменений



    ✅ Заменил client.search_global() → client.search_public_chats() → теперь Pyrogram ищет только публичные каналы.
    🔥 Обработал FloodWait и исключения при ошибках.
    🔍 Оптимизирован цикл, чтобы не обрабатывать лишние чаты.



    4. Дополнительная оптимизация


    Если вы хотите искать не только публичные, но и приватные каналы, можно использовать client.get_dialogs() с фильтрацией:

    Code
    async for dialog in client.get_dialogs():
    if dialog.chat.type == "channel" and keyword.lower() in dialog.chat.title.lower():
    print(f"🔍 Найден канал: {dialog.chat.title}")

    🔥 Такой подход ищет каналы, в которых вы уже состоите.


    💡 Попробуйте этот вариант — он должен решить вашу проблему и корректно находить каналы! 🚀
     
    1. sjl10va1 Topic starter
      Магнит, Метода search_public_chats не существует.
    2. Магнит
      sjl10va1, :)
  4. Y4sperMaglot
  5. alexasdq
    alexasdq Mar 27, 2025 Banned 20 Mar 18, 2025
    async def search_giveaways(client):
    """Ищет официальные розыгрыши Telegram Premium в найденных каналах"""
    joined_channels = set() # Используем set для избежания дубликатов

    for keyword in KEYWORDS:
    print(f"[INFO] Ищем каналы по ключевому слову: {keyword}")

    try:
    # Ищем каналы по ключевому слову
    async for dialog in client.iter_dialogs():
    chat = dialog.entity
    if hasattr(chat, 'megagroup') and not chat.megagroup and hasattr(chat, 'broadcast') and chat.broadcast:
    # Это канал (не супергруппа)
    if keyword.lower() in chat.title.lower():
    chat_id = chat.id
    title = chat.title
    print(f"[INFO] Найден канал: {title} ({chat_id})")

    # Вступаем в канал (если еще не вступили)
    if chat_id not in joined_channels:
    try:
    await client.join_chat(chat_id)
    print(f"[SUCCESS] Вступили в канал: {title}")
    joined_channels.add(chat_id)

    # Ищем розыгрыши в этом канале
    try:
    async for message in client.get_chat_history(chat_id, limit=50):
    if hasattr(message, 'giveaway') and message.giveaway:
    giveaway = message.giveaway
    if giveaway.premium_subscription_month_count:
    print(f"[🎉] Найден розыгрыш Telegram Premium в {title}!")
    print(f"🔹 {giveaway.winner_count} победителей | Дата выбора: {giveaway.winners_selection_date}")
    break
    except Exception as e:
    print(f"[ERROR] Не удалось просканировать {title}: {e}")

    except FloodWait as e:
    print(f"[WARNING] FloodWait {e.value} секунд, ждем...")
    await asyncio.sleep(e.value)
    except Exception as e:
    print(f"[ERROR] Не удалось вступить в {title}: {e}")

    except Exception as e:
    print(f"[ERROR] Ошибка поиска каналов: {e}")
     
  6. Y4sperMaglot
    Перестаньте кидать мусор от гпт, метода глобального поиска не существует. Вступление в каналы с розыгрышами можно сделать только уже по собранным базам с ссылками на вступление
     
Top
Loading...