Pular para o conteúdo principal

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

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

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.2M etc.; apenas para canais, para grupos fica vazio
  • Notificação de vídeo (message_video_notice) — se houver um vídeo no post, mas no array message_videos nã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 se forward_from_url estiver 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/B sã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}:

ConsultaComportamento
@usernamecanal ou grupo, inicia a partir de Start message number
usernameo mesmo
https://t.me/usernameo mesmo
t.me/usernameo mesmo
https://t.me/s/usernameo mesmo
https://t.me/username/123canal 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:

  1. A data estiver fora do intervalo Date from / Date to
  2. 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

Exemplo

É 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=

Configurações possíveis

ParâmetroValor padrãoDescrição
Max empty posts1000Quantos 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 number1Número do post pelo qual começar a varredura (se não houver /123 na consulta)
Skip forwardsNão salvar mensagens encaminhadas
Date fromData de, inclusive. Formato YYYY-MM-DD
Date toData até, não inclusive. Formato YYYY-MM-DD