Passer au contenu principal

Telegram::GroupScraper - Scraper de canaux et groupes publics Telegram

Telegram

Présentation du scraper

Le scraper collecte tous les posts et messages des canaux et groupes publics Telegram.

La logique de fonctionnement diffère des autres scrapers : il parcourt automatiquement les messages dans le canal ou le groupe. Pour cette raison, il ne peut pas être utilisé avec d'autres scrapers dans la même tâche.

L'ordre des lignes dans le résultat n'est pas garanti par numéro de post (dépend des threads). Les métadonnées du chat/canal sont chargées une seule fois par canal et sont dupliquées dans chaque ligne de post.

La sauvegarde des résultats est possible dans la forme et la structure dont vous avez besoin, grâce au puissant moteur de gabarits intégré Template Toolkit qui permet d'appliquer une logique supplémentaire aux résultats et d'afficher les données dans divers formats, y compris JSON, SQL et CSV.

Cas d'utilisation du scraper

Données collectées

Fonctionne avec les canaux et les groupes publics.

Message

  • Lien vers le post (url)
  • ID du post (post_id)
  • Nom d'utilisateur du canal/groupe sans @ (channel)
  • Texte du post avec HTML (message_text)
  • Le même texte sans HTML (message_text_plain) — pour les filtres, la recherche et l'affichage
  • Date au format ISO (message_date)
  • Vues (views) — comme dans Telegram : 15.5K, 1.2M, etc. ; uniquement pour les canaux, vide pour les groupes
  • Notification de vidéo (message_video_notice) — si le post contient une vidéo mais que le tableau message_videos ne contient pas d'URL, et que ce champ est rempli : la vidéo peut être visionnée uniquement dans Telegram sous votre propre compte (authentification requise), il n'y a pas de lien direct vers le fichier. Ce n'est pas une erreur de collecte — Telegram ne fournit pas ces vidéos sans connexion au compte

Auteur du post

  • Lien vers le profil (user_link)
  • Nom (user_name)
  • URL de l'avatar (user_avatar)

Transfert

  • Origine du transfert (forward_from)
  • Lien vers la source (forward_from_url) — URL de l'original, si disponible
  • Explication en l'absence de lien (forward_from_notice) — rempli si forward_from_url est vide (par exemple, « Source link not available in embed ») : il n'y a pas de lien direct, l'original a pu être supprimé, masqué ou est inaccessible pour une autre raison. Ce n'est pas une erreur du scraper

Réponse (reply)

  • URL du message auquel on répond (reply_to_url)
  • ID du post extrait de l'URL (reply_to_post_id)
  • Auteur du message d'origine (reply_to_author)
  • Texte du message d'origine, plain (reply_to_text)

Réactions

  • Somme de toutes les réactions (reactions_total) — nombre sous forme de chaîne ; K/M/B sont convertis

Métadonnées du chat/canal

Chargées une seule fois par canal, dupliquées dans chaque ligne de post.

  • Titre (chat_title)
  • Nombre d'abonnés/membres (chat_members)
  • En ligne (chat_online) — uniquement pour les groupes ; nombre d'utilisateurs en ligne au moment du début de la collecte sur le canal, n'est pas mis à jour pendant le processus. Vide pour les canaux
  • Description, plain text (chat_description)
  • Compteurs de médias et de liens (chat_photos, chat_videos, chat_files, chat_links) — uniquement pour les canaux

Tableaux

reactions — champs emoji, count (comme dans Telegram : 16, 1.2K). L'identité de ceux qui ont réagi n'est pas collectée : seuls le type d'emoji et le nombre total sont disponibles

message_photos — champ url ; album — plusieurs lignes.

message_videos — champ url. Si l'URL est absente mais qu'il y a une vidéo dans le post — voir message_video_notice (visionnage uniquement après connexion à Telegram)

links — champ url ; liens externes provenant du texte du post. Les liens de type t.me/username sans chemin n'y figurent pas (ce sont des mentions).

mentions — champ username (@username) ; provenant des liens t.me/username et du texte @username dans les balises <a>.

Fonctionnalités

  • Normalisation flexible des requêtes (voir Requêtes)
  • Filtres par date (dateFrom, dateTo) et par messages transférés (skipForwards)
  • Albums photo et vidéo — plusieurs URL dans un seul post

Cas d'utilisation

  • Collecte du contenu des posts d'un canal ou d'un groupe
  • Surveillance des réactions, des vues et des transferts

Requêtes

Les canaux et groupes publics sont supportés. Tous les formats sont convertis en https://t.me/{username} :

RequêteComportement
@usernamechaîne ou groupe, démarrage à partir de Start message number
usernameidentique
https://t.me/usernameidentique
t.me/usernameidentique
https://t.me/s/usernameidentique
https://t.me/username/123chaîne ou groupe, démarrage au post #123 (Start message number est ignoré)

Requête invalide → ligne Unknown query dans le log, résultat vide.

Exemples :

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

Variantes d'affichage des résultats

A-Parser prend en charge un formatage flexible des résultats grâce au moteur de gabarits intégré Template Toolkit, ce qui lui permet d'afficher les résultats sous une forme libre, ainsi que structurée, par exemple CSV ou JSON.

Affichage par défaut

Format du résultat :

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

Exemple de résultat :

a_parser/1234: ce sont des filtres) ( views, 0 reactions)
a_parser/85962: Google a sorti quelque chose de nouveau pour la protection) ( views, 2 reactions)

Affichage dans un tableau CSV

Format du résultat :

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

Exemple de résultat :

a_parser,1234,"ce sont des filtres)",,0
a_parser,85962,"Google a sorti quelque chose de nouveau pour la protection)",,2

Filtrage et omission de posts

Une ligne ne figure pas dans le résultat si :

  1. La date est hors de la plage Date from / Date to
  2. L'option Skip forwards est activée et le post est un transfert

Lors d'un filtrage par date ou transfert, le post est considéré comme trouvé, le parcours du canal continue.

Le parcours du canal s'arrête quand :

  • après le dernier post trouvé, Max empty posts ID consécutifs ont été vérifiés sans nouvelles découvertes ;
  • ou une série de posts vides dès le début (si aucun post n'a encore été trouvé).

Traitement des résultats

A-Parser permet de traiter les résultats directement pendant la collecte de données, dans cette section nous avons listé les cas les plus populaires pour le scraper Telegram.

Filtrage des résultats par présence de mots dans le message

Exemple

Il est nécessaire d'ajouter un filtre et de choisir dans la liste déroulante $message_text - Message text. Choisir le type RegEx match. Dans le champ pour la regex, inscrire la regex avec les mots nécessaires :

\bscraper\b|\bGoogle\b|\byandex\b|\bscraper\b|\bProxy\b|\bDorks\b

\b - limite de mot

| - OU

is - drapeau de la regex

Télécharger l'exemple

Comment importer l'exemple dans 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=

Paramètres possibles

ParamètreValeur par défautDescription
Max empty posts1000Nombre d'ID vides consécutifs à essayer après le dernier post trouvé avant d'arrêter le parcours du canal. Ce n'est pas une limite de posts sauvegardés
Start message number1Numéro du post par lequel commencer le parcours (si la requête ne contient pas /123)
Skip forwardsNe pas sauvegarder les messages transférés
Date fromDate de, inclusivement. Format YYYY-MM-DD
Date toDate jusqu'à, non inclus. Format YYYY-MM-DD