Перейти к основному содержимому

Telegram::GroupScraper - Парсер публичных каналов и групп Telegram

Telegram

Обзор парсера

Парсер собирает все посты и сообщения из публичных каналов и групп Telegram.

Логика работы отличается от остальных парсеров: он автоматически перебирает сообщения в канале или группе. Из-за этого нельзя использовать его вместе с другими парсерами в одном задании.

Порядок строк в результате не гарантирован по номеру поста (зависит от потоков). Метаданные чата/канала загружаются один раз на канал и дублируются в каждой строке поста.

Сохранение результатов возможно в том виде и структуре которая вам необходима, благодаря встроенному мощному шаблонизатору Template Toolkit который позволяет применять дополнительную логику к результатам и выводить данные в различных форматах, включая JSON, SQL и CSV.

Кейсы по применению парсера

Собираемые данные

Работает с публичными каналами и группами.

Сообщение

  • Ссылка на пост (url)
  • ID поста (post_id)
  • Username канала/группы без @ (channel)
  • Текст поста с HTML (message_text)
  • Тот же текст без HTML (message_text_plain) — для фильтров, поиска и вывода
  • Дата в ISO (message_date)
  • Просмотры (views) — как в Telegram: 15.5K, 1.2M и т.д.; только для каналов, у групп — пусто
  • Уведомление о видео (message_video_notice) — если в посте есть видео, но в массиве message_videos нет URL, а это поле заполнено: ролик можно посмотреть только в Telegram под своим аккаунтом (нужна авторизация), прямой ссылки на файл нет. Это не ошибка сбора — Telegram не отдаёт такие видео без входа в аккаунт

Автор поста

  • Ссылка на профиль (user_link)
  • Имя (user_name)
  • URL аватара (user_avatar)

Пересылка

  • Откуда переслано (forward_from)
  • Ссылка на источник (forward_from_url) — URL оригинала, если доступен
  • Пояснение при отсутствии ссылки (forward_from_notice) — заполняется, если forward_from_url пуст (например, «Source link not available in embed»): прямой ссылки нет, оригинал мог быть удалён, скрыт или недоступен по другой причине. Не ошибка парсера

Ответ (reply)

  • URL сообщения, на которое ответ (reply_to_url)
  • ID поста из URL (reply_to_post_id)
  • Автор исходного сообщения (reply_to_author)
  • Текст исходного сообщения, plain (reply_to_text)

Реакции

  • Сумма всех реакций (reactions_total) — число строкой; K/M/B пересчитываются

Метаданные чата/канала

Загружаются один раз на канал, дублируются в каждой строке поста.

  • Название (chat_title)
  • Число подписчиков/участников (chat_members)
  • Онлайн (chat_online) — только для групп; число пользователей онлайн на момент начала сбора по каналу, в ходе парсинга не обновляется. У каналов — пусто
  • Описание, plain text (chat_description)
  • Счётчики медиа и ссылок (chat_photos, chat_videos, chat_files, chat_links) — только для каналов

Массивы

reactions — поля emoji, count (как в Telegram: 16, 1.2K). Кто поставил реакцию — не собирается: доступны только тип emoji и общее число

message_photos — поле url; альбом — несколько строк.

message_videos — поле url. Если URL нет, но в посте видео есть — смотрите message_video_notice (просмотр только после входа в Telegram)

links — поле url; внешние ссылки из текста поста. Ссылки вида t.me/username без path сюда не попадают (это mentions).

mentions — поле username (@username); из ссылок t.me/username и текста @username в <a>.

Возможности

  • Гибкая нормализация запросов (см. Запросы)
  • Фильтры по дате (dateFrom, dateTo) и пересланным сообщениям (skipForwards)
  • Альбомы фото и видео — несколько URL в одном посте

Варианты использования

  • Сбор содержимого постов канала или группы
  • Мониторинг реакций, просмотров и пересылок

Запросы

Поддерживаются публичные каналы и группы. Все форматы приводятся к https://t.me/{username}:

ЗапросПоведение
@usernameканал или группа, старт с Start message number
usernameто же
https://t.me/usernameто же
t.me/usernameто же
https://t.me/s/usernameто же
https://t.me/username/123канал или группа, старт с поста #123 (Start message number игнорируется)

Невалидный запрос → строка в лог Unknown query, результат пустой.

Примеры:

https://t.me/a_parser
@a_parser
https://t.me/a_parser/100

Варианты вывода результатов

A-Parser поддерживает гибкое форматирование результатов благодаря встроенному шаблонизатору Template Toolkit, что позволяет ему выводить результаты в произвольной форме, а также в структуированной, например CSV или JSON

Вывод по умолчанию

Формат результата:

$channel/$post_id: $message_text_plain ($views views, $reactions_total reactions)

Пример результата:

a_parser/1234: это фильтры) ( views, 0 reactions)
a_parser/85962: Google что-то новое по защите выкатил) ( views, 2 reactions)

Вывод в таблицу CSV

Формат результата:

[% tools.CSVline(channel, post_id, message_text_plain, views, reactions_total) %]

Пример результата:

a_parser,1234,"это фильтры)",,0
a_parser,85962,"Google что-то новое по защите выкатил)",,2

Фильтрация и пропуск постов

Строка не попадает в результат, если:

  1. Дата вне диапазона Date from / Date to
  2. Включён Skip forwards и пост переслан

При фильтре по дате или forward пост считается найденным, обход канала продолжается.

Обход канала останавливается, когда:

  • после последнего найденного поста подряд проверено Max empty posts ID без новых находок;
  • или серия пустых постов от начала (если ещё не было ни одного найденного поста).

Обработка результатов

A-Parser позволяет обрабатывать результаты непосредственно во время парсинга, в этом разделе мы привели наиболее популярные кейсы для парсера Telegram

Фильтрация результатов по вхождению слов в сообщение

Пример

Необходимо добавить фильтр и выбрать в выпадающем списке $message_text - Message text. Выбрать тип Регулярка совпадает. В поле для регулярки вписать регулярку с необходимыми словами:

\bпарсер\b|\bGoogle\b|\byandex\b|\bпарсер\b|\bПрокси\b|\bДорки\b

\b - граница слова

| - ИЛИ

is - флаг регулякри

Скачать пример

Как импортировать пример в А-Парсер

eJyVVN1v2jAQ/18sHjaJ8qFSacobRaLaxEpX6BOg6oovqVfH9myHgTL+952dkMC6
PewhVu53v/v2uWQe3Jt7sOjQO5asSmbiP0uYR4mZhfyK6+0V7iE3ElmXGbAObeCu
2LKmJMmd1YVZbC0YtETimEIhPeuWzB8MkrdUSB9V5D5oEpajc5Dhs8c9EWvCsmJb
zMFvXwnegSwCsl6/rIvB6DqN5yCco+ocRuSmRtYvv+i70zqTWAsHUBz3tfAfToIw
TFvSNcYTzgw+nVNHLak2gIZElWjjhVZUinDsuNmcOuGm2lKxhHfMsFd3v1EuYIdL
XfUPW3hK0j3koTEdDh6DtpdGRx8+9nxsKHAuQkSQVYQwsjbqkxI/YmOVJi79WoFu
anUeJx8dBPBwym7FOlFm5KKItt8qG5akIB12maNUp0CJ8D81ggYLXtt57ADhJdNq
LOUMdyhbWvR/WwjJ6X6NUzL6XBv+nTJ/5+PYlHceaof2p6UcGi9Rup1/ba24numM
KudhUFLkwpPsJrpQYTADAt8QTdOz+9CzXFtswnhbYBOc1smg4kRsJzY2LXRRxcVU
LsGtVqnI5pS/FRxPzEItaWfnaqLDRoayVCElTcXhY3s7xq6eQhCayt8ZT2KIUPlp
Y5nXWroviypVYwXdvpuQYE6NPI9au9yClE+Ps3MNa28UCa/eG5f0+76XYx+eq/eD
BUOPmaYbRWUdN83D0rxF5b+el6Q80si+u4fKIBQY6IRRp1zcseHxN9yRrow=

Возможные настройки

ПараметрЗначение по умолчаниюОписание
Max empty posts1000Сколько пустых ID подряд пробовать после последнего найденного поста, затем остановка обхода канала. Не лимит сохранённых постов
Start message number1Номер поста, с которого начинать обход (если в запросе нет /123)
Skip forwardsНе сохранять пересланные сообщения
Date fromДата от, включительно. Формат YYYY-MM-DD
Date toДата до, не включительно. Формат YYYY-MM-DD