Open nioc opened 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 :
nom_de_la_ville
à fournir dans l'url de la page principalelongitude
et latitude
à fournir dans l'url de l'APIQu'en penses-tu ?
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 :
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 :
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)
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 😄) ?
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
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 ?
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
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.
@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);
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
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
Hello, l'issue n'as toujours pas été fixé en prod ? Merci
Si, la version stable est iso de la beta depuis plusieurs mois
Intéressant, j'ai bien la dernière MàJ, pourtant j'ai toujours l'ancienne url citée ici, qui pose soucis :
Quel problème ? l'issue parle d'un problème sur pluie 1h qui marche parfaitement
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 êtrehttps://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) :