Для сбора исторических сообщений из чата используется метод app.get_chat_history(). Этот метод позволяет настраивать извлечение сообщений в любом хронологическом порядке, начиная с самого последнего или с самого первого.
Синтаксис:
app.get_chat_history(chat_id, limit=0, offset=0, offset_id=0, offset_date=utils.zero_datetime()): Используется для получения истории чата. Сообщения возвращаются в обратном хронологическом порядке. Её параметры позволяют настраивать, какие сообщения и в каком объеме вы хотите извлечь.
Вот подробное описание параметров:
chat_id — идентификатор чата или его имя пользователя.
limit — ограничивает количество сообщений для получения. По умолчанию ограничение не установлено, и возвращаются все сообщения.
offset — порядковый номер первого возвращаемого сообщения. Отрицательные значения также принимаются и становятся полезными в случае, если вы задали offset_id или offset_date.
offset_id — идентификатор сообщения, с которого начнется извлечение (используется для пагинации).
offset_date — дата, с которой начнется извлечение сообщений. Если параметр не передан, то будет использована функция pyrogram.utils.zero_datetime(), которая, возвращает нулевую дату (1970-01-01 00:00:00+00:00).
get_chat_history() — вместо того чтобы немедленно возвращать результаты, вызов get_chat_history() выводит представление объекта генератор:
<generator object async_to_sync.<locals>.async_to_sync_gen at 0x0000023938989840>
Чтобы получить сообщения из генератора и вывести их, нужно итерировать по генератору. Вот пример того, как можно модифицировать функцию main для вывода содержимого сообщений:
for message in app.get_chat_history(group_url): print(message) # Перед запуском кода, вставьте свои значения в api_id и api_hash from pyrogram import Client api_id = 1111 api_hash = "" app = Client("my_session", api_id=api_id, api_hash=api_hash) # Получаем историю чата def main(): with app: group_url = "python_parsing" messages = app.get_chat_history(group_url, limit=1) for message in messages: print(message) main()
Выполнив этот код, вы получите объект сообщения с множеством полей, давайте подробнее рассмотрим каждое.
{ "_": "Message", # Тип объекта, в данном случае сообщение "id": 34655, # Уникальный идентификатор сообщения в чате "from_user": { # Информация о пользователе, отправившем сообщение "_": "User", # Тип объекта, в данном случае пользователь "id": 5169571280, # Уникальный идентификатор пользователя "is_self": false, # Флаг, показывающий, является ли пользователь текущим авторизованным пользователем "is_contact": false, # Флаг, является ли пользователь контактом текущего пользователя "is_mutual_contact": false, # Флаг, является ли пользователь взаимным контактом "is_deleted": false, # Флаг, удален ли аккаунт пользователя "is_bot": false, # Флаг, является ли пользователь ботом "is_verified": false, # Флаг, верифицирован ли аккаунт пользователя "is_restricted": false, # Флаг, ограничен ли аккаунт пользователя "is_scam": false, # Флаг, является ли аккаунт мошенническим "is_fake": false, # Флаг, является ли аккаунт фальшивым "is_support": false, # Флаг, является ли аккаунт службой поддержки "is_premium": false, # Флаг, является ли аккаунт премиум-аккаунтом "first_name": "я", # Имя пользователя "status": "UserStatus.RECENTLY", # Статус пользователя, в данном случае недавно был в сети "username": "wwet" # Имя пользователя в Телеграм }, "date": "2024-11-06 10:55:47", # Дата и время отправки сообщения "chat": { # Информация о чате, в который было отправлено сообщение "_": "Chat", # Тип объекта, в данном случае чат "id": -1001236962077, # Уникальный идентификатор чата "type": "ChatType.SUPERGROUP", # Тип чата, в данном случае супергруппа "is_verified": false, # Флаг, верифицирован ли чат "is_restricted": false, # Флаг, ограничен ли чат "is_creator": false, # Флаг, является ли текущий пользователь создателем чата "is_scam": false, # Флаг, является ли чат мошенническим "is_fake": false, # Флаг, является ли чат фальшивым "title": "Тест", # Название чата "username": "Test_user", # Имя пользователя чата в Телеграм "photo": { # Информация о фотографии чата "_": "ChatPhoto", # Тип объекта, в данном случае фотография чата "small_file_id": "AQADAgADNM8u6NsUsAEAIhA8-GZscW____zLoNapvxxE8ABB4E", # Идентификатор маленькой фотографии чата "small_photo_unique_id": "AgADNn8xGy6NfUs", # Уникальный идентификатор маленькой фотографии чата "big_file_id": "AQDAgANM8xGy6xsUsAAlAA8-GZscW____zLoNapvxxE8ABB4E", # Идентификатор большой фотографии чата "big_photo_unique_id": "AgDNM8xGy6sUs" # Уникальный идентификатор большой фотографии чата }, "dc_id": 2, # Идентификатор центра данных, где хранится чат "has_protected_content": false, # Флаг, содержит ли чат защищенный контент "permissions": { # Информация о разрешениях в чате "_": "ChatPermissions", # Тип объекта, в данном случае разрешения чата "can_send_messages": true, # Флаг, разрешено ли отправлять сообщения в чат "can_send_media_messages": true, # Флаг, разрешено ли отправлять медиа-сообщения "can_send_other_messages": true, # Флаг, разрешено ли отправлять другие типы сообщений "can_send_polls": false, # Флаг, разрешено ли отправлять опросы "can_add_web_page_previews": true, # Флаг, разрешено ли добавлять предпросмотры веб-страниц "can_change_info": false, # Флаг, разрешено ли изменять информацию о чате "can_invite_users": true, # Флаг, разрешено ли приглашать пользователей "can_pin_messages": false # Флаг, разрешено ли закреплять сообщения } }, "reply_to_message_id": 34640, # Идентификатор сообщения, на которое был дан этот ответ "reply_to_top_message_id": 34637, # Идентификатор верхнего сообщения в цепочке ответов "mentioned": false, # Флаг, упоминается ли текущий пользователь в сообщении "scheduled": false, # Флаг, является ли сообщение запланированным "from_scheduled": false, # Флаг, было ли сообщение отправлено из запланированных "has_protected_content": false, # Флаг, содержит ли сообщение защищенный контент "text": "", # Текст сообщения "outgoing": false # Флаг, является ли сообщение исходящим }
Этот JSON представляет собой структурированное описание сообщения в Telegram, включая информацию о пользователе, который его отправил, чате, в котором оно было отправлено, а также различные атрибуты и флаги, связанные с сообщением.
Основными полями, которые могут вам пригодиться являются далеко не все, ниже предоставлен этот список.
id — уникальный идентификатор сообщения в чате.(message.id)
from_user — объект, содержащий информацию о пользователе, отправившем сообщение. (message.from_user)
id — уникальный идентификатор пользователя.(message.from_user.id)
first_name — имя пользователя.(message.from_user.first_name)
username — имя пользователя в Telegram. (message.from_user.username)
date — дата и время отправки сообщения. (message.date)
chat — объект, содержащий информацию о чате.(message.chat)
id — уникальный идентификатор чата.(message.chat.id)
type — тип чата (например, супергруппа).(message.chat.type)
title — название чата.(message.chat.title)
username — имя пользователя чата в Telegram.(message.chat.username)
text — текст сообщения.(message.text)
reply_to_message_id — идентификатор сообщения, на которое был дан ответ. (message.reply_to_message_id)
Модифицируем код выше, чтобы получать только текст из объекта сообщения, воспользуемся точечной нотацией message.text.
# Перед запуском кода, вставьте свои значения в api_id и api_hash from pyrogram import Client api_id = 1111 api_hash = "" app = Client("my_session", api_id=api_id, api_hash=api_hash) # Получить сообщения из чата def main(): with app: group_url = "Test" messages = app.get_chat_history(group_url) for message in messages: print(message.text) main()
Вывод содержит None потому что не все объекты сообщений, возвращаемые из app.get_chat_history(group_url), содержат текстовое поле с данными.
Это может произойти в следующих ситуациях:
Сообщения без текста. Если сообщение является медиа-файлом (например, изображением, видео или стикером), голосовым сообщением, командой бота или любым другим типом содержимого, не включающим текст, поле text будет None или пустым.
Служебные сообщения. Telegram часто включает служебные сообщения, такие как уведомления о новых участниках группы или о том, что кто-то покинул группу. Эти сообщения также не содержат извлекаемого текста.
Удалённые сообщения. Если сообщение было удалено, то оно может возвращаться как объект с отсутствующим или пустым текстовым полем.
Если вы хотите избежать вывода None, вы можете добавить проверку, чтобы печатать только те сообщения, которые содержат текст:
def main(): with app: group_url = "Test" messages = app.get_chat_history(group_url) for message in messages: if message.text: # Проверяем, что текст существует print(message.text) else: print("Это сообщение не содержит текста.") main()
В этом примере, если поле text сообщения не None и не пустая строка, оно будет напечатано. В противном случае будет напечатано «Это сообщение не содержит текста.» (или можно просто игнорировать такие сообщения, не выводя ничего).