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

Обзор парсера
Парсер собирает все посты и сообщения из публичных каналов и групп Telegram.
Логика работы отличается от остальных парсеров: он автоматически перебирает сообщения в канале или группе. Из-за этого нельзя использовать его вместе с другими парсерами в одном задании.
Порядок строк в результате не гарантирован по номеру поста (зависит от потоков). Метаданные чата/канала загружаются один раз на канал и дублируются в каждой строке поста.
Сохранение результатов возможно в том виде и структуре которая вам необходима, благодаря встроенному мощному шаблонизатору Template Toolkit который позволяет применять дополнительную логику к результатам и выводить данные в различных форматах, включая JSON, SQL и CSV.
Кейсы по применению парсера
🔗 Парсинг пользователей
Парсинг пользователей публичных групп в Telegram
🔗 Парсинг всех сообщений
Парсинг всех сообщений из публичных групп в Telegram
Собираемые данные
Работает с публичными каналами и группами.
Сообщение
- Ссылка на пост (
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
Фильтрация и пропуск постов
Строка не попадает в результат, если:
- Дата вне диапазона Date from / Date to
- Включён 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 posts | 1000 | Сколько пустых ID подряд пробовать после последнего найденного поста, затем остановка обхода канала. Не лимит сохранённых постов |
| Start message number | 1 | Номер поста, с которого начинать обход (если в запросе нет /123) |
| Skip forwards | ☐ | Не сохранять пересланные сообщения |
| Date from | Дата от, включительно. Формат YYYY-MM-DD | |
| Date to | Дата до, не включительно. Формат YYYY-MM-DD |