Plongée technique dans tgadsspy : classificateur et pipeline d'ingestion de données
Documentation technique du pipeline de données tgadsspy — intégration API gramesh, architecture du classificateur de niches (regex + poids), pipeline géoclassificateur en 3 étapes, stockage adressé par contenu SHA256 et cache d'agrégation. Pour les développeurs, chercheurs et équipes de conformité.
Objectif et audience#
Ce document est une plongée technique dans la façon dont Telegram Ads Spy collecte, classifie et sert les données publicitaires Telegram. Il complète la vue d'ensemble sur /about avec des détails au niveau de l'implémentation. Public principal : les développeurs qui construisent sur l'API publique, les chercheurs qui ont besoin de comprendre la provenance des données pour les citer, et les équipes de conformité qui évaluent la méthodologie OSINT du système.
1. Source de données : API gramesh#
Toutes les données publicitaires dans Telegram Ads Spy proviennent d'une seule source : l'API HTTP gramesh sur api.wall.systems/gramesh. gramesh est une couche de proxy/agrégation sur le protocole MTProto de Telegram, exposant des endpoints REST qui retournent du JSON structuré. Telegram Ads Spy utilise gramesh exclusivement — pas d'implémentation MTProto directe, pas de scraping.
Endpoints clés utilisés#
POST /channels.getSponsored
- Entrée :
{ channel_id: <int>, dc_id: <int> } - Sortie : tableau d'objets de messages sponsorisés pour le canal donné dans la région du centre de données Telegram spécifiée
- Inclut :
title,text,ctaUrl,ctaLabel,accentColor,mediaType,mediaUrl,ctaTargetUsername - URLs médias : signées, TTL d'1 heure (
/files/photo/<id>?sig=&exp=)
POST /channels.getInfo
- Entrée :
{ username: <string> | id: <int> } - Sortie : métadonnées du canal —
id,title,username,description,memberCount,avatarUrl
POST /contacts.search
- Entrée :
{ q: <string> } - Sortie : tableau d'objets de canaux correspondant à la requête
POST /channels.getSimilar
- Entrée :
{ channel_id: <int> } - Sortie : canaux similaires selon le modèle de similarité interne de Telegram
2. Pool de canaux et niveaux#
| Niveau | Nombre de membres | Intervalle d'ingestion |
|---|---|---|
| S (Super) | 1M+ | 30 minutes |
| A | 100k–1M | 2 heures |
| B | 10k–100k | 8 heures |
| C | 1k–10k | 72 heures |
| Placeholder | Inconnu | Pas d'ingestion |
3. Déduplication des créatifs#
empreinte du créatif = sha256(title + text + ctaUrl + ctaLabel + accentColor)
Un créatif est considéré comme nouveau uniquement si son empreinte n'a pas été vue auparavant. Cela signifie :
- Le même annonce dans 100 canaux produit un seul enregistrement
AdCreative - Chaque apparition dans un canal produit un enregistrement
SponsoredImpression
4. Classification des niches#
Étape 1 : Détection de marques Consultation d'un dictionnaire de ~400 marques d'annonceurs connues. Exemples :
binance→crypto1xbet→gamblingexness→forex
Étape 2 : Scoring par mots-clés Des patterns regex sont évalués pour chaque niche avec des règles de spécificité, de négation et des variantes multilingues.
Taxonomie des niches#
crypto, trading, forex, fintech, gambling, betting, vpn, dating, news, education, gaming, retail, tech, bots, adult, signals, remittance, ai, other
5. Classification géographique#
Étape 1 : Analyse du TLD de l'URL CTA
.ru → RU, .com.br → BR, .pk → PK, etc.
Étape 2 : Détection de la langue sur le texte du créatif Arabe → AR, cyrillique → RU/CIS, devanagari → HI, hangul → KR, hiragana/katakana → JP, thaï → TH.
Étape 3 : Agrégation géo au niveau du canal
Le canal dans lequel le créatif est apparu a son propre signal géo. Un créatif à domaine .com en anglais apparaissant principalement dans des canaux russophones est classifié RU.
6. Miroir média#
Le cron Telegram Ads Spy-media-mirror (toutes les 5 minutes) :
- Fetch : HTTP GET vers l'URL média signée par gramesh
- Hash : SHA-256 du contenu binaire brut
- Stockage : Écrit dans
/var/www/tgadsspy-media/<préfixe>/<sha256-hex>.<ext> - Mise à jour :
AdCreative.mediaUrlest mis à jour vers/m/<préfixe>/<sha256-hex>.<ext>
Le serveur nginx sert les chemins /m/ avec Cache-Control: public, immutable, max-age=31536000.
7. Extraction d'annonceurs#
- Annonceur de domaine : si
ctaUrlest une URL externe, le domaine enregistré devient un enregistrementAdvertiseravectype: domain - Annonceur Telegram : si
ctaUrlest une URLt.me/<username>, le nom d'utilisateur devient un enregistrementAdvertiseravectype: telegram
8. Cache d'agrégation#
Telegram Ads Spy:home:agg (TTL 120s) : nombre total de créatifs, annonceurs, canaux, niches principales, 20 créatifs récents, stats du jour.
Telegram Ads Spy:pool:stats (TTL 600s) : nombre de canaux par niveau, compte éligible aux sponsors, pays représentés.
9. Spider BFS discover-similar#
- Sélection d'ancre :
Channel.lastSimilarCheckAt IS NULL OR < NOW()-1h - Fan-out : 30 canaux par tick (chaque minute en processus)
- Cooldown d'ancre : 1 heure pour éviter de re-spider le même canal
10. Complétude des données et lacunes connues#
Couverture estimée : Pour les messages sponsorisés du cabinet EUR, la couverture est estimée à 65–75% de tous les créatifs uniques de la période.
Lacunes connues : publicité dans les groupes, messages bot-à-utilisateur, résultats bot inline, canaux très récents, canaux avec < 1k abonnés.
11. Licence des données et citation#
Toutes les données sont sous CC-BY-4.0 :
Source : tgadsspy.com · tgadsspy.com/blog/tgadsspy-classifier-pipeline-technical-deep-dive · CC-BY-4.0
Also available in:
Cite this article
tgadsspy research (2026). Plongée technique dans tgadsspy : classificateur et pipeline d'ingestion de données. tgadsspy.com. Retrieved from https://tgadsspy.com/blog/fr-tgadsspy-plongee-technique-classificateur-pipeline-2026
Licensed CC-BY-4.0 — reuse allowed including commercial, attribution required.