Поиск конкретных сообщений



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


Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: