Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Erreur HTTP sur pluie1h (changement API météo france) #69

Open
nioc opened this issue Aug 13, 2020 · 16 comments
Open

Erreur HTTP sur pluie1h (changement API météo france) #69

nioc opened this issue Aug 13, 2020 · 16 comments

Comments

@nioc
Copy link

nioc commented Aug 13, 2020

Bonjour @lunarok et merci pour ton plugin qui fait (faisait...) parfaitement le job.

J'ai noté que je n'avais plus les prévisions de pluie à 1 heure, en regardant de plus près il semble que Météo France ai mis à jour son site et les API exposées (l'ancienne url http://www.meteofrance.com/mf3-rpc-portlet/rest/pluie/{insee} retourne un 301 vers le portail https://meteofrance.com).
La nouvelle API semble être https://rpcache-aa.meteofrance.com/internet2018client/2.0/nowcast/rain?lat={latitude}&lon={longitude} avec malheureusement un token JWT à passer dans le header Authorization sans quoi l'API répond un joli 401 😭

Je vois 2 solutions (tu en identifiera peut être d'autres) :

  • Récupérer un token (une simple consultation du portail en récupère un, je n'ai pas identifié sa durée de vie, avec un peu de chance il n'expire pas...)
  • Utiliser d'autres fournisseurs d'alerte pluie à 1 heure ?
@nioc
Copy link
Author

nioc commented Aug 13, 2020

Après 30 minutes d'analyse, j'en viens à la conclusion suivante : ils ont appliqué le principe "obscurité = sécurité"... sur la version en prod, le token est généré via le cookie mfsession qui est retourné lors de la requête sur la page principale http://meteofrance.com/previsions-meteo-france/{nom_de_la_ville}/{code_postal} en appliquant lui une modification des caractères via une expression régulière (permettant de garder la structure d'un token JWT : header.payload.signature) :

this.token=o.replace(
	/[a-zA-Z]/g,
	function(e){
		var t=e<="Z"?65:97;
		return String.fromCharCode(t+(e.charCodeAt(0)-t+13)%26)
	})

Exemple :

let cookie = "rlWwoTSmplV6VzyhqTIlozI0VvjvLJkaVwbvFSZlAGLvYPW0rKNvBvWXI1DvsD.rlWdqTxvBvWyLmuuAzWzZ2ExLGIyL2L1ZGyyMTRjAQOxAmpkZQN2ZlVfVzyuqPV6ZGH5AmZmAmplBK0.fQhcvL6PHFO12JfLit0DLPKIq3IZ51G0caXHeqPpRWN"
let token = cookie.replace(/[a-zA-Z]/g, function(e){var t=e<="Z"?65:97;return String.fromCharCode(t+(e.charCodeAt(0)-t+13)%26)})

Il me semble possible d'utiliser la nouvelle API :

  • Changement de l'url de base de l'API,
  • Ajout du paramètre du plugin nom_de_la_ville à fournir dans l'url de la page principale
  • Ajout des paramètres du plugin longitude et latitude à fournir dans l'url de l'API
  • En cas de token absent ou expiré (erreur HTTP 401), il suffit d'appeler l'url de la page principale, récupérer et parser le cookie pour y appliquer la même fonction.

Qu'en penses-tu ?

@lunarok
Copy link
Owner

lunarok commented Aug 14, 2020

J'ai regardé un peu cette semaine, on m'a pointé vers HA qui utiliserait une "API officielle", sauf que comme toi j'ai l'impression que si derrière on a bien des webservices, leur utilisation est pas documenté, le token rien ne permet d'en générer un officiellement pour cette utilisation. Chez HA, ils utilisent un token en dur pour tous les utilisateurs.
L'infra webservice à l'air de s'etendre à la vigilance météo à voir leur lib python :
https://github.com/hacf-fr/meteofrance-api/blob/master/src/meteofrance/const.py

Après ce qui est de récupérer code postal, nom de ville, lon, latitude, c'est possible via les infos de géolocalisation déjà utilisées par les autres types de vigilance, ca harmoniserait et éviterait le modal juste pour ca.
En gros :

@lunarok
Copy link
Owner

lunarok commented Aug 18, 2020

En fait c'est plus compliqué, les données de pluie ne sont plus dispo en 12 éléments mais 10 uniquement 40 et 45, 50 et 55 sont regroupés.
La météo des plages est impactée aussi. La vigilance a été revue et bien plus claire avec leur nouvelle méthode.

En gros voilà ce que je vois :

@lunarok
Copy link
Owner

lunarok commented Aug 18, 2020

http://webservice.meteofrance.com/report?domain=france&report_type=message&report_subtype=infospe&format=&&token=xxx c'ets l'url qui fournit l'annonce d'alerte générale
Pour les plages on perd l'état de la mer (du moins sur les plages que j'ai testé). Sufit de rajouter 51 au code insee au lieu de 10
http://ws.meteofrance.com/ws/getDetail/france/4413551.json, y a juste la température de l'eau en plus
En revanche, ca a basculer sur les ports :
http://webservice.meteofrance.com/forecast/marine?lat=47.115537&lon=-2.104171&id=&token=xxx
http://webservice.meteofrance.com/tide?id=4413152&token=xxx (code INSEE + 52)

@nioc
Copy link
Author

nioc commented Aug 19, 2020

Effectivement cela change pas mal.
De mon côté j'ai fait un rapide test sur Node-RED pour voir l'histoire du token (appel API, si 401, alors appel du portail pour récupérer le token dans le cookie), ça marche bien.
Je présume que l'url http://webservice.meteofrance.com/rain est derrière un proxy sur https://rpcache-aa.meteofrance.com/internet2018client/2.0/nowcast/rain ? C'est peut être mieux vis à vis du fair-use météo france de passer par leur cache (+ le chiffrement SSL 😄) ?

@lunarok
Copy link
Owner

lunarok commented Aug 25, 2020

Voilà ce que ca donne dans un nouveau plugin :
https://github.com/lunarok/jeedom_meteofrance

Il y a plus d'infos faciles à récupérer qu'avant sur leur nouveau site. Je pense ajouter les prévisions classiques et le bulletin général france + condition actuelle qu'on voit

Pour le token, j'ai mis en dur celui que HA utilise pour le moment, à voir comment en récupérer un comme eux car il n'expire pas

@nioc
Copy link
Author

nioc commented Aug 25, 2020

Top Cédric, je vais l'installer ce soir, merci !
Pour le token, éventuellement en configuration ?
Tu envisages de déprécier le plugin existant ?

@lunarok
Copy link
Owner

lunarok commented Aug 25, 2020

Pour le token, sinon avec ta méthode ca pourrait le faire. Pour gagner du temps si tu avais le code en PHP pour le calculer du cookie :)
Le plugin existant il reste pollen, qualité d'air et vigicrues qui ne sont pas directement sur le site de météofrance, donc plutot dépréciés les types qui basculent sur ce nouveau plugin

@nioc
Copy link
Author

nioc commented Aug 26, 2020

Ok, ça me paraît le mieux pour tes utilisateurs.
Pour le code, je l'ai en NodeJS mais je dois pouvoir le porter en PHP, je regarde ce soir.

@nioc
Copy link
Author

nioc commented Aug 26, 2020

@lunarok voici le portage de l'obtention du token via le cookie mfsession en PHP (sans la partie récupération de la valeur du cookie, je présume que c'est outillé dans les fonctions core de Jeedom) :

$cookie = "rlWwoTSmplV6VzyhqTIlozI0VvjvLJkaVwbvFSZlAGLvYPW0rKNvBvWXI1DvsD.rlWdqTxvBvWyLmuuAzWzZ2ExLGIyL2L1ZGyyMTRjAQOxAmpkZQN2ZlVfVzyuqPV6ZGH5AmZmAmplBK0.fQhcvL6PHFO12JfLit0DLPKIq3IZ51G0caXHeqPpRWN";
// on effectue le déchiffrement du code César avec un décalage de 13
$token = preg_replace_callback(
  '/[a-zA-Z]/',
  function ($e) {
    $code = ord($e[0]);
    $offset = $code < 97 ? 65 : 97;
    return chr($offset + ($code - $offset + 13) % 26);
  },
  $cookie);

@nioc
Copy link
Author

nioc commented Aug 27, 2020

Salut @lunarok , j'ai testé sur le commit lunarok/jeedom_meteofrance@e2ddb2d ça marche pas mal (good job), il manque peut être une description textuelle globale du genre "pluie modérée dans 15 minutes" comme avant (je m'envoyais par XMPP la commande Previsions Textuelles depuis un scénario avec une condition si pluie dans l'heure > 12).

Pour info, j'ai un petit bug non bloquant sur l'admin d'un équipement :

Uncaught ReferenceError: addOrUpdateUrl is not defined
    success https://dummyjeedom/index.php?v=d&m=meteofrance&p=meteofrance&id=141&saveSuccessFull=1#eqlogictab line 2 > injectedScript:165
    success https://dummyjeedom/core/php/getResource.php?file=core/js/private.class.js&md5=b8db8507901b84d70b6da0fc7ba03668&lang=fr_FR:117
    jQuery 6
    print https://dummyjeedom/core/php/getResource.php?file=core/js/eqLogic.class.js&md5=1428a374cdeead771150bef15b95e1ff&lang=fr_FR:169
    <anonymous> https://dummyjeedom/index.php?v=d&m=meteofrance&p=meteofrance&id=141&saveSuccessFull=1#eqlogictab line 2 > injectedScript:135
    jQuery 8
    <anonymous> https://dummyjeedom/index.php?v=d&m=meteofrance&p=meteofrance&id=141&saveSuccessFull=1#eqlogictab line 2 > injectedScript:375
    jQuery 22
    loadPage https://dummyjeedom/core/php/getResource.php?file=desktop/js/utils.js&md5=ca62cba7a0921ba2a16bfe741af20242&lang=fr_FR:84
    success https://dummyjeedom/core/php/getResource.php?file=core/js/plugin.template.js&md5=9600bf39f0db4cf350fb0eaafd5e47d6&lang=fr_FR:220
    success https://dummyjeedom/core/php/getResource.php?file=core/js/private.class.js&md5=b8db8507901b84d70b6da0fc7ba03668&lang=fr_FR:117
    jQuery 6
    save https://dummyjeedom/core/php/getResource.php?file=core/js/eqLogic.class.js&md5=1428a374cdeead771150bef15b95e1ff&lang=fr_FR:68
    <anonymous> https://dummyjeedom/core/php/getResource.php?file=core/js/plugin.template.js&md5=9600bf39f0db4cf350fb0eaafd5e47d6&lang=fr_FR:200
    jQuery 8
    <anonymous> https://dummyjeedom/core/php/getResource.php?file=core/js/plugin.template.js&md5=9600bf39f0db4cf350fb0eaafd5e47d6&lang=fr_FR:187

@lunarok
Copy link
Owner

lunarok commented Aug 28, 2020

Le Prévisions Textuelles venait d'un champ directement de météo france, il a disparu.
Du coup j'ai déjà un champ pour le délai, mais pas mis avec un champ pour le type de pluie a attendre. Je vais regarder ca

@Sigri44
Copy link

Sigri44 commented Nov 7, 2022

Hello, l'issue n'as toujours pas été fixé en prod ? Merci

@lunarok
Copy link
Owner

lunarok commented Nov 8, 2022

Si, la version stable est iso de la beta depuis plusieurs mois

@Sigri44
Copy link

Sigri44 commented Nov 8, 2022

Intéressant, j'ai bien la dernière MàJ, pourtant j'ai toujours l'ancienne url citée ici, qui pose soucis :

image

@lunarok
Copy link
Owner

lunarok commented Nov 8, 2022

Quel problème ? l'issue parle d'un problème sur pluie 1h qui marche parfaitement

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants