Inmersión técnica en tgadsspy: clasificador y pipeline de ingestión de datos
Documentación técnica del pipeline de datos de tgadsspy — integración con la API gramesh, arquitectura del clasificador de nichos (regex + pesos), pipeline geoclasificador de 3 pasos, almacenamiento con dirección de contenido SHA256 y caché de agregación. Para desarrolladores, investigadores y equipos de cumplimiento.
Propósito y audiencia#
Este documento es una inmersión técnica en cómo Telegram Ads Spy recopila, clasifica y sirve datos de anuncios de Telegram. Complementa la visión general en /about con detalles a nivel de implementación. La audiencia principal: desarrolladores que construyen sobre la API pública, investigadores que necesitan entender la procedencia de los datos para citarlos, y equipos de cumplimiento que evalúan la metodología OSINT del sistema.
1. Fuente de datos: API gramesh#
Todos los datos publicitarios en Telegram Ads Spy provienen de una única fuente: la API HTTP gramesh en api.wall.systems/gramesh. gramesh es una capa de proxy/agregación sobre el protocolo MTProto de Telegram, exponiendo endpoints REST que devuelven JSON estructurado. Telegram Ads Spy usa gramesh exclusivamente — sin implementación directa de MTProto, sin scraping.
Endpoints clave utilizados#
POST /channels.getSponsored
- Entrada:
{ channel_id: <int>, dc_id: <int> } - Salida: array de objetos de mensajes patrocinados para el canal dado en la región del centro de datos de Telegram especificado
- Incluye:
title,text,ctaUrl,ctaLabel,accentColor,mediaType,mediaUrl,ctaTargetUsername - URLs de medios: firmadas, TTL de 1 hora (
/files/photo/<id>?sig=&exp=)
POST /channels.getInfo
- Entrada:
{ username: <string> | id: <int> } - Salida: metadatos del canal —
id,title,username,description,memberCount,avatarUrl - Utilizado por el cron resolver para hidratar placeholders de Channel
POST /contacts.search
- Entrada:
{ q: <string> } - Salida: array de objetos de canal coincidentes con la consulta
- Utilizado por el cron discover con 47 consultas seed rotativas
POST /channels.getSimilar
- Entrada:
{ channel_id: <int> } - Salida: canales similares según el modelo de similitud interno de Telegram
- Utilizado por el spider BFS
discover-similaren proceso
2. Pool de canales y niveles#
El pipeline de ingestión opera sobre un pool de ~9.000+ canales. Los canales se clasifican por número de miembros, lo que determina la frecuencia de ingestión:
| Nivel | Número de miembros | Intervalo de ingestión |
|---|---|---|
| S (Super) | 1M+ | 30 minutos |
| A | 100k–1M | 2 horas |
| B | 10k–100k | 8 horas |
| C | 1k–10k | 72 horas |
| Placeholder | Desconocido | No ingesta |
3. Deduplicación de creativos#
Cuando el cron de ingestión recibe creativos, la deduplicación ocurre antes de cualquier almacenamiento:
huella del creativo = sha256(title + text + ctaUrl + ctaLabel + accentColor)
Un creativo se considera nuevo solo si su huella no se ha visto antes. Esto significa:
- El mismo anuncio en 100 canales produce un registro
AdCreative(no 100) - Cada aparición en un canal produce un registro
SponsoredImpression - Las variaciones menores (diferente
accentColorcon el mismo texto) se tratan como creativos distintos — intencional, ya que las variantes de color se usan en pruebas A/B
4. Clasificación de nichos#
Cada AdCreative se clasifica en uno o más nichos. El clasificador es un sistema de detección de palabras clave ponderadas más detección de marcas implementado en lib/niche.ts.
Arquitectura#
Paso 1: Detección de marcas Una consulta contra un diccionario de ~400 marcas conocidas de anunciantes, mapeadas a su nicho principal. Ejemplos:
binance→crypto1xbet→gamblingexness→forex
Las coincidencias de marcas tienen peso alto (w=10) y dominan la clasificación cuando están presentes.
Paso 2: Puntuación de palabras clave Para cada nicho, se evalúan patrones regex contra el texto del creativo. Los patrones están diseñados para evitar falsos positivos mediante especificidad, reglas de negación y variantes de idioma.
Taxonomía de nichos#
Nichos actuales de nivel superior (abril 2026):
crypto, trading, forex, fintech, gambling, betting, vpn, dating, news, education, gaming, retail, tech, bots, adult, signals, remittance, ai, other
5. Clasificación geográfica#
El clasificador geográfico es una cascada de 3 pasos:
Paso 1: Análisis del TLD de la URL CTA
El TLD de la URL CTA se analiza: .ru → RU, .com.br → BR, etc.
Paso 2: Detección de idioma en el texto del creativo Si el Paso 1 es ambiguo, se detecta el idioma: árabe → AR, cirílico → RU/CIS, devanagari → HI, hangul → KR, etc.
Paso 3: Agregación geo a nivel de canal El canal en el que apareció el creativo tiene su propia señal geo. Cuando un creativo aparece predominantemente en canales de idioma ruso, hereda esa geo.
6. Mirror de medios#
gramesh proporciona URLs firmadas con TTL de 1 hora. El cron Telegram Ads Spy-media-mirror (cada 5 minutos) procesa creativos con medios no espejados:
- Fetch: HTTP GET a la URL de medios firmada por gramesh
- Hash: SHA-256 del contenido binario sin procesar
- Almacenamiento: Escribe en
/var/www/tgadsspy-media/<prefijo>/<sha256-hex>.<ext> - Actualización:
AdCreative.mediaUrlse actualiza a/m/<prefijo>/<sha256-hex>.<ext>
La caché de nginx sirve rutas /m/ con Cache-Control: public, immutable, max-age=31536000.
7. Extracción de anunciantes#
La identidad del anunciante se deriva de la URL CTA:
- Anunciante de dominio: si
ctaUrles una URL externa, el dominio registrado se convierte en un registroAdvertisercontype: domain - Anunciante de Telegram: si
ctaUrles una URLt.me/<username>, el nombre de usuario se convierte en un registroAdvertisercontype: telegram
8. Caché de agregación#
Dos claves Redis se pre-calientan cada minuto:
Telegram Ads Spy:home:agg (TTL 120s)
Contiene: recuento total de creativos, anunciantes, canales, nichos principales, 20 creativos recientes, estadísticas del día.
Telegram Ads Spy:pool:stats (TTL 600s)
Contiene: recuento de canales por nivel, recuento elegible para patrocinio, países representados.
9. Spider BFS discover-similar#
Telegram Ads Spy ejecuta un spider BFS continuo usando el grafo de "canales similares" de Telegram:
- Selección de ancla:
Channel.lastSimilarCheckAt IS NULL OR < NOW()-1h - Fan-out: 30 canales por tick (cada minuto en proceso)
- Cooldown de ancla: 1 hora para evitar re-spidear el mismo canal
10. Completitud de datos y brechas conocidas#
Cobertura estimada: Para mensajes patrocinados del gabinete EUR, la cobertura se estima en 65–75% de todos los creativos únicos del período.
Brechas conocidas: publicidad en grupos, mensajes de bot a usuario, resultados de bot inline, canales muy nuevos, canales con < 1k suscriptores.
11. Licencia de datos y citación#
Todos los datos están bajo CC-BY-4.0:
Fuente: tgadsspy.com · tgadsspy.com/blog/tgadsspy-classifier-pipeline-technical-deep-dive · CC-BY-4.0
Also available in:
Cite this article
tgadsspy research (2026). Inmersión técnica en tgadsspy: clasificador y pipeline de ingestión de datos. tgadsspy.com. Retrieved from https://tgadsspy.com/blog/es-tgadsspy-inmersion-tecnica-clasificador-pipeline-2026
Licensed CC-BY-4.0 — reuse allowed including commercial, attribution required.