Bloug 280 Signaler ce message Posté(e) 5 décembre 2022 Bonjour, je cherche a convertir cette requête CURL en Lua ( il me semble 2 faut encore récupérer un token....). $user=$args[0] $password=$args[1] $url=$args[2] $payload=@" { \"smartphoneId\": \"pymultiMATIC\", \"username\": \"$user\", \"password\": \"$password\" } "@ $token_response = curl.exe -s ` -c .pymultimatic-cookie ` -X POST ` -H "Content-Type:application/json" -H "Accept:application/json" ` -d $payload ` "https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/token/new" | ConvertFrom-Json $token=$token_response.body.authToken $payload=@" { \"smartphoneId\": \"pymultiMATIC\", \"username\": \"$user\", \"authToken\": \"$token\" } "@ je suppose que le data habituel en lua est ici : {$payload=@" { \"smartphoneId\": \"pymultiMATIC\", \"username\": \"$user\", \"password\": \"$password\" } "@} possible de m'indiquer la "mutation" en lua svp ?? trop de \"\"\ function QuickApp:multimatic() self.http:request("https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/token/new", { options={ method = "POST", data = 'smartphoneId:pymultiMATIC/username:' .. self:getVariable("UserName") 'password:'.. self:getVariable("Password"), headers = { ['Content-Type'] = 'application/json', ['Accept'] = 'Accept:application/json', } }, success = function(response) if response.status == 200 then MErci pour votre aide ! Partager ce message Lien à poster Partager sur d’autres sites
Lazer 8 496 Signaler ce message Posté(e) 5 décembre 2022 Ton data n'est pas bon, il faut que tu le formates comme le payload (c'est du JSON en fait). Un truc dans le genre (non testé et à adapter) : data = '{"smartphoneId":"pymultiMATIC","username":"' .. self:getVariable("UserName") .. '","authToken":"' .. mon_token .. '"}' 1 Partager ce message Lien à poster Partager sur d’autres sites
mprinfo 3 356 Signaler ce message Posté(e) 5 décembre 2022 je sais pas trop comment dire mais bien souvent le token on le met dans l'entête enfin c'est comme cela que je fais sur mes QA Partager ce message Lien à poster Partager sur d’autres sites
Lazer 8 496 Signaler ce message Posté(e) 5 décembre 2022 Oui ben après je ne connais pas l'API de l'appareil avec lequel Bloug tente de communiquer. Mais déjà il y a un incohérence dans son code, car dans le payload de la requête curl il met un authToken, et dans la fonction http en LUA, il met un password. C'est pour cela que je disais qu'il faut adapter mon exemple, c'était surtout pour l'aiguiller sur le format de la syntaxe, pas sur le contenu utile. Partager ce message Lien à poster Partager sur d’autres sites
Bloug 280 Signaler ce message Posté(e) 6 décembre 2022 (modifié) merci @Lazer pour l'exemple ! Je cherche à réaliser un petit QA pour me récupérer les informations de ma chaudière. Actuelement j'ai un Plugin sous HA. pour réaliser qqq essais , le concepteur ma communiqué un fichier PowerShell pour vérifier des retour d'informations ( indépendamment du plugin ) avec le powershell j'exécute la commande suivante : C:\Users\myPC\nom_du_fichier_powershell.ps1 <my_vaillant_login> <My_vaillant_password> https://smart.vaillant.com/mobile/api/v4/facilities/<My_vaillant_serial>/systemcontrol/v1/dhw/Control_DHW/hotwater/ config/timeprogram j'aspire donc de faire la meme chose avec la hc3. @mprinfo , voici le code curl complet : $user=$args[0] $password=$args[1] $url=$args[2] $payload=@" { \"smartphoneId\": \"pymultiMATIC\", \"username\": \"$user\", \"password\": \"$password\" } "@ $token_response = curl.exe -s ` -c .pymultimatic-cookie ` -X POST ` -H "Content-Type:application/json" -H "Accept:application/json" ` -d $payload ` "https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/token/new" | ConvertFrom-Json $token=$token_response.body.authToken $payload=@" { \"smartphoneId\": \"pymultiMATIC\", \"username\": \"$user\", \"authToken\": \"$token\" } "@ curl.exe -s ` Â -b .pymultimatic-cookie ` Â -c .pymultimatic-cookie ` Â -X POST ` Â -H "Content-Type:application/json" -H "Accept:application/json" ` Â -d "$payload" ` Â "https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/authenticate" $response=curl.exe -s ` Â -b .pymultimatic-cookie ` Â -X GET ` Â -H "Content-Type:application/json" -H "Accept:application/json" ` Â "$url" Write-Host "$response" Il me semble qu'il réalise deux requêtes genre : la première : je récupère un token ; 2eme : je me connecte avec le serveur. voici ma première multimatic() function QuickApp:multimatic() self.http:request( "https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/token/new", { options = { method = "POST", data = '{"smartphoneId":"pymultiMATIC","username":"' .. self:getVariable("UserName") .. '","password":"' .. self:getVariable("Password") .. '"}', headers = { ["Content-Type"] = "application/json", ["Accept"] = "application/json" } }, success = function(response) if response.status == 200 then -- self:marequette2() print(response.data) print("OKKKKKKKKKKKKKKKKK") else self:debug( "error: https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/token/new" .. response.status .. response.data ) print("BAD") end end, error = function(error) self:debug("error: " .. error) end } ) end avant de modifier pour récupérer le token , faut déjà qu'il se connecte [ERROR] [QUICKAPP621]: main.lua:5: attempt to call a nil value (global 'multimatic') Modifié 6 décembre 2022 par Bloug Partager ce message Lien à poster Partager sur d’autres sites
mprinfo 3 356 Signaler ce message Posté(e) 6 décembre 2022 pour récuperer le token il faut faire un GET et ensuite le POST Partager ce message Lien à poster Partager sur d’autres sites
Bloug 280 Signaler ce message Posté(e) 6 décembre 2022 (modifié) donc la lecture est du bas vers le haut ? une idée pourquoi j'ai un pb de nill value ? plutot qu'un pb 401 .... ? Modifié 6 décembre 2022 par Bloug Partager ce message Lien à poster Partager sur d’autres sites
Lazer 8 496 Signaler ce message Posté(e) 6 décembre 2022 Tu as la réponse dans le message d'erreur : attempt to call a nil value (global 'multimatic') Hors ta fonction multimatic n'est pas une variable globale, mais elle est membre de la table QuickApp. Donc selon où tu l'appelles, tu peux utiliser self:multimatic () si tu es déjà dans une fonction de QuickApp, ou encore quickApp:multimatic() si tu es en dehors. C'est pas évident de comprendre ces subtilités, il y a déjà eu de nombreuses discussions à ce sujet sur le forum que tu pourras retrouver. 2 Partager ce message Lien à poster Partager sur d’autres sites
Bloug 280 Signaler ce message Posté(e) 6 décembre 2022 (modifié) [19:12:00] [ERROR] [QUICKAPP622]: main.lua:19: attempt to index a nil value (field 'http') je me calque sur d'autres QA , je pige pas toujours un truc qui cloche -- Generic device type have no default actions to handle function QuickApp:onInit() self:multimatic() end function QuickApp:multimatic() self.http:request("https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/authenticate", { options={ method = "POST", data = '{"smartphoneId":"pymultiMATIC","username":"**@**","password":"**"}', headers = { [ 'Content-Type' ] = 'application/json', [ 'Accept' ] = 'application/json', } }, success = function(response) if response.status == 200 then self:debug('ok') local jsonResponse = json.decode(response.data) else self:debug('error: https://smart.vaillant.com/mobile/api/v4/account/authentication/v1/token/new' .. response.status .. response.data) end end, error = function(error) self:debug('error: ' .. error) end }) end --- Modifié 6 décembre 2022 par Bloug Partager ce message Lien à poster Partager sur d’autres sites
Lazer 8 496 Signaler ce message Posté(e) 6 décembre 2022 Maintenant c'est ta variable http qui n'est pas initialisée lorsque tu tentes de l'utiliser. Voir ici : 1 Partager ce message Lien à poster Partager sur d’autres sites
mprinfo 3 356 Signaler ce message Posté(e) 6 décembre 2022 function QuickApp:onInit() self:multimatic() self.http = net.HTTPClient({ timeout = 2000 }) end 1 Partager ce message Lien à poster Partager sur d’autres sites
Bloug 280 Signaler ce message Posté(e) 6 décembre 2022 function QuickApp:onInit() self.http = net.HTTPClient({ timeout = 2000 }) self:multimatic() end merci 1 1 Partager ce message Lien à poster Partager sur d’autres sites
Bloug 280 Signaler ce message Posté(e) 14 décembre 2022 (modifié) @Lazer @mprinfo j'ai encore besoin de vos lumières !! j'arrive bien à me connecter au serveur par plusieurs requêtes puis à m'authentifier. Là il me reste la dernière commande pour réclamer les infos avec une commande GET. Je pensais devoir récupérer les cookies de ma commande d'authentification pour les insérer dans le "Header" de ma commande GET mais toujours erreur 401 Dans le PowerShell, le script fait appel à une fichier qui gère les cookie : .pymultimatic-cookie $response=curl.exe -s ` Â -b .pymultimatic-cookie ` Â -X GET ` Â -H "Content-Type:application/json" -H "Accept:application/json" -H "Vaillant-Mobile-App:multiMATIC v2.1.45 b389 (Android)" ` Â "$url" et voici à l'intérieur : # Netscape HTTP Cookie File # https://curl.se/docs/http-cookies.html # This file was generated by libcurl! Edit at your own risk. #HttpOnly_smart.vaillant.com FALSE / TRUE 0 JSESSIONID 5612998F20F9D0C39FED52118AB2D5EA #HttpOnly_smart.vaillant.com FALSE / TRUE 0 TS01b0e19c 01e5b3f1f8d7a56f8bad6ef47928066a459a10b295602afb72c8267a525ff07502d3fbe6b53b0bad412d11cedd287b24240167f6e3 Je retrouve donc mes cookies, non plus sous la forme de : Set-Cookie : JSESSIONID=327389B0A15C0AE209C717EA97D3196B et Set-Cookie : JSESSIONID=327389B0A15C0AE209C717EA97D3196BEst il possible de me confirmer que je dois les insérer dans le header ou dois-je ajouter autres choses ? #HttpOnly_smart.vaillant.com FALSE / TRUE 0 JSESSIONID 5612998F20F9D0C39FED52118AB2D5EA voici ma commande GET : function QuickApp:get() self.http:request("https://smart.vaillant.com/mobile/api/v4/facilities/2***M*y**S*E*R*I*A*L*****N4/storage/default", { options={ method = "GET", headers = { [ 'content-type' ] = 'application/json;charset=UTF-8', [ 'Accept' ] = 'application/json', [ 'Vaillant-Mobile-App' ] = 'multiMATIC v2.1.45 b389 (Android)', [ 'JSESSIONID' ] = '5612998F20F9D0C39FED52118AB2D5EA', [ 'TS01b0e19c' ] = '01e5b3f1f8d7a56f8bad6ef47928066a459a10b295602afb72c8267a525ff07502d3fbe6b53b0bad412d11cedd287b24240167f6e3' }, }, success = function(response) if response.status == 200 then self:debug('Connection Ok') local jsonResponse = json.decode(response.data) self:debug(response.data) else self:debug('Error : ' .. response.status .. response.data) end end, error = function(error) self:debug('error: ' .. error) end }) end MErci Modifié 14 décembre 2022 par Bloug Partager ce message Lien à poster Partager sur d’autres sites
Bloug 280 Signaler ce message Posté(e) 15 décembre 2022 (modifié) Bon je creuse et je trouve des choses en php ... j'ai trouvé la syntaxe suivante qui se rapproche de mon pb : setcookie(name, value, expire, path, domain, secure, httponly) si je croise avec le fichier .pymultimatic-cookie : #HttpOnly_smart.vaillant.com FALSE / TRUE 0 JSESSIONID 5612998F20F9D0C39FED52118AB2D5EA Dois je plutôt avoir en lua une variable à déclarer pour le header genre : local aa = setcookie('JSESSIONID', '5612998F20F9D0C39FED52118AB2D5EA' , 0 , '/', '#HttpOnly_smart.vaillant.com', 'FALSE', 'TRUE' ) et ensuite indiquer dans le header : [ 'set-cookie' ] = aa, ou est-ce plutôt une ligne complète directement dans le header : [ 'Set-Cookie'] = "JSESSIONID=5612998F20F9D0C39FED52118AB2D5EA ; path=/ ; domain= ' #HttpOnly_smart.vaillant.com ' ; expires='0' ; 'FALSE' ; 'TRUE', '; je trouve aucun exemple en lua Le 14/12/2022 à 06:42, Bloug a dit : @Lazer @mprinfo j'ai encore besoin de vos lumières !! j'espère que le délestage Enedis n'a pas commencé ! Modifié 15 décembre 2022 par Bloug Partager ce message Lien à poster Partager sur d’autres sites
Lazer 8 496 Signaler ce message Posté(e) 15 décembre 2022 Je crois que tu te prends la tête pour rien. Tu dois juste envoyer la valeur du cookie, je pense que tout le reste (date d'expiration, chemin, etc) tu peux l'ignorer. Comme dans ton exemple LUA de ton message précédent qui me parait correct. Après je n'ai pas accès à ton système, donc je ne peux pas écrire le code LUA à ta place. Il faut le tester, voir le retour, ajuster éventuellement, etc... bref comme souvent en développement, c'est en faisant des expérimentations qu'on arrive à la solution. Surtout quand l'API n'est pas (ou mal) documentée. 1 Partager ce message Lien à poster Partager sur d’autres sites
Bloug 280 Signaler ce message Posté(e) 15 décembre 2022 bahh j'me prends la tête car j'ai tester multiples trucs et toujours en 401 après je cherche des alternatives et comme le seul truc est la boite à cookie .... Après 0 documentation avec api fermée function QuickApp:get() self.http:request("https://smart.vaillant.com/mobile/api/v4/facilities/2**S**E**R**I*A**L**4/storage/default", { options={ method = "GET", headers = { [ 'content-type' ] = 'application/json;charset=UTF-8', [ 'Accept' ] = 'application/json', [ 'Vaillant-Mobile-App' ] = 'multiMATIC v2.1.45 b389 (Android)', -- [ 'JSESSIONID' ] = cook1, -- F492DE3505594D686FD380A0D60E2472 -- [ 'TS01b0e19c' ] = cook2, -- 1e5b3f1f8cef485717100c75634a81f1d7d9dd5c8d258d76d6cf8165cf413fff586a9858f48b64b9371a3dfa2df61559be0bbb855 [ 'Set-Cookie' ] = cookie1, -- JSESSIONID=F492DE3505594D686FD380A0D60E2472 [ 'Set-Cookie' ] = cookie2, -- TS01b0e19c=1e5b3f1f8cef485717100c75634a81f1d7d9dd5c8d258d76d6cf8165cf413fff586a9858f48b64b9371a3dfa2df61559be0bbb855 }, }, success = function(response) if response.status == 200 then self:debug('Connection Ok') local jsonResponse = json.decode(response.data) self:debug(response.data) else self:debug('Error : ' .. response.status .. response.data) end end, error = function(error) self:debug('error: ' .. error) end }) end Partager ce message Lien à poster Partager sur d’autres sites
Lazer 8 496 Signaler ce message Posté(e) 15 décembre 2022 Pas facile... sinon y'a la méthode de bourrin : - installer un sniffer sur ton téléphone (en général ça installe un faux VPN local, ce qui permet de sniffer le traffic sans devoir rooter le téléphone) - lancer l'application mobile de ta chaudière - récupérer le dump du sniffer - analyser tranquillement les trames, c'est à dire les requêtes : URL + Data => tu trouveras le format des headers envoyés, les cookies, etc 1 Partager ce message Lien à poster Partager sur d’autres sites
Bloug 280 Signaler ce message Posté(e) 15 décembre 2022 Déjà testé des trucs sous Android mais l'application bloque au démarrage C'est des lapins chez Vaillant ! Partager ce message Lien à poster Partager sur d’autres sites
Lazer 8 496 Signaler ce message Posté(e) 15 décembre 2022 Ah oui, j'avais eu ça avec une application... je ne sais plus laquelle. J'avais réussi à sniffer quand même, avec une autre application je crois... ou bien en rootant mon téléphone, je ne sais plus. Partager ce message Lien à poster Partager sur d’autres sites
Bloug 280 Signaler ce message Posté(e) 15 décembre 2022 C'est frustrant d'y arriver avec le PowerShell de 45 lignes ! Les cookies ne sont pas dans le -H en header il y a forcement un truc louche avec le fichier .pymultimatic-cookie ! de toute manière c'est la seule chose qui n'est pas connecté à ma box donc je vais pas lâcher! 1 Partager ce message Lien à poster Partager sur d’autres sites
Lazer 8 496 Signaler ce message Posté(e) 15 décembre 2022 Ah ben si tu y arrives déjà avec curl en Powershell, tu peux sniffer directement ton PC avec Wireshark. Problème résolu (ou presque) 1 Partager ce message Lien à poster Partager sur d’autres sites
Bloug 280 Signaler ce message Posté(e) 15 décembre 2022 Pas bête !!!!! Merci ! Partager ce message Lien à poster Partager sur d’autres sites
Bloug 280 Signaler ce message Posté(e) 16 décembre 2022 Bon après le Lua ... le Curl ..... j'ai avec Wireshark du moitié Chinois moitié matrix ... Du ChiTrix 1 1 Partager ce message Lien à poster Partager sur d’autres sites
Lazer 8 496 Signaler ce message Posté(e) 16 décembre 2022 Normalement dans fil-requin tu peux lui demander de décoder les trames selon leur protocole. Donc tu peux récupérer directement le contenu des requêtes HTTP, contenant : - l'URL - les en-têtes - les données éventuelles (si requête POST ou PUT) Dans les en-têtes, tu dois trouver les cookies. Partager ce message Lien à poster Partager sur d’autres sites
mprinfo 3 356 Signaler ce message Posté(e) 16 décembre 2022 il y a 47 minutes, Bloug a dit : Bon après le Lua ... le Curl ..... j'ai avec Wireshark du moitié Chinois moitié matrix ... Du ChiTrix Attends j'arrive je vais chercher mon cozitouch à 14h @lazer je pense que si cela fonctionne bien avec ma chaudière je vais tenté de le rooter Partager ce message Lien à poster Partager sur d’autres sites