Функция 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()