Я написал небольшой кусок кода который должен искать каналы в ТГ по ключевым словам, но по какой то причине он ищет только чаты в ЛС. Вот код: main.py 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}") Кто знает как решить?
sjl10va1, что значит искать каналы в тг? Глобального поиска в апи тг нет, и global_search этого не делает
Я даун в 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}") 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() с фильтрацией: 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}") 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}") 🔥 Такой подход ищет каналы, в которых вы уже состоите. 💡 Попробуйте этот вариант — он должен решить вашу проблему и корректно находить каналы! 🚀
Потому что этот метод ищет все сообщения из чатов https://docs.pyrogram.org/api/methods/search_global
код 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}")
Перестаньте кидать мусор от гпт, метода глобального поиска не существует. Вступление в каналы с розыгрышами можно сделать только уже по собранным базам с ссылками на вступление