lunarok / jeedom_vigilancemeteo

Plugin for Jeedom using Meteo France to retrieve meteo alerts and status
https://lunarok-domotique.com/plugins-jeedom/vigilance-meteo/
5 stars 13 forks source link

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

Open nioc opened 4 years ago

nioc commented 4 years ago

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) :

nioc commented 4 years ago

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 :

Qu'en penses-tu ?

lunarok commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

@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 commented 4 years ago

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 commented 4 years ago

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 commented 1 year ago

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

lunarok commented 1 year ago

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

Sigri44 commented 1 year ago

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 commented 1 year ago

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