Bonjour et merci
! Je ne sais pas si tu parles du processus qui m’a amené à créer l’appli ou si tu parles de son fonctionnement technique. Dans le doute je vais expliquer les deux, ça pourra toujours servir de documentation et j’avais de toute façon prévu de publier quelque part mon travail exploratoire et mes motivations 
Concernant la raison d’être de cette application, je compte mettre en ligne une instance Mobilizon pour les structures locales qui organisent des événements et qui passent presque toutes par facebook ou instagram pour les diffuser
. J’ai vu qu’il y avait un outil d’import disponible (qui semble ne plus fonctionner depuis quelques semaines
) mais ça ne me convenait pas vraiment.
Je voulais que l’import soit plus complet avec notamment la récupération de l’artwork de l’événement car le visuel est souvent très important ainsi que les infos sur la localisation. Je voulais aussi que le processus soit plus souple et qu’on puisse modifier et compléter les données. Et enfin je voulais que l’appli soit plus intégrée à mon instance Mobilizon. Pour cela j’ai fait en sorte que l’utilisateur n’ait pas à renseigner l’adresse de son instance si celle-ci est passée dans l’URL. De cette façon on peut mettre le lien avec l’URL de l’instance directement dans le menu de l’instance et l’appli sait alors directement à quelle instance se connecter.
Côté technique, j’ai en fait développé 2 applications : une interface utilisateur (le client) qui coordonne tout et une appli serveur dont la mission est de récupérer les données des événements sur les différentes plateformes. J’aurais aimé que tout se fasse côté client dans le navigateur mais techniquement ce n’est pas possible à cause des limitations liées à la sécurité intégrées aux navigateurs (CORS pour les intimes). Il y aussi le fait que certaines plateformes détectent la façon dont on “charge” leurs pages et qu’elles peuvent bloquer l’accès aux données (voir plus bas). D’un autre côté ça pourrait me permettre plus tard d’avoir des statistiques anonymes sur l’utilisation de l’application (par exemple savoir quelles sont les plateformes les plus utilisées et détecter les bugs).
Concernant l’application client (l’interface utilisateur), le fonctionnement est très simple, elle va utiliser l’API d’une instance Mobilizon pour authentifier l’utilisateur (avec oAuth) et récupérer ses identités et ses groupes ainsi que la configuration de l’instance. Elle va ensuite demander à l’appli serveur d’aller “scraper” les données de l’événement avec l’URL fournie par l’utilisateur puis elle va mettre tout ça en forme pour les afficher dans un grand formulaire. Enfin, une fois validé, elle va envoyer l’événement à l’API de l’instance Mobilizon pour l’enregistrer. Un jeu d’enfant grâce à l’API de Mobilizon
.
Côté appli serveur (le scrapeur), c’est là que ça se complique en particulier pour facebook et instagram qui font tout pour empêcher qu’on vienne récupérer les données
. Il n’y a plus d’API disponible pour accéder aux événements sur ces deux plateformes (ou alors les conditions d’accès sont hors de portée) et le code source de la page est conçu de telle façon à ce qu’un outil automatisé ne puisse pas se repérer dans la page et donc ne puisse pas trouver les info recherchées.
Cependant à y regarder de plus près les données intéressantes sont quand même disponibles de façon structurée directement dans la page initialement chargée (sous la forme d’objets JSON) afin d’optimiser le chargement (et donc économiser un appel à l’API). Évidemment ce n’est pas idéal car la structure de ces données est d’une part assez complexe avec pas mal de cas différents à prévoir et, d’autre part, est susceptible d’évoluer auquel cas il faudra réadapter le code de l’appli
. Ce préchargement pourrait également être purement et simplement supprimé…
Il faut aussi noter que ces plateformes vont chercher à savoir comment sont chargées les pages pour en tirer certaines infos : qui charge la page ? une vraie personne ? un robot ? est-ce que c’est google pour le référencement ? est-ce que c’est un robot qui vient “voler” du contenu (oui
) ? Évidemment le but du jeu consiste à se faire passer pour un utilisateur légitime
: soit une vraie personne, soit un moteur d’indexation. Après avoir essayé de nombreuses combinaisons il semble que ce qui fonctionne le mieux est de se faire passer pour un utilisateur non connecté de façon à avoir toutes les données (une page très simplifiée est servie aux moteurs de recherche) et à éviter les mécanismes de sécurité (les challenges du type “êtes-vous un robot ?”
) qui sont compliqués à contourner. Pour cela j’ai utilisé un programme qui “simule” le fonctionnement d’un “vrai navigateur” (puppeteer).
J’ai également essayé de charger les pages facebook avec l’identifiant de session d’un vrai utilisateur (moi-même) mais la plateforme comprend vite que quelque chose cloche quand l’adresse IP change. J’ai abandonné cette option sachant que venir scraper le contenu et ainsi enfreindre les CGU de Meta en étant identifié personnellement n’est pas forcément une très bonne idée
.
Au final on peut accéder aux données voulues mais cela demande pas mal de ressources serveur liées à l’instanciation de puppeteer. Il faut aussi garder en tête que la protection qui est mise en place par ces plateformes pour empêcher l’accès aux données par des robots pourrait facilement être renforcée à tout moment et l’application pourrait ne plus fonctionner
.
A noter également que certaines plateformes (bizarrement pas celles de Meta, sûrement parce qu’ils ont pléthore de ressources) sont très restrictives par rapport aux adresses IP qui viennent les visiter. J’ai donc ajouté dans mon code la possibilité de passer par un proxy, c’est à dire un service (payant…
) qui permet de charger les pages avec une adresse IP qui n’est pas identifiable comme venant d’un pays étranger ou d’un datacenter afin de maximiser les chances de ne pas être bloqué. Je verrai si je continue de payer un proxy sachant que le blocage ne concernait qu’une seule plateforme (je ne sais plus laquelle). Il existe aussi des proxy gratuits mais leur efficacité est moindre… à tester.
Concernant le format des données, en dehors de facebook et instagram qui gardent jalousement leurs précieuses données (qui sont en fait les nôtres
), on peut noter que toutes les autres plateformes intègrent des meta-données facilement lisibles sous forme de scripts json-ld avec la plupart des informations intéressantes. Les données sont décrites avec le vocabulaire issu de schema.org qui a été popularisé par Google qui l’utilise pour le référencement (oui parfois les GAFAM encouragent l’interopérabilité
). On peut se satisfaire des données récupérées de cette façon mais pour Hello Asso j’ai quand même créé un script qui vient chercher des données supplémentaires dans le code HTML de la page afin d’avoir des données encore plus complètes.
Toujours concernant le format des données il faut préciser qu’Instagram est un cas particulier car à aucun moment la plateforme ne prévoit de pouvoir enregistrer des événements en tant que tels. Elle est malgré tout très utilisée à cette fin et je voulais donc l’intégrer au projet. Comme les dates et horaires des événements ne sont pas identifiés en tant que tels, j’ai créé un algorithme assez sommaire mais qui fonctionne la plupart du temps pour reconnaître les dates et horaires dans la description du post. Notez que ça ne fonctionne que pour du texte en français. L’algo analyse également la description de l’image du post destinée à l’accessibilité générée par l’IA de Meta (enfin un bon usage des LLM ?
).
En parlant d’IA, j’ai évidemment pensé à passer par une IA qui lirait directement la page pour isoler les éléments intéressants et m’éviter ainsi tous ces longs et fastidieux développements. J’ai choisi de ne pas le faire pour des raisons éthiques. Je pense que ce n’est pas la direction à suivre si on utilise un projet comme Mobilizon mais ça n’est que mon avis et je reste ouvert au débat. (Side note très éloignée du sujet : Intégrer un serveur MCP à Mobilizon pour que les événements enregistrés soient accessibles aux assistants IA, une hérésie ?
).
Et puisqu’on parle d’éthique, certains pourraient se demander si ça ne soulève pas un problème éthique de venir piller le contenu d’un site comme Hello Asso. Pour ma part je pense que la finalité rend l’action tout à fait légitime et que de toute façon l’utilisateur intéressé par l’événement se rendra sur la plateforme pour acheter ses tickets (avec une jolie commission inch allah). D’ailleurs l’outil d’import place automatiquement le lien de l’événement sur la plateforme en tant que lien vers la billetterie
.
Voilà, j’aurais sans doute d’autres choses à raconter mais je vais m’arrêter là étant donné que la question précisait “en quelques mots”
. Néanmoins je pense que toutes ces explications pourront servir à quelqu’un qui aurait un projet similaire.