Функция app.search_messages — это как использование поисковой строки в чате Telegram, чтобы найти определённые сообщения. Представьте, что вы хотите найти все сообщения, где упоминается слово «праздник» в конкретной группе или чате. Вы «говорите» этой функции: «Посмотри в этом чате, найди все сообщения, где говорится «праздник», и покажи мне их». Если вы хотите, можете также уточнить, чтобы она искала сообщения только от определённого пользователя или сообщения определённого типа, например только с фотографиями или видео. И она вернет вам генератор, отдающий объекты сообщений.
app.search_messages(chat_id, query, offset, filter, limit, from_user): ищет сообщения в чате или группе по определенным критериям.
chat_id(int | str) — уникальный идентификатор (int) или имя пользователя (str) целевого чата. Для вашего личного облака (Сохранённые сообщения) можно использовать «me» или «self». Для контакта, который существует в вашей адресной книге Telegram, можно использовать его номер телефона (str).
query(str, необязательный) — строка для текстового поиска. Обязательна для текстовых сообщений. Необязательна для поиска медиа-сообщений (см. аргумент filter). Если используется при поиске медиа, запрос применяется к подписям. По умолчанию: «» (пустая строка).
offset(int, необязательный) — последовательный номер первого сообщения, которое нужно вернуть. Если вы поставите 0, поиск начнется с самого первого сообщения. Если вы поставите 10, поиск начнется с 11-го сообщения.
filter(enums.MessagesFilter, необязательный) — укажите фильтр, чтобы искать только определённый тип сообщений. По умолчанию: любой тип сообщения (без фильтра).
limit(int, необязательный) — ограничивает количество возвращаемых сообщений. По умолчанию: без ограничения, возвращаются все сообщения.
from_user(int | str, необязательный) — уникальный идентификатор (int) или имя пользователя (str) целевого пользователя, от которого вы хотите найти сообщения.
from pyrogram import Client api_id = 1111 api_hash = "" app = Client("my_session", api_id=api_id, api_hash=api_hash) chat_id = 'test' # Например, можно использовать @username для публичных каналов или чатов query = 'парсинг' # Текст, который вы хотите найти в сообщениях offset = 0 # Смещение от начала списка сообщений (0 означает начало) filter = None # Тип фильтра (например, 'photo' для фото) limit = 200 # Максимальное количество сообщений, которое вы хотите получить from_user = 'Test_user' # Если нужно искать сообщения только от конкретного пользователя def main(): with app: # Поиск сообщений messages = app.search_messages(chat_id=chat_id, query=query, offset=offset, limit=limit, from_user=from_user) # Вывод результатов for message in messages: # Вывод ID сообщения, имени его автора и текста print(f'message id: {message.id} from user: {message.from_user.username}, ' f'message text: {message.text}') main()
Данный код выведет все сообщения, в которых встречается слово «парсинг», в нашем чате WEB Парсинг на Python в пределах последних 200 сообщений, не используя смещения и фильтры.
Самое время поговорить про фильтры. Перечисленные ниже фильтры работают как для
.search_messages(…, filter=MessagesFilter.PINNED) так и для search_global().
Фильтры сообщений в Pyrogram используются для уточнения поиска в истории чата. Когда вы вызываете метод search_messages(), вы можете передать один из этих фильтров, чтобы ограничить результаты только определенными типами сообщений.
Для того чтобы корректно использовать фильтры поиска, необходимо импортировать класс MessagesFilter из модуля enums библиотеки pyrogram:
from pyrogram.enums import MessagesFilter from pyrogram import Client from pyrogram.enums import MessagesFilter with Client("my_account") as app: # Пустой фильтр (любой тип сообщений) app.search_messages(chat_id="test", filter=MessagesFilter.EMPTY) # Сообщения с фотографиями app.search_messages(chat_id="test", filter=MessagesFilter.PHOTO) # Сообщения с видео app.search_messages(chat_id="test", filter=MessagesFilter.VIDEO) # Возвращает сообщения, содержащие либо фотографии, либо видео app.search_messages(chat_id="test", filter=MessagesFilter.PHOTO_VIDEO) # Возвращает сообщения, содержащие документы (например, PDF, DOCX) app.search_messages(chat_id="test", filter=MessagesFilter.DOCUMENT) # Сообщения, содержащие URL-адреса app.search_messages(chat_id="test", filter=MessagesFilter.URL) # Возвращает сообщения, содержащие анимации (обычно это GIF). app.search_messages(chat_id="test", filter=MessagesFilter.ANIMATION) # Сообщения с голосовыми заметками app.search_messages(chat_id="test", filter=MessagesFilter.VOICE_NOTE) # Сообщения с видеозаметками app.search_messages(chat_id="test", filter=MessagesFilter.VIDEO_NOTE) # Возвращает сообщения, содержащие аудио и видеозаметки app.search_messages(chat_id="test", filter=MessagesFilter.AUDIO_VIDEO_NOTE) # Аудиосообщения (музыка) app.search_messages(chat_id="test", filter=MessagesFilter.AUDIO) # Сообщения с фотографиями чата app.search_messages(chat_id="test", filter=MessagesFilter.CHAT_PHOTO) # Сообщения с телефонными звонками app.search_messages(chat_id="test", filter=MessagesFilter.PHONE_CALL) # Возвращает сообщения, в которых есть упоминания пользователя (через @username или если пользователь упомянут напрямую). app.search_messages(chat_id="test", filter=MessagesFilter.MENTION) # Сообщения с местоположением app.search_messages(chat_id="test", filter=MessagesFilter.LOCATION) # Сообщения с контактами app.search_messages(chat_id="test", filter=MessagesFilter.CONTACT) # Закрепленные сообщения app.search_messages(chat_id="test", filter=MessagesFilter.PINNED)
Когда вы используете один из этих фильтров, Pyrogram под капотом создает соответствующий объект фильтра и отправляет его на сервера Telegram вместе с запросом поиска. Сервера Telegram затем возвращают только те сообщения, которые соответствуют заданному фильтру. Это позволяет более эффективно искать сообщения, особенно в больших чатах с большим объемом сообщений.
Чтобы проще было понять как работают фильтры, посмотрите внимательно на объект сообщения и найдите там соответствующие поля ANIMATION.
Следующий код найдёт все сообщения в которых есть GIF анимация.
from pyrogram import Client from pyrogram.enums import MessagesFilter api_id = 1111 api_hash = "" app = Client("my_session", api_id=api_id, api_hash=api_hash) def main(): with app: group_url = "test" # Возвращает сообщения, содержащие анимации (обычно это GIF). messages = app.search_messages(group_url, filter=MessagesFilter.ANIMATION) for message in messages: print(message) main()