Aller au contenu

Automatisation de publication des données de qualité de l'air sur Mastodon#

📆 Date de publication initiale : 4 avril 2024

logo AirParif

Connaissez-vous AirParif ? Il s'agit de l'observatoire de la qualité de l'air en Ile-de-France, qui publie données, prévention et alertes sur les épisodes de pollution. Les données de l'association sont ouvertes, et il y a une API tout comme des flux OGC pour les récupérer.

logo Mastodon

Connaissez-vous Mastodon ? Présenté par Julien récemment, il s'agit d'un réseau social décentralisé et ouvert (le Fédivers), pour les non-geeks tout comme les geeks, qui propose notamment une API permettant d'automatiser des posts.

Et si on combinait les deux ? Et si on développait un bot mastodon, qui publierait sur le réseau social les données et épisodes de pollution de l'air fournis par l'API d'AirParif ? Est-ce que ça servirait à quelque chose ? Pas sûr, ça reste à voir, personnellement j'en suis pas forcément convaincu. En plus il y a l'application mobile avec les notifications qui vont bien. Bon en tout cas c'est plus ou moins l'objet de cet article.

Dans cet article, vous l'aurez compris, on va donc :

👉 Dire des trucs

👉 Faire des machins

👉 Brasser un grand volume d'air

Mais pas seulement ! On va aussi, accessoirement, entre les lignes :

🦶 Découvrir (un peu) et utiliser l'API d'AirParif pour récupérer les données de qualité de l'air et d'épisodes de pollution

🦶 Développer un programme en python qui récupère et traite ces données

🦶 Découvrir (un peu) et utiliser l'API de Mastodon pour publier des toots automatiques


Dénomination#

La première chose à faire, c'est de trouver un nom à notre bot. Eh oui, le nommage c'est important pour ne pas s'emmêler les pinceaux.

Mais tout ça, c'est après une page de pub ! Qui pourrait vous intéresser si jamais votre qarosserie ou votre data a subi un impact...


Qargrass répare, Qargrass remplace

Powered by 👉 OsGeo 👈 pour votre santé et vos trajets courts, veuillez privilégier 5 trajets à pied avec fruizélégumes ou en vélo par jour


On est de retour sur Geotribu, et à ce stade de la dénomination de notre bot, la short list est composée de 4 propositions : Patrick, Patricia, Patrice, et air_bot, avec ceci dit une légère préférence pour la dernière.

Et il n'y a pas que Paname dans la vie (il y a aussi la petite couronne), le nom air_bot est générique car le nouvel indice ATMO a vocation à normaliser les données de qualité de l'air, et est implémenté notamment au Bassin et sur la Côte d'Azur. Le reste, désolé, on s'en fiche un peu... Ah si ! Il y a peut-être la région dans les montagnes là, c'est toujours sympa pour les parigots de respirer du bon air au ski... Mais les vrai.e.s sachent que les Pyrénées c'est aussi stylé ! Et pas qu'en hiver ou au Tour de France !

Gestion de l'environnement virtuel#

Qui dit programme en Python ("programme en Python !") dit "gestion de l'environnement virtuel". Ici on va partir sur poetry, parce que quand même, un truc de geek qui s'appelle "poésie" ça claque ! Where are thou, my dear virtual_environment ? Et quand on vient du Java comme moi, c'est toujours sympa d'avoir un endroit où tout est déclaré, ça rappelle toujours des bons souvenirs, n'est-ce pas Rémi F.

On peut utiliser poetry comme ceci :

# initialiser un nouveau projet
poetry init

# ajouter un paquet dans nos dépendances, en l'occurrence la lib mastodon python
poetry add mastodon-py

# lancer une commande dans notre environnement virtuel, exemple
poetry run python script_claque_au_sol.py --help

API d'AirParif#

Partons maintenant à la découverte des données AirParif via son API.

Mais tout ça, c'est après une page de pub, qui pourrait intéresser les viandards et les viandardes à côté du grill et parfois de la plaque cet été...


Qing of the grid, Queen of the fid


On est de retour sur Geotribu, et on va maintenant aborder l'API d'AirParif.

Il y a un swagger qui liste les interactions possibles via appel HTTP. Tout comme un flux WMS sur les données en direct à l'adresse suivante : https://magellan.airparif.asso.fr/geoserver/siteweb/wms.

Demande de duplicata#

L'authentification pour un appel à l'API REST se fait grâce à une clé d'API, dont il faut faire la demande à AirParif. Et les prérogatives de la demande de duplicata sont plutôt rapides et la demande vite traitée, ce qui a été mon cas.

Pour le développement de ce bot, on aura besoin des données bulletin et prévisions, soit l'appel à cette route, qui fournit un texte écrit par le prévisionniste d'AirParif, tout comme les valeurs des 4 polluants réglementés et surveillés, en µg/m³ : NO2, O3, PM10 et PM25. On peut effectuer cet appel comme ceci en python :

API AirParif - requête bulletin
import requests
from requests import Response

AIRPARIF_API_BASE_URL = "https://api.airparif.asso.fr"
AIRPARIF_API_KEY = "tralalilalère !"

# appel à l'API sur le endpoint /indices/prevision/bulletin avec la clé renseignée dans les headers HTTP
r: Response = requests.get(
    f"{AIRPARIF_API_BASE_URL}/indices/prevision/bulletin",
    headers={"X-Api-Key": AIRPARIF_API_KEY},
)

# vérification du code de retour de l'appel
r.raise_for_status()

# récupération des données JSON dans un dictionnaire
data = r.json()

Récupération des données#

Pour récupérer l'image carto de la qualité de l'air du moment, ça peut être fait via un appel au service WMS d'AirParif, comme ceci :

API AirParif - requête WMS
from datetime import datetime
import requests
from requests import Response

AIRPARIF_WMS_BASE_URL = "https://magellan.airparif.asso.fr/geoserver/siteweb/wms"

# appel HTTP au service WMS d'AirParif
r: Response = requests.get(
    AIRPARIF_WMS_BASE_URL,
    params={
        "service": "WMS",
        "version": "1.1.0",
        "request": "GetMap",
        "layers": "siteweb:vue_indice_atmo_2020_com,Administratif:comm_idf,siteweb:idf_dept",
        "styles": "siteweb:nouvel_indice_polygones,poly_trait_blanc,poly_trait_blanc_50",
        "bbox": "530000.0,2335000.0,695000.0,2475000.0",
        "width": 600,
        "height": 500,
        "srs": "EPSG:27572",
        "format": "image/png",
        "format_options": "layout:bulletin",
    },
    stream=True,
)

# vérification du code de retour de l'appel (toujours !)
r.raise_for_status()

# enregistrement de l'image récupérée vers un fichier png, qui porte le nom de la date et l'heure
with open(f"airparif_idf_{datetime.now().strftime('%Y%m%d%H%M%S')}.png", "wb") as f:
    r.raw.decode_content = True
    shutil.copyfileobj(r.raw, f)

Une fois le code ci-dessus exécuté, on se retrouve avec l'image de la carte de la qualité de l'air du jour enregistrée sur le disque :

Carte de la qualité de l'air du moment

Info

La couche WMS appelée siteweb:vue_indice_atmo_2020_com_jp1 permet de récupérer la carte du lendemain quand elle est disponible (à partir de 11h généralement).

Mastodon automatique#

Découvrons maintenant l'automatisation de posts sur le réseau social Mastodon, au travers de son API.

Mais tout ça, c'est après une page de pub, qui pourrait intéresser les mélomanes endiablé/es sur les campings cet été...


La Qompile des tubes pour l'été, les meilleurs hits par DJ Frangis Qabrel


On est de retour sur Geotribu, et on va aborder la partie Mastodon, le réseau social sur lequel publiera notre bot.

Choix de l'instance#

Il nous faut à présent choisir une instance pour créer le compte de notre bot. Il y a deux options possibles à mes yeux :

  • l'instance botsin.space, "une instance pour les bots et les alliés des bots", qui est parfois instable du fait du zbeul qui règne dessus
  • l'instance mapstodon.space, mise en place pour les géo* grâce à Jérémy et les admins
    Ça part sur la deuxième option, merci Jérémy !

On peut suivre l'article de Julien pour dérouler la création d'un compte.

Configuration du compte Mastodon#

Configurons à présent le bot pour poster de manière automatique.

La première chose à faire est de cocher la case This is an automated account dans Preferences > Public profile :

Écran case compte automatique dans les paramètres Mastodon

Ensuite, il nous faudra créer une "Application" dans la partie Development, qu'on appelle "Patrick" "air_bot", en vérifiant que le scope write soit coché (pas besoin pour le moment des autres scopes). Tout ceci va nous permettre de récupérer un access_token permettant de nous connecter en python à l'API :

Ecran application Mastodon

Le token qui fout les j'tons

Il est conseillé de noter quelque part ce token, sur un post-it idéalement.

On programme aussi une suppression automatisée des posts, dans l'onglet "Automated post deletion", pour ne pas surcharger l'instance. On peut par exemple supprimer les toots postés il y a plus d'1 mois :

Écran suppression automatique des posts

API Mastodon#

Mastodon permet d'automatiser des posts, et ce dans plusieurs langages de programmation. Nous allons donc utiliser l'API en python, dont la doc est disponible 👉 ici 👈

Pour notre besoin du moment, on pourra simplement utiliser la méthode status_post, qui permet de poster automatiquement des toots avec notre compte nouvellement créé :

Ecran doc Mastodon méthode status_post

Warning

Selon les instances utilisées, la longueur max des posts est variable. Sur mapstodon.space la limite est de 500 caractères, émojis compris ❤ !

Posts totomatiques#

Utilisons maintenant l'API mastodon en python, comme ceci :

API Mastodon - post automatique
from mastodon import Mastodon

MASTODON_INSTANCE = "https://mapstodon.space"
MASTODON_ACCESS_TOKEN = "tralalilalère !"

# création d'un objet connexion à Mastodon
mastodon = Mastodon(
    api_base_url=MASTODON_INSTANCE,
    access_token=MASTODON_ACCESS_TOKEN
)

# création et postage d'un toot automatique avec une image
mastodon.status_post(
    status="Bonjour 👋 le vrai sens de la vie réside dans le fromage 🧀💟",
    media_ids=[
        mastodon.media_post(
            "/chemin/vers/image/de/fromage.png",
            mime_type="image/png",
            description="Image du paradis",
        )
    ],
    visibility="unlisted",
    language="fr",
)

Info

Ici on publie les posts en langue française et avec la visibilité "unlisted", ce qui signifie que les toots seront visibles pour les followers et sur la page de profil du bot, mais pas dans les "Live feeds" du serveur mapstodon.space ou fédéré. On évite de trop spammer les gens quoi.

Et maintenant ?#

Le code du bot implémenté avec AirParif est disponible sur GitHub.

Les posts automatiques du bot sont configurés de la manière suivante, tous les jours :

  • le bulletin de la journée à 8h, avec la carte de la journée
  • le bulletin du lendemain à 18h, avec la carte du lendemain
  • les épisodes potentiels de pollution du lendemain à 19h

Viendez !#

Nous venons de voir comment publier sur Mastodon les données d'AirParif. Or ce ne sont pas les seules données de qualité de l'air disponibles et ouvertes ! Les autres régions proposent également leurs services de données ouvertes ATMO :

Et ...

Et ...

Et enfin ...

Et aussi !

📢 N'hésitez pas à contribuer à ce bot, ou à en créer d'autres pour diffuser les données de votre région / pays ! Je suis disponible pour fournir des access_token et publier les données via ce bot air_bot@mapstodon.space.

Auteur·ice#

Guilhem Allaman#

Je suis ingénieur informaticien. J'aime les ordinateurs. Mais ce que j'aime par-dessus tout (oh oui !), c'est itérer, et ce de manière agile, transverse et langoureuse, de bon matin, dès l'aube, à l'heure où blanchit le dashboard du sprint backlog.

Basé à Paris, j'ai commencé par le développement Java avant de découvrir les joies des SIG et de m'y spécialiser.

Licence Beerware #

Ce contenu est sous licence Beerware (Révision 42).
Les médias d'illustration sont potentiellement soumis à d'autres conditions d'utilisation.

Réutiliser, citer l'article

Tant que vous conservez cette licence :

  • vous pouvez faire ce que vous voulez de ce contenu
  • si vous rencontrez l'auteur/e un jour et que vous pensez que ce contenu vaut le coup, vous pouvez lui payer un coup en retour

Citer cet article :

"Automatisation de publication des données de qualité de l'air sur Mastodon" publié par Guilhem Allaman sur Geotribu - Source : https://geotribu.fr/articles/2024/2024-04-04_airbot_mastodon_qualite_air/

Commentaires

Afin de favoriser les échanges constructifs, merci de préférer le pseudonymat à l'anonymat. Pour rappel, l'adresse mail n'est pas exposée publiquement et sert principalement aux notifications de réponse. Les commentaires sont automatiquement republiés sur nos réseaux sociaux pour favoriser la discussion. Consulter la page sur la confidentialité et les données personnelles.
Une version minimale de la syntaxe markdown est acceptée pour la mise en forme des commentaires.
Propulsé par Isso.

Ce contenu est sous licence Beerware Pictogramme BeerWare