Aller au contenu
Bloug

Curl en Lua

Recommended Posts

Bonjour,

je cherche a convertir cette requête CURL en Lua ( il me semble 2 :D 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

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 .. '"}'

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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

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

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é par Bloug

Partager ce message


Lien à poster
Partager sur d’autres sites

pour récuperer le token il faut faire un GET et ensuite le POST

Partager ce message


Lien à poster
Partager sur d’autres sites

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 .... :D ?

Modifié par Bloug

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

[19:12:00] [ERROR] [QUICKAPP622]: main.lua:19: attempt to index a nil value (field 'http')

:huh: 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é par Bloug

Partager ce message


Lien à poster
Partager sur d’autres sites

Maintenant c'est ta variable http qui n'est pas initialisée lorsque tu tentes de l'utiliser.

 

Voir ici :

 

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites
function QuickApp:onInit()
    self:multimatic()
    self.http = net.HTTPClient({ timeout = 2000 })
end

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites
function QuickApp:onInit()
       self.http = net.HTTPClient({ timeout = 2000 })
       self:multimatic()
end

0443e866288e49b45acf7242f00fb38c.gif merci :D

 

  • Like 1
  • Haha 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@Lazer  @mprinfo j'ai encore besoin de vos lumières :D  !!

 

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=327389B0A15C0AE209C717EA97D3196B

Cookiemoinsb.thumb.JPG.ea0fc77d6c90aa0c9557a75637ee6e37.JPG

Est 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é par Bloug

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :D  !!

j'espère que le délestage Enedis n'a pas commencé :D!

 

Modifié par Bloug

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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

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

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Déjà testé des trucs sous Android mais l'application bloque au démarrage :11:

C'est des lapins chez Vaillant !

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Capture.JPG.2710d0621edf0852fa8806ab10a3e6d2.JPG

 

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

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon après le Lua ... le Curl ..... j'ai avec Wireshark du moitié Chinois moitié matrix ... Du ChiTrix 

  • Like 1
  • Haha 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

×