
Architecture Réelle et Fonctionnement Détaillé pour récuperer les annonces de Meta (Facebook & Instagram) et d'autres régies.
Le système d'orchestration LMVI représente une solution technique sophistiquée conçue pour surmonter les limitations inhérentes aux APIs publicitaires. Cette architecture avancée permet la gestion efficace de la collecte de données à grande échelle, essentielle pour l'analyse publicitaire multiplateforme.
Une présentation vidéo est disponible pour comprendre visuellement le fonctionnement global du système. Elle illustre les interactions entre les différents composants et les flux de données qui caractérisent cette architecture distribuée.

LMVI.IO utilise une architecture distribuée qui permet de répartir intelligemment la charge des requêtes API sur l'ensemble de la journée. Cette conception répond aux limitations strictes imposées par les plateformes publicitaires tout en garantissant une collecte de données exhaustive et fiable.
Le système s'appuie sur trois couches de collecte complémentaires qui fonctionnent en synergie pour assurer l'intégrité des données et optimiser l'utilisation des ressources disponibles.
Architecture en 3 couches avec orchestration Airflow et base PostgreSQL
Inventory, Compliant et Detail fonctionnant en séquence coordonnée
Système de minutes et stockage optimisé pour le load balancing
Interface API avec deux mutations distinctes pour les différentes phases
Découvre les page_ids et attribue les minutes
Sécurité anti-perte avec page_id temporaire
Collecte intensive distribuée sur 24h
Cette architecture en trois couches assure une couverture complète tout en optimisant l'utilisation des quotas API disponibles. Les trois collecteurs travaillent en synergie pour garantir l'intégrité des données.
Les tables critiques incluent db_network (réseaux), db_advertiser_id (Page IDs et minutes), db_ad_id (ads individuelles) et db_minutes_load (charge par minute). Cette structure permet une gestion précise et efficace des données publicitaires.

La base de données PostgreSQL constitue le cœur du système LMVI.IO, avec une structure relationnelle optimisée pour la gestion des données publicitaires. Les tables sont conçues pour maintenir l'intégrité référentielle tout en permettant une récupération efficace des informations.
Les relations entre les tables permettent de naviguer facilement des réseaux publicitaires jusqu'aux annonces individuelles, en passant par les annonceurs et leurs attributs spécifiques. Cette conception facilite également le système de distribution temporelle essentiel au bon fonctionnement de la plateforme.
CREATE TABLE db_minutes_load (
id_db_network bigint, -- 1=FB, 2=TikTok, 3=Google
minute_fetch integer, -- 0 à 1439 (00:00 à 23:59)
qty_ad_id_fetchs bigint, -- Charge actuelle
is_active boolean
);
Cette table contient 1440 slots (un par minute de la journée) pour chaque réseau publicitaire, permettant une distribution optimale des requêtes API sur 24 heures.
La fonction calcul_minute_fetch_from_ad_id() attribue intelligemment une minute optimale à chaque page_id :
Résultat : chaque page_id reçoit une minute optimale minimisant les surcharges API.
Utilisée par le collecteur Inventory pour traiter les page_ids :
Utilisée par les collecteurs Compliant et Detail :
Ces deux mutations GraphQL forment l'interface principale pour l'insertion et la mise à jour des données dans le système, avec des mécanismes robustes pour gérer les différents scénarios de collecte.
Sans gestion intelligente des tokens, ces limites deviendraient rapidement un goulot d'étranglement pour la collecte de données à grande échelle.
-- Fonction z_db_get_best_token_network()
SELECT x_id, token, nb_fetch, max_use
FROM db_token t
INNER JOIN db_network n ON t.id_db_network = n.x_id
WHERE n.surname_network = 'FB' -- Spécifique au réseau
AND t.status = 'active'
AND t.nb_fetch < t.max_use
ORDER BY t.nb_fetch ASC, -- Moins utilisé en premier
t.last_use ASC -- Plus ancien en priorité
LIMIT 1;
Après chaque utilisation, le compteur du token est incrémenté : UPDATE db_token SET nb_fetch = nb_fetch + :count, last_use = NOW() WHERE x_id = :token_id;
API Call: search_terms=* fields=id,page_name,page_id
Résultat: page_id 123456789 + ad_id 987654321
Action: Attribution minute 847 (14:07) au page_id
API Call: search_terms=* fields=id unmask_removed_content=false
Résultat: Peut découvrir d'autres ads avant inventory
Action: Stockage avec page_id 'AAAAAAAAAAAAAAAAAAAAAAAAAA'
Requête: SELECT advertiser_id FROM db_advertiser_id WHERE fetch_time_minute = 847
API Call: search_page_ids=123456789 fields=30+_champs
Résultat: Toutes les métriques de ce page_id
Action: Stockage complet des données
Les annonces publicitaires peuvent être découvertes dans un ordre non prévisible :
Sans système de secours, les données découvertes par Compliant avant Inventory pourraient être perdues ou mal associées.
-- Dans f_upsert_adid_lot ligne 348 :
PERFORM f_upsert_adv_unit(
v_ad->>'id', -- ad_id trouvé
'', -- nom vide
'AAAAAAAAAAAAAAAAAAAAAAAAAA', -- PAGE_ID PAR DÉFAUT !
...
);
Toutes les annonces découvertes par Compliant avant Inventory sont temporairement associées à ce page_id par défaut, garantissant leur stockage.
L'auto-correction intelligente est ensuite appliquée lorsque le véritable page_id est découvert par Inventory, assurant l'intégrité des données sans aucune perte possible.
Configuration pour la découverte des page_ids :
Configuration pour le scan de sécurité :
Configuration pour la collecte détaillée :
Cette approche de configuration dynamique permet de modifier les paramètres de collecte sans redéploiement du code, offrant une grande flexibilité pour s'adapter aux changements d'API.
/dags/facebook/
├── facebook_fetchs_inventory.py # 05:05 quotidien
├── facebook_fetchs_compliant.py # 06:05 quotidien
├── facebook_fetchs_unit.py # Manuel
└── facebook_logic.py # Logique commune
/dags/tiktok/ # Structure identique
/dags/google/ # Structure identique
Cette organisation modulaire permet une maintenance simplifiée et une isolation claire entre les différentes régies publicitaires.
Le DAG Detail est généré dynamiquement par minute :
# Génération dynamique pour les 1440 minutes
for minute in range(1440): # 0 à 1439
# À chaque minute, vérifier s'il y a des page_ids
page_ids = query_page_ids_for_minute(minute)
if page_ids:
# Lancer fetch detail pour ces page_ids
fetch_detail_for_page_ids(page_ids)
Cette approche permet d'exécuter les collectes Detail exactement au moment prévu pour chaque page_id, assurant une distribution optimale des requêtes API.
Répartition dans db_minutes_load :
Le système assure ainsi une répartition automatique selon la charge, évitant les pics d'utilisation API.
Création d'un nouveau répertoire avec les fichiers nécessaires :
/dags/linkedin/
├── linkedin_share.py # Constantes adaptées
├── token_utils.py # OAuth2 LinkedIn
├── config_loader.py # Configuration
├── linkedin_logic.py # Logique principale
└── linkedin_logic_unitaire.py
Création des 3 DAGs avec la même structure que les régies existantes :
Insertion du nouveau réseau et des paramètres de configuration :
INSERT INTO db_network (surname_network) VALUES ('LINKEDIN');
INSERT INTO tb_config_params VALUES
('LINKEDIN_INVENTORY_CONFIG', '{ API config }'),
('LINKEDIN_COMPLIANT_CONFIG', '{ API config }'),
('LINKEDIN_DETAIL_CONFIG', '{ API config }');
Génération automatique des 1440 slots pour le nouveau réseau :
INSERT INTO db_minutes_load (id_db_network, minute_fetch, qty_ad_id_fetchs)
SELECT 4, minute, 0
FROM generate_series(0, 1439) minute;
Le système sélectionne automatiquement la minute suivante la moins chargée, garantissant une répartition optimale même en cas de forte charge.
Tout est en UTC. Les minutes sont absolues depuis minuit UTC, assurant une cohérence globale indépendamment de l'emplacement des serveurs ou des utilisateurs.
Non, le load balancing est automatique pour optimiser la répartition. Forcer une minute spécifique compromettrait l'équilibrage de charge du système.
Il conserve sa minute attribuée mais ne sera plus interrogé par le fetch detail, préservant ainsi les ressources API pour les page_ids actifs.
Pour déboguer un problème de collecte, suivez cette méthodologie :
Pour toute question technique ou assistance, n'hésitez pas à contacter :
Inventory, Compliant et Detail fonctionnant en synergie pour une couverture complète
Répartition optimale sur 24h pour maximiser l'utilisation des quotas API
Aucune perte grâce au système anti-perte et à la triple couverture
Le système d'orchestration LMVI.IO représente une solution technique sophistiquée pour surmonter les limitations des APIs publicitaires. Son architecture distribuée, ses mécanismes de sécurité et sa capacité d'auto-correction en font une plateforme robuste pour la collecte de données à grande échelle.
Pour toute question supplémentaire ou pour une démonstration pratique du système, n'hésitez pas à contacter l'équipe technique.
Système d'Orchestration LMVI.IO