Парсинг сообщений группы



Для парсинга сообщений из группы или паблика Telegram используется два основных метода библиотеки Telethon. 

.get_messages() возвращает указанное количество сообщений чата.

.iter_messages() совершает итерации по каждому сообщению отдельно.

У каждого из этих методов есть свои плюсы и минусы. Рассмотрим эти два метода более подробно.

Метод client.get_messages() — аналогично функции iter_messages(), но вместо итератора возвращается список TotalList.  Если limit не задан, по умолчанию будет равно 1, если только не заданы min_id и max_id (в качестве именованных аргументов), в этом случае будет возвращен весь диапазон. Это сделано потому, что любое целочисленное ограничение было бы довольно произвольным, и обычно требуется получить только одно сообщение, но если задан диапазон, то логично, что он должен возвращать его целиком. Если ids присутствует в именованных аргументах и не является списком, то для удобства вместо списка будет возвращено одно сообщение.

Метод client.iter_messages() —  возвращает асинхронный итератор, который позволяет последовательно получать сообщения из чата или канала. Если параметр limit=None  — метод не ограничивает количество сообщений и возвращает все доступные сообщения, соответствующие указанным фильтрам. Параметр from_user=user_id ограничивает итерацию только сообщениями, отправленными указанным пользователем, соответственно, если пользователь отправил всего 3 сообщения, именно они и будут получены.

Пример кода:

from telethon import TelegramClient, events, sync, connection

r_api = 1111
r_hash = ''
with TelegramClient('my', r_api, r_hash, system_version="4.10.5 beta x64") as client:
    all_message = client.get_messages('https://t.me/name_group')
    for message in all_message:
        print(message)

Содержимое ответа:

Message(
    id=200, - идентификатор этого сообщения;
    peer_id=
        PeerChannel(
            channel_id=1795821154), - ID пользователя, группы, канала,  куда было отправлено сообщение;)
    date=
        datetime.datetime(2022, 6, 11, 9, 40, 26, tzinfo=datetime.timezone.utc), - объект даты, когда сообщение было отправлено;
    message='Текст сообщения', - строковый объект сообщения;
    out=False, - возвращает True, если сообщение является исходящим, т.е., отправлено с вашей учетной записи;
    mentioned=False, - возвращает True, если, вы были упомянуты в этом сообщении;
    media_unread=False,  - возвращает True, если медиа в сообщении не были прочитаны;
    silent=False, - возвращает True, если уведомления отключены;
    post=False,  - возвращает True, если сообщение является постом в широковещательном канале;
    from_scheduled=False,  - возвращает True, если сообщение было создано из заранее запланированного сообщения;
    legacy=False,  - возвращает True, если сообщение является устаревшим;
    edit_hide=False,  - возвращает True, если метка о редактировании сообщения была скрыта;
    pinned=False,   - возвращает True, если сообщение закреплено в настоящее время;
    from_id=
        PeerUser(
            user_id=1115814085),  - ID пользователя, группы или канала отправившего сообщение;
    fwd_from=None,  - возвращает True, если сообщение является репостом из другого чата\группы\паблика;
    via_bot_id=None,   - ID бота который отправлял это сообщение;
    reply_to=None,  - ID  сообщения если это сообщение отвечает на другое;
    media=None, - медиафайлы отправленные в сообщении если такие имеются(фото, видео, документы, GIF, стикеры и т.д)
    reply_markup=None, - разметка для этого сообщения, которое отправлено ботом, чаще всего это кнопки;
    entities=[], - список элементов в этом сообщении, таких как жирный шрифт, курсив, код, гиперссылки и т.д.;
    views=None, - количество просмотров этого сообщения;
    forwards=None, - сколько раз это сообщение было переадресовано;
    replies= - сколько раз другое сообщение ответило на это сообщение;
        MessageReplies(
            replies=0,
            replies_pts=213,
            comments=False,
            recent_repliers=[],
            channel_id=None,
            max_id=None,
            read_max_id=None),
        edit_date=None, - дата последнего редактирования сообщения;
        post_author=None, - отображаемое имя отправителя сообщения;
        grouped_id=None, - проверяет, принадлежит ли это сообщение к группе сообщений, фото- или видео альбому;
        restriction_reason=[], - список причин, по которым это сообщение было ограничено;
        ttl_period=None - период жизни, настроенный для этого сообщения;)

Запоминать все поля возвращаемого объекта не нужно, для парсинга нам чаще всего необходимы следующие поля с информацией:

user_id — чтобы извлечь ID пользователя, отправившего сообщение, необходимо к объекту сообщения применить способ

message.from_id.user_id;

date — для того, чтобы извлечь дату отправки сообщения, используется способ message.date;

message — чтобы извлечь текст сообщения, применяется два способа,  message.text и message.message;

media — используется для определения, присутствуют ли медиафайлы в сообщении или нет, как извлекать медиафайлы из сообщения мы поговорим далее;

Доступ к остальным полям осуществляется подобным образом, с этим проблем у вас возникнуть не должно.

Обратите внимание на один важный момент. В объекте Message, хранится user_id в цифровом формате, а нам чаще всего необходимо знать его username, если он у него имеется. Чтобы конвертировать user_id в username используется метод .get_entity(ID). Функция .get_entity(ID) возвращает объект User со всеми соответствующими этому объекту полями.

Выполнение функции .get_entity(ID) вернет объект, у которого имеются все необходимые поля, нам осталось извлечь из них username.

Код ниже, получает первое сообщение в чате, извлекает из него user_id (message.from_id.user_id) и передает его в функцию .get_entity(ID) которая возвращает объект User, и уже у этого объекта мы извлекаем username.

from telethon import TelegramClient, events, sync, connection

r_api = 1111
r_hash = ''
with TelegramClient('my', r_api, r_hash) as client:
    all_message = client.get_messages('https://t.me/name_group')
    for message in all_message:
        id_user = message.from_id.user_id
        print(client.get_entity(id_user).username)


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

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