En février, j'examinais comment récupérer les conditions et prévisions météorologiques de Yahoo Weather avec un programme écrit en Pascal. Avec la récente installation de Free Pascal / Lazarus sur Ubuntu 18.04, j'ai décidé d'étendre l'étude à d'autres IPA (interface de programmation d'applications; API de l'acronyme anglais Application Programming Interface est plus courant) : Apixu, Dark Sky, MET Norway, OpenWeatherMap et Weatherbit.io.
Table des matières
- Architecture REST
- Support linguistique
- Spécification de l'endroit
- Prévisions météorologiques et données historiques
- Mises à jour des données
- Limites
- Programmes de démonstration
Architecture REST
Formellement, ces services sont plus ou moins conformes à l'architecture REST : une ressource, comme les conditions atmosphériques à un endroit précis, est obtenue d'un serveur Web avec une requête HTTP ou HTTPS formatée correctement. En principe, le protocole doit être sans état : serveur et le client ne devrait conserver aucune information. Ainsi, chaque requête est indépendante, sans lien avec la précédente ou la suivante. Il faut donc que chaque requête provenant du client contienne toute l'information nécessaire pour obtenir la ressource désirée et que la réponse du serveur contienne toute l'information exigée.
En pratique, les sites conservent de l'information au sujet de chaque requête. À deux exceptions près, les requêtes HTTP/HTTPS faites à un serveur doivent contenir une « clé » que l'on obtient en s'enregistrant auprès du fournisseur. Ainsi ces derniers peuvent comptabiliser l'utilisation pour fin de tarification. Lorsqu'un fournisseur exige une clé même pour son service gratuit c'est qu'il limite l'utilisation de ses serveurs en espérant vendre un abonnement à l'un de ses services plus performants ultérieurement. Aucun fournisseur n'offre l'accès illimité à ses services alors vraisemblablement, Yahoo Weather et MET Norway utilisent l'adresse IP du client pour contrôler le nombre de requêtes faites.
Voici la requête qu'il faut envoyer pour obtenir les conditions courantes à Paris en Ontario. Cette communauté canadienne d'un peu plus de 12 000 âmes est l'une des 17 communautés du même nom répertorier par le service de géolocalisation de Yahoo.
Les cinq derniers exemples ont la forme classique d'une URL et d'une
chaîne de requête joint par le séparateur «?». Cette dernière est constituée
d'un ou de plusieurs couples champ=valeur démarqués
par le séparateur «&». Le premier exemple suit ce schéma, mais la valeur
du champ q (sans doute une abréviation de query, le mot
anglais signifiant requête) est en fait une expression qui se plie à la
définition de la langue de requête structurée de Yahoo, YQL, dont la syntaxe
est de type SQL.
Le plus souvent des éléments peuvent être ajoutés à la requête pour spécifier le format de la réponse, les unités des mesures météorologiques ou la langue de la réponse. Yahoo Weather n'offre pas cette dernière possibilité alors que MET Norway n'offre aucune de ces options.
Tous les services acceptent des requêtes faites avec le protocole HTTP sécurisé (HTTPS). Dark Sky refuse les requêtes qui ne sont pas sécurisées, Yahoo Weather et MET Norway les redirigent vers le protocole sécurisé et OpenWeatherMap, Weatherbit.io et Apixu les acceptent.
Presque tous les serveurs retournent les données météorologiques formatées en JSON ou XML mais le format par défaut est différent selon le service. L'exception est MET Norway qui n'utilise que le XML et Apixu où il faut spécifier le format désiré, car l'adresse Web est différente selon le format désiré.
Le tableau suivant résume cette information au sujet des protocoles acceptés pour les requêtes, la nécessité de s'enregistrer pour obtenir une clé et les formats disponibles pour les résultats. Les liens dans le tableau sont vers les pages d'enregistrement pour obtenir une clé. C'est gratuit et il n'est pas nécessaire de fournir d'information autre qu'une adresse de courriel valide.
| Service | Protocol | Clé | Format | |||
|---|---|---|---|---|---|---|
| HTTPS | HTTP | JSON | XML | Autre | ||
| Apixu | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| Dark Sky | ✓ | ✗ | ✓ | ✓ | ✗ | ✗ |
| MET Norway | ✓ | ← | ✗ | ✗ | ✓ | ✗ |
| OpenWeatherMap | ✓ | ✓ | ✓ | ✓ * | ✓ | HTML |
| Weatherbit.io | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
| Yahoo Weather | ✓ | ← | ✗ | ✓ | ✓ * | ✗ |
(*) dénote le format par défaut de la réponse lorsqu'un
format n'est pas
spécifié dans la requête et qu'il y a plus d'une
possibilité.
Évidemment, chaque service présente les données à sa façon, il serait bien trop simple qu'ils adoptent un gabarit JSON uniforme. D'ailleurs, les données météorologiques courantes retournées par les services ne sont pas les mêmes. Toutefois, certaines observations sont universellement disponibles dont la température, l'humidité, et la pression atmosphérique. En revanche, la nébulosité et la précipitation le cas échéant ne sont pas disponibles de tous les services.
Support linguistique
Tous les services donnent une courte description des conditions atmosphériques. C'est souvent qu'un seul mot tel « nuageux» ou « orages », mais le texte peut aussi être plus long.
Presque tous les serveurs utilisent l'anglais par défaut pour ces descriptions. On peut toutefois spécifier une autre langue, mais la liste des langues prises en charge est différente d'un fournisseur à l'autre. Les principales langues européennes, le français, l'espagnol, l'allemand, etc. sont toutes disponibles. Les exceptions sont Yahoo Weather et MET Norway qui n'utilisent que l'anglais et le norvégien respectivement.
| Apixu | Dark Sky | OpenWeatherMap | Weatherbit.io | |
|---|---|---|---|---|
| ar - Arabic | ✓ | ✓ | ✓ | |
| az - Azerbaijani | ✓ | ✓ | ||
| be - Belarusian | ✓ | ✓ | ||
| bg - Bulgarian | ✓ | ✓ | ✓ | |
| bs - Bosnian | ✓ | ✓ | ||
| ca - Catalan | ✓ | ✓ | ✓ | |
| cz - Czech | ✓ | ✓ | ✓ | |
| da - Danish | ✓ | ✓ | ✓ | |
| de - German | ✓ | ✓ | ✓ | ✓ |
| el - Greek | ✓ | ✓ | ✓ | ✓ |
| en - English | ✓ | ✓ | ✓ | ✓ |
| es - Spanish | ✓ | ✓ | ✓ | |
| et - Estonian | ✓ | ✓ | ||
| fa - Persian (Farsi) | ✓ | |||
| fi - Finnish | ✓ | ✓ | ✓ | ✓ |
| fr - French | ✓ | ✓ | ✓ | ✓ |
| gl - Galician | ✓ | |||
| hi - Hindi | ✓ | |||
| he - Hebrew | ✓ | |||
| hr - Croatian | ✓ | ✓ | ✓ | |
| hu - Hungarian | ✓ | ✓ | ✓ | ✓ |
| id - Indonesian | ✓ | ✓ | ||
| is - Icelandic | ✓ | ✓ | ||
| it - Italian | ✓ | ✓ | ✓ | ✓ |
| ja - Japanese | ✓ | ✓ | ✓ | |
| jv - Javanese | ✓ | |||
| ka - Georgian | ✓ | |||
| ko - Korean | ✓ | |||
| kr - Korean | ✓ | ✓ | ||
| kw - Cornish | ✓ | ✓ | ||
| la - Latvian | ✓ | |||
| lt - Lithuanian | ✓ | ✓ | ||
| mk - Macedonian | ✓ | |||
| mr - Marathi | ✓ | |||
| nb - Norwegian Bokmål | ✓ | ✓ | ||
| nl - Dutch | ✓ | ✓ | ✓ | ✓ |
| no - Norwegian Bokmål | ✓ | |||
| pa - Punjabi | ✓ | |||
| pl - Polish | ✓ | ✓ | ✓ | ✓ |
| pt - Portuguese | ✓ | ✓ | ✓ | ✓ |
| ro - Romanian | ✓ | ✓ | ✓ | ✓ |
| ru - Russian | ✓ | ✓ | ✓ | ✓ |
| se - Swedish | ✓ | |||
| si - Sinhalese | ✓ | |||
| sk - Slovak | ✓ | ✓ | ✓ | |
| sl - Slovenian | ✓ | ✓ | ✓ | |
| sr - Serbian | ✓ | ✓ | ✓ | |
| sv - Swedish | ✓ | ✓ | ✓ | |
| ta - Tamil | ✓ | |||
| te - Telugu | ✓ | |||
| tet - Tetum | ✓ | |||
| tr - Turkish | ✓ | ✓ | ✓ | ✓ |
| ua - Ukrainian | ✓ | |||
| uk - Ukrainian | ✓ | ✓ | ✓ | |
| ur - Urdu | ✓ | |||
| vi - Vietnamese | ✓ | ✓ | ||
| zh - Chinese Simplified | ✓ | ✓ | ✓ | ✓ |
| zh_cmn - Mandarin | ✓ | |||
| zh_hsn - Xiang | ✓ | |||
| zh_tw - Chinese Traditional | ✓ | ✓ | ✓ | ✓ |
| zh_wuu - Wu (Shanghainese) | ✓ | |||
| zh_yue - Yue (Cantonese) | ✓ | |||
| zu - Zulu | ✓ |
Il y a duplication comme l'ukrainien. OpenWeatherMap le dénote avec le code «ua» alors que les autres fournisseurs utilisent «uk». Il me semble que ces derniers ont raisons, car «uk» est le code (ISO 639-1) pour la langue alors que «ua» est le code (ISO 3166-1 alpha 2) pour l'Ukraine.
Tous les services accompagnent la description textuelle de conditions courantes d'un code numérique. Évidemment, les codes sont différents selon le fournisseur. On retrouve la liste des codes sur leur site Web et ainsi on peut plus facilement prendre en charge la traduction du texte s'il n'est pas possible de l'obtenir dans la langue désirée.
Spécification de l'endroit
Certains services offrent plus d'une façon d'identifier l'endroit pour lequel les mesures météorologiques sont désirées. Dans tous les cas, les coordonnées de l'endroit (latitude et longitude) peuvent être utilisées. D'ailleurs, c'est la seule méthode acceptée par Dark Sky et MET Norway.
Les autres fournisseurs (Apixu, OpenWeatherMap, Weatherbit.io et Yahoo Weather) acceptent le nom d'une localité. Si c'est naturel et pratique d'utiliser cette façon de spécifier un endroit, il faut composer avec une réalité : il peut y avoir plusieurs endroits avec un même nom. Natif de Montréal au Québec, j'ai trouvé cocasse de me retrouver à Montréal en Aude il y a quelques années. En fait, il y a une Association des Montréal de France et d'Europe qui regroupe 7 communautés, dont 6 en France. La base de données WOEID (Where on Earth Identifier) de Yahoo associe « Montréal » à 9 endroits et « Montreal » à 27. Pour contourner ce type de problème somme toute assez courant, les fournisseurs ajoutent un ou deux champs supplémentaires pour spécifier le pays et, éventuellement, une région administrative.
Il y a d'autres façons plus précises de spécifier l'endroit dont le code postal ou le code de la station météo ou de l'aéroport les plus près. Certains services ont une liste de localités avec un identificateur unique pour chacune. Cela évite toute ambiguïté pour autant qu'on sache l'identificateur pour la localité visée.
| Service | Lat/Long | Endroit | Identificateur | Code postal | IP | Autre |
|---|---|---|---|---|---|---|
| Apixu | ✓ | Ville et région ou pays | ✗ | EU, GB et CA | ✓ | IATA et OACI |
| Dark Sky | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| MET Norway | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| OpenWeatherMap | ✓ | Ville et pays | OpenWeather | ✓ | ✗ | ✗ |
| Weatherbit.io | ✓ | Ville, région et pays | Weatherbit.io | ✓ | ✓ | OACI et station météo |
| Yahoo Weather | ✓ | Ville et région ou pays | WOEID | ✓ | ✗ | ✗ |
On peut télécharger les bases de données pour les identificateurs de localité de OpenWeather et Weatherbit.io. Il suffit de suive le lien dans le tableau ci-dessus. La base de données WOEID était disponible publiquement de 2009 à 2012. Pour autant que je sache, on ne peut plus la télécharger, mais on y a accès avec des requêtes YQL envers l'IPA de Yahoo.
En principe, les coordonnées, les codes d'aéroport IATA ou OACI et les
identificateurs de stations météo ne causent aucunes difficultés. L'identificateur
des localités de OpenWeather, Weatherbit.io et Yahoo Weather devraient être aussi
précis. Toutefois ce n'est pas exactement le cas. Si l'on examine une partie
de la base de données de OpenWeatherMap (city.list.json) pour
ce qui est de Montréal et Montreal en France on trouve plusieurs endroits
différenciés seulement par leurs coordonnées géographiques.
Il faudra trouver ailleurs les coordonnées pour déterminer si la région
est l'Aude (Occitanie), l'Ardêche (Rhônes-Alpes), la Bourgogne et ainsi
de suite. C'est plus ou moins le même problème avec la base de données
de Weatherbit.io nommé cities_all.csv.
Malheuresuement, la base states.csv est peu loquace quant au
code régional 76.
On peut essayer les codes des villes pour obtenir les coordonnées des endroit et ainsi déterminer leur nom précis.
La première est Montréal-du-Gers et le second est Montréal en Aude, les deux étant en région Occitanie. Étant donné cette base de données on n'est pas surpris d'apprendre que spécifier Aude, Languedoc-Roussillon ou Occitanie comme région n'aide pas Weatherbit.io à trouver Montréal en Aude. Yahoo est plus complet fournissant jusqu'à deux régions administratives en plus du pays.
On note que l'on ne tient pas compte de la réforme territoriale de 2016 qui fusionnait le Languedoc-Roussillon et le Midi-Pyrénées pour former l'Occitanie.
Clairement, rien n'est parfait. Et cette constatation s'étend au code postal. Apixu rapportait que « 75001, US » était Addison, Texas ce qui est correct selon le service postal américain. Selon Weatherbit.io, le même code représente Dallas, TX et selon OpenWeatherMap ce code postal identifie Plano, TX. Plano et Addison sont dans la grande périphérie de Dallas.
C'est peut-être surprenant, mais pour ce qui est de « 75001, FR» il y a un commun accord: il s'agit de la capitale française selon OpenWeatherMap, Weatherbit.io et Yahoo. Toutefois, OpenWeatherMap n'arrive pas a déchiffrer les codes postaux du Royaume-Uni et ne peut interpréter la première partie des codes postaux canadiens que depuis quelques jours. Apixu ne connaît pas les codes postaux français, mais en revanche semble bien s'en sortir avec les codes postaux des États-Unis, du Royaume-Uni et du Canada.
Prévisions météorologiques et données historiques
En plus des conditions actuelles, on peut obtenir des prévisions. Il faut soit une URL différent soit une modification à l'élément requête pour obtenir ces prévisions. L'exception est, encore une fois, MET Norway qui donne observations et prévisions ensemble. Mentionnons aussi que Dark Sky fonctionne à rebours; il faut spécifier dans la requête ce que l'on veut exclure, car autrement on obtient les conditions courantes et toutes les prévisions disponibles ensemble.
Le tableau suivant résume les prévisions disponibles gratuitement selon le fournisseur. On peut aussi obtenir des données historiques. Cette question m'intéresse beaucoup moins alors il ne faut pas trop se fier à cette colonne qui ne fait que répéter ce que l'on trouve dans la documentation des sites qui n'est pas nécessairement à jour.
| Service | Prévisions | Données historiques |
|---|---|---|
| Apixu | Quotidiennes sur 10 jours | Horaires pour une journée |
| Dark Sky | Horaires sur 48 heures, quotidiennes sur 7 jours |
Horaires pour une journée et
quotidiennes pour une journée. |
| MET Norway | Quotidiennes sur 9 jours et plus fréquentes,
aux 6 heures, 3 heures et même 1 heure dans les premiers jours. |
Autre IPA non examiné. |
| OpenWeatherMap | Aux trois heures sur 5 jours et
quotidiennes sur 7 jours. |
✗ |
| Weatherbit.io | Horaires sur 48 heures,
aux trois heures sur 5 jours et quotidiennes sur 16 jours |
Horaires pour une journée et
quotidiennes pour une journée. |
| Yahoo Weather | Quotidiennes sur 10 jours | ✗ |
Les fournisseurs limitent considérablement les données historiques gratuitement disponibles. Typiquement, on ne peut obtenir de données datant de plus de 30 jours.
Mises à jour des données
À l'exception de Met Norway, les services examinés ici ne produisent pas de données météorologiques. Ils obtiennent leurs données de diverses sources, puis les synthétisent pour les présenter à leurs clients. Conséquemment, l'intervalle entre mises à jour des conditions actuelles et des prévisions dépend en partie sur les mises à jours de fournisseurs de données météorologiques utilisées, et en partie du fournisseur qui procède à l'intégration des données selon le rythme choisi. On comprendra que l'information au sujet des intervalles n'est pas très claire.
Je n'ai rien trouvé à ce sujet en ce qui concerne Apixu, MET Norway et Yahoo Weather. Pour les autres voici ce que j'ai glané :
- Dark Sky
- How often is your data updated? « Next-hour minutely forecast data is updated every five minutes. Hourly and daily forecast data are updated every hour.» Les mises à jour se font toutes les cinq minutes pour les prévisions d'une minute et toutes les heures pour les prévisions d'une heure et d'un jour.
- OpenWeatherMap
- Data is not accurate "The update interval can be up to a couple of hours for free/start-up API servers,» Il peut s'écouler jusqu'à deux heures entre mises à jour des conditions courantes. Voir aussi Price.
- Weatherbit.io
- FAQ « How frequently do does the current weather API update? Data updates as fast as it is reported. This can vary by location. Typically between 15-30 mins. How frequently do forecasts update?Forecasts update once per hour in most locations.» Les conditions courantes sont révisées tous les 15 à 30 minutes typiquement alors que les prévisions sont refaites tous les 60 minutes.
Limites
L'Institut de météorologie de Norvège (MET Norway) est une entreprise publique dont
Les autres fournisseurs sont des entreprises à but lucratif. Ce qui les pousse à donner accès gratuitement à une partie de leurs services n'est pas immédiatement évident. Est-ce vu comme de la publicité ou un produit d'appel ? Qu'importe, l'avenir de ces services gratuits n'est pas garanti. D'ailleurs des fournisseurs privés ont cessé d'offrir un accès libre et d'autres n'ont jamais adopté cette tactique.
Toujours est-il que tous les fournisseurs examinés ici limitent le nombre de requêtes acceptées dans un intervalle donné. Si l'on dépasse ces limites, il faut passer à un forfait payant ou si l'on a déjà un tel forfait il faut passer à un forfait plus cher. Le tableau ci-dessous indique les limites pour l'utilisation gratuite. Comme mentionnez au début il faut néanmoins s'inscrire pour obtenir une clé qu'on doit inclure dans toute requête sauf pour ce qui est de MET Norway et Yahoo Weather.
| Limite de requêtes | ||||
|---|---|---|---|---|
| Service | minute | heure | jour | mois |
| Apixu (1) | 250 | 10 000 | ||
| Dark Sky | 1 000 | |||
| MET Norway (2) | 1 200 | |||
| OpenWeatherMap | 60 | |||
| Weatherbit.io | 1 000 | |||
| Yahoo Weather | 2 000 | |||
| AccuWeather (3) | 50 | |||
| - n'est plus disponible | ||||
Notes :
| 1 | D'après la FAQ de World Weather Online, Apixu est son service gratuit. Toujours selon cette FAQ il y aurait une limite quotidienne de 250 requêtes. De plus, il devrait s'écouler au moins 15 minutes entre deux requêtes pour un même endroit. Or la page Web sur le site de Apixu au sujet des prix de divers forfaits (un peu surprenant pour un site «gratuit»), indique que la limite mensuelle est de 10 000 requêtes sans aucune autre indication. Notons que 250 requêtes pendant 30 jours consécutifs donne un limite mensuelle de 7 500. |
| 2 | Source: HTTP status codes, 429 Too Many Requests. Also see Conditions for use of the service. |
| 3 | Les deux derniers fournisseurs étaient mentionnés dans mon billet précédent. Or AccuWeather n'offre pas un forfait gratuit, mais plutôt un forfait d'essai limité. Weather Underground a annoncé la fin du forfait gratuit: End of Service for the Weather Underground API. |
Programmes de démonstration
L'archive weather_api_src.zip contient le code source pour les six programmes qui accèdent à l'IPA de chaque fournisseur. Il y a aussi un programme pour interroger la base de données WOEID de Yahoo.
Les programmes ont été développés avec Free Pascal (version 3.1.1) Lazarus (version 1.9.0) (revision SVN 58721) sur la plateforme Ubuntu 18.04.1. Il faut ajouter le paquet DCPcrypt pour crypter et décrypter les clés. On le trouve dans le Lazarus Code and Component Repository (CCR). Le programme d'installation fpcpudeluxe peut être utilisé pour cette opération, voir mon billet Installer Free Pascal et Lazarus sur Ubuntu 18.04 avec fpcupdeluxe . Les messages d'erreurs affichés sont sans conséquence.
main.pas, pwd.pas et apixu_demo.lpr.
Voir les notes TODO dans les deux premiers fichiers. Les mêmes corrections
devraient fonctionner avec les autres programmes.
En plus, il faut copier deux bibliothèques nécessaires au fonctionnement de
OpenSSL, (ssleay32.dll et
libeay32.dll dans le dossier contenant
apixu_demo.exe) qu'on obtient de https://indy.fulgan.com/SSL/. Il faut s'assurer d'avoir
la dernière version et d'obtenir la version 32 ou 64 bits selon le système
d'exploitation. Puisque j'utilise Windows XP 32 bits pour les tests, j'ai
télécharger l'archive openssl-1.0.2p-i386-win32.zip pour en
tirer les fichiers désirés. Cette information provient de Phil qui répondait
à la question Could not initialize openSSL library ? sur le Forum de
Lazarus. Voir le commentaire de Remy Lebeau plus loin qui explique pourquoi
utiliser les bibliothèques de Indy. Le programme de démonstration initial pour Yahoo Weather est encore
disponible. Ce dernier utilisait le paquet Ararat Synapse pour accéder
au Web. Les nouveaux programmes utilisent plutôt fphttpclient qui fait
partie de la bibliothèque Free Pascal standard. Il n'y a donc rien à
installer. Si l'on préfère continuer d'utiliser Synapse, il suffit de
mettre httprequest_synapse au lieu de httprequest
dans la clause uses de la section implementation
du fichier common/getweather.pas.
La première fois qu'on utilise le programme, il faut entrer la clé
de l'IPA. Cliquez sur l'onglet Clé, entrez la clé
dans le champ et puis cliquez sur le bouton OK. Dès que le
bouton est activé, le contenu du champ est effacé. Ainsi la clé n'est jamais
affichée sauf lorsqu'on entre sa valeur et que l'on
active la visualisation de la clé.

La clé est sauvegardée dans un fichier crypté dans le répertoire du programme. Lors des prochaines utilisations, la clé sera tirée de ce fichier. La phrase de sécurité utilisée pour crypter la clé est évidemment la même pour toutes les copies du logiciel si l'on ne change rien. Il est possible de spécifier cette phrase à chaque départ de l'application. Le message suivant est affiché au début avec les instructions à ce sujet.

C'est ma première incursion dans le monde de la cryptographie. Alors je n'ai pas trop confiance dans la sécurité des clés stockées avec ces programmes.
Voici la présentation du programme de démonstration owm_demo;
les autres sont semblables.

On sélectionne le moyen pour spécifier l'endroit parmi les
onglets. Après il suffit de remplir les champs affichés sous l'onglet,
sélectionner les données météorologiques désirées dans la liste
déroulante Obtenir. On peut aussi choisir la langue utilisée
pour les descriptions des conditions, les unités de mesure, le format de
la réponse et le protocole à utiliser.
Pour enfin envoyer la requête et obtenir la réponse du fournisseur, on
clique sur le bouton Brut ou Structuré. Dans le
premier cas, on obtient la réponse brute du fournisseur. Dans le second cas,
la réponse est analysée et affichée dans une arborescence. Son menu
contextuel pourrait être utile.
Cliquer sur le bouton URL ajuste la requête en fonction des
paramètres fixés et l'affiche dans la zone déroulante au centre de
l'application sauf que la clé n'est pas affichée, mais sa position
est indiqué par {clé}. La requête et la réponse peuvent être copiées
au presse-papiers.