Telegram::GroupScraper - Scraper de canais públicos e grupos do Telegram

Visão geral do scraper
O scraper coleta todas as postagens e mensagens de canais públicos e grupos do Telegram.
A lógica de funcionamento difere de outros scrapers: ele percorre automaticamente as mensagens no canal ou grupo. Devido a isso, não é possível utilizá-lo junto com outros scrapers na mesma tarefa.
A ordem das linhas no resultado não é garantida pelo número da postagem (depende das threads). Os metadados do chat/canal são carregados uma vez por canal e duplicados em cada linha da postagem.
A preservação dos resultados é possível no formato e estrutura que você necessita, graças ao poderoso motor de modelos integrado Template Toolkit, que permite aplicar lógica adicional aos resultados e exibir dados em vários formatos, incluindo JSON, SQL e CSV.
Casos de uso do scraper
🔗 Extração de usuários
Extração de usuários de grupos públicos no Telegram
🔗 Extração de todas as mensagens
Extração de todas as mensagens de grupos públicos no Telegram
Dados coletados
Funciona com canais e grupos públicos.
Mensagem
- Link para o post (
url) - ID do post (
post_id) - Username do canal/grupo sem
@(channel) - Texto do post com HTML (
message_text) - O mesmo texto sem HTML (
message_text_plain) — para filtros, busca e exibição - Data em ISO (
message_date) - Visualizações (
views) — como no Telegram:15.5K,1.2Metc.; apenas para canais, para grupos fica vazio - Notificação de vídeo (
message_video_notice) — se houver um vídeo no post, mas no arraymessage_videosnão houver URL, e este campo estiver preenchido: o vídeo só pode ser assistido no Telegram sob sua própria conta (requer autorização), não há link direto para o arquivo. Isso não é um erro de extração de dados — o Telegram não entrega esses vídeos sem login na conta
Autor do post
- Link para o perfil (
user_link) - Nome (
user_name) - URL do avatar (
user_avatar)
Encaminhamento
- De onde foi encaminhado (
forward_from) - Link para a fonte (
forward_from_url) — URL do original, se disponível - Explicação na ausência de link (
forward_from_notice) — preenchido seforward_from_urlestiver vazio (por exemplo, "Source link not available in embed"): não há link direto, o original pode ter sido excluído, ocultado ou estar indisponível por outro motivo. Não é um erro do scraper
Resposta (reply)
- URL da mensagem respondida (
reply_to_url) - ID do post da URL (
reply_to_post_id) - Autor da mensagem original (
reply_to_author) - Texto da mensagem original, plain (
reply_to_text)
Reações
- Soma de todas as reações (
reactions_total) — número como string;K/M/Bsão convertidos
Metadados do chat/canal
Carregados uma vez por canal, duplicados em cada linha do post.
- Nome (
chat_title) - Número de inscritos/membros (
chat_members) - Online (
chat_online) — apenas para grupos; número de usuários online no momento do início da coleta pelo canal, não é atualizado durante a extração de dados. Para canais fica vazio - Descrição, plain text (
chat_description) - Contadores de mídia e links (
chat_photos,chat_videos,chat_files,chat_links) — apenas para canais
Arrays
reactions — campos emoji, count (como no Telegram: 16, 1.2K). Quem deixou a reação não é coletado: apenas o tipo de emoji e o número total estão disponíveis
message_photos — campo url; álbum — várias linhas.
message_videos — campo url. Se não houver URL, mas houver vídeo no post — veja message_video_notice (visualização apenas após login no Telegram)
links — campo url; links externos do texto do post. Links do tipo t.me/username sem path não entram aqui (são mentions).
mentions — campo username (@username); de links t.me/username e texto @username em <a>.
Recursos
- Normalização flexível de consultas (veja Consultas)
- Filtros por data (
dateFrom,dateTo) e mensagens encaminhadas (skipForwards) - Álbuns de fotos e vídeos — várias URLs em um único post
Opções de uso
- Coleta de conteúdo de posts de canal ou grupo
- Monitoramento de reações, visualizações e encaminhamentos
Consultas
Canais e grupos públicos são suportados. Todos os formatos são convertidos para https://t.me/{username}:
| Consulta | Comportamento |
|---|---|
@username | canal ou grupo, inicia a partir de Start message number |
username | o mesmo |
https://t.me/username | o mesmo |
t.me/username | o mesmo |
https://t.me/s/username | o mesmo |
https://t.me/username/123 | canal ou grupo, inicia a partir do post #123 (Start message number é ignorado) |
Consulta inválida → linha no log Unknown query, resultado vazio.
Exemplos:
https://t.me/a_parser
@a_parser
https://t.me/a_parser/100
Opções de exibição de resultados
O A-Parser suporta formatação flexível de resultados graças ao motor de modelos integrado Template Toolkit, o que permite exibir resultados de forma arbitrária, bem como estruturada, por exemplo, CSV ou JSON.
Saída padrão
Formato do resultado:
$channel/$post_id: $message_text_plain ($views views, $reactions_total reactions)
Exemplo de resultado:
a_parser/1234: isso são filtros) ( views, 0 reactions)
a_parser/85962: O Google lançou algo novo em termos de proteção) ( views, 2 reactions)
Saída em tabela CSV
Formato do resultado:
[% tools.CSVline(channel, post_id, message_text_plain, views, reactions_total) %]
Exemplo de resultado:
a_parser,1234,"isso são filtros)",,0
a_parser,85962,"O Google lançou algo novo em termos de proteção)",,2
Filtragem e salto de posts
Uma linha não entra no resultado se:
- A data estiver fora do intervalo Date from / Date to
- Skip forwards estiver ativado e o post for encaminhado
Ao filtrar por data ou encaminhamento, o post é considerado encontrado, a varredura do canal continua.
A varredura do canal para quando:
- após o último post encontrado, foram verificados consecutivamente Max empty posts IDs sem novas descobertas;
- ou uma série de posts vazios desde o início (se nenhum post tiver sido encontrado ainda).
Processamento de resultados
O A-Parser permite processar os resultados diretamente durante a extração de dados; nesta seção, apresentamos os casos mais populares para o scraper do Telegram.
Filtragem de resultados por ocorrência de palavras na mensagem

É necessário adicionar um filtro e selecionar no menu suspenso $message_text - Message text. Selecionar o tipo RegEx match.
No campo para regex, insira a expressão regular com as palavras necessárias:
\bscraper\b|\bGoogle\b|\byandex\b|\bscraper\b|\bProxy\b|\bDorks\b
\b - limite de palavra
| - OU
is - flag da regex
Baixar exemplo
Como importar um exemplo para o A-Parser
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=
Veja também:
Configurações possíveis
| Parâmetro | Valor padrão | Descrição |
|---|---|---|
| Max empty posts | 1000 | Quantos IDs vazios seguidos tentar após o último post encontrado, antes de interromper a varredura do canal. Não é o limite de posts salvos |
| Start message number | 1 | Número do post pelo qual começar a varredura (se não houver /123 na consulta) |
| Skip forwards | ☐ | Não salvar mensagens encaminhadas |
| Date from | Data de, inclusive. Formato YYYY-MM-DD | |
| Date to | Data até, não inclusive. Formato YYYY-MM-DD |