Загрузка...

Как искать ТГ каналы по ключемым словам в библиотеке Pyrogram?

Тема в разделе Python создана пользователем sjl10va1 27 мар 2025. 155 просмотров

  1. sjl10va1
    sjl10va1 Автор темы 27 мар 2025 2 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 27 мар 2025 43 9 фев 2024
    1. sjl10va1 Автор темы
      NingaGo, Не совсем то, там скрипт который ищет в диалогах, а не в глобальном поиске
  3. Магнит
    Магнит 27 мар 2025 гость —> :cai::cai::cai: 765 18 дек 2021
    Я даун в pyrogram'е воспользуюсь chatgpt
    1. Проблема: search_global() ищет по всем чатам


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

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


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


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

    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() с фильтрацией:

    Код
    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}")

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


    💡 Попробуйте этот вариант — он должен решить вашу проблему и корректно находить каналы! 🚀
     
    27 мар 2025 Изменено
    1. sjl10va1 Автор темы
      Магнит, Метода search_public_chats не существует.
    2. Магнит
      sjl10va1, :)
  4. Y4sperMaglot
  5. alexasdq
    alexasdq 27 мар 2025 Заблокирован(а) 20 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
Загрузка...