chrisalex Posté(e) le 5 février 2023 Signaler Posté(e) le 5 février 2023 bonjour, je cherche à recupérer un token sur le site de rte France mais je bloque car je pense qu'il doit manquer quelque chose dans mon code. Voici la requette en Curl qui fonctionne : curl -H "Authorization: Basic mescredentialsenbase64" -H "Content-Type: application/x-www-form-urlencoded" -X POST https://digital.iservices.rte-france.com/token/oauth/ cela me remonte bien le token voulu : { "access_token" : "MONTOKENATTENDU", "token_type" : "Bearer", "expires_in" : 7200 } J' ai donc essayer de faire un quick app mais malheureusement ca ne fonctionne pas bien (j'ai bien mis en variable apicred mes credentials en base 64) : function QuickApp:onInit() self:debug("onInit") self.apicred = self:getVariable("apicred") self.http = net.HTTPClient({ timeout = 2000 }) end function QuickApp:EDFtempoRTEToken() self:debug("colect color tempo RTE Token") print("credential : ", self.apicred) local addressoauth = "https://digital.iservices.rte-france.com/token/oauth/" self.http:request(addressoauth, { options={ method = "POST", headers = { ["Content-Type"] = "application/x-www-form-urlencoded", ["Authorization"] = 'Basic ' ..self.apicred, } }, success = function(response) print("retour :", json.encode(response)) if response.status == 200 then print('OK, réponse : '.. response.data) --fibaro.setGlobalVariable('TEMPO_EDF_RTE_Token', response.data) print(fibaro.getGlobalVariable("TEMPO_EDF_RTE_TOKEN")) else print("Erreur : status=" .. tostring(response.status)) end end, error = function(err) print("Erreur : " .. err) end, options = { method = 'GET' } }) je vous joint le retour 400 que je récupère : {"headers":{"Date":"Sun, 05 Feb 2023 13:45:25 GMT","Connection":"close","Content-Type":"application\/json; charset=\"utf-8\"","Server":"","User-Agent":"avhttp\/2.9.9","X-CorrelationID":"Id-f5b2df63535ade84741a89c5 0","Transfer-Encoding":"chunked","Accept":"text\/html, application\/xhtml+xml, *\/*","Host":"digital.iservices.rte-france.com","Authorization":"Basic"},"status":400,"data":"{\r\n \"erro"} Je vous remercie par avance de vos avis pour parvenie à recupérer ce token car je pense que le souci est sur la syntaxe ... il doit maquer quelquechose
chrisalex Posté(e) le 10 février 2023 Auteur Signaler Posté(e) le 10 février 2023 bonjour, j'ai trouvé la solution en m'inspirant du quick app netatmo de @Lazer et @gsmart c'est à dire utiliser la fonction Pcall cela permet bien de remonter le token dans le json. En revanche je sèche encore un peu pour le recuperer afin de le defnir en variable : "{\n \"access_token\" : \"fH8v3F4cgw3zsoC7QEP8tDXNYyYrfKJbVcT1j16eGQvnbUEjHdeXbH\",\n \"token_type\" : \"Bearer\",\n \"expires_in\" : 7200\n}" Merci par avance do votre aide
Bloug Posté(e) le 11 février 2023 Signaler Posté(e) le 11 février 2023 (modifié) c'est le QA qui te retourne \n ? c'est surement pas la meilleur méthode ni la plus courte .... mais pour nous les débutants .... le chemin est long local My_Json = '"{\n \"access_token\" : \"fH8v3F4cgw3zsoC7QEP8tDXNYyYrfKJbVcT1j16eGQvnbUEjHdeXbH\",\n \"token_type\" : \"Bearer\",\n \"expires_in\" : 7200\n}"' -- Je reformate ton retour pour virer les espaces et les vilains trucs bizzares: My_Json = My_Json:gsub('%s+', '') My_Json = My_Json:sub(1, -2) My_Json = My_Json:sub(2) print(My_Json) -- Je récupère chaque element en variable access_token = json.decode(My_Json).access_token token_type = json.decode(My_Json).token_type expires_in = json.decode(My_Json).expires_in -- J'imprime mes variables print(access_token) print(token_type) print(expires_in) [11.02.2023] [07:48:39] [DEBUG] [SCENE179]: fH8v3F4cgw3zsoC7QEP8tDXNYyYrfKJbVcT1j16eGQvnbUEjHdeXbH [11.02.2023] [07:48:39] [DEBUG] [SCENE179]: Bearer [11.02.2023] [07:48:39] [DEBUG] [SCENE179]: 7200 Modifié le 11 février 2023 par Bloug
chrisalex Posté(e) le 11 février 2023 Auteur Signaler Posté(e) le 11 février 2023 bonjour @Bloug merci beaucoup d'avoir bien voulu m'aider. je ne connaissais pas gsub. En effet ton code marche parfaitement mais uniquement avec la syntaxe de la variable que tu m'as donné à savoir : '"{\n \"access_token\" : \"fH8v3F4cgw3zsoC7QEP8tDXNYyYrfKJbVcT1j16eGQvnbUEjHdeXbH\",\n \"token_type\" : \"Bearer\",\n \"expires_in\" : 7200\n}"' le souci c'est que la requête pcall me retourne cette variable : "{\n \"access_token\" : \"fH8v3F4cgw3zsoC7QEP8tDXNYyYrfKJbVcT1j16eGQvnbUEjHdeXbH\",\n \"token_type\" : \"Bearer\",\n \"expires_in\" : 7200\n}" Donc sans les ' du début et de la fin, du coup ça ne fonctionne pas ce qui est bien normal. Malheureusement j'ai essayé de trouver comment jouer avec gsub pour corriger par moi même vu que tu m'avais bien mis sur la piste mais sans succès (j'essaye d'apprendre cette fonction gsub mais ce n'est pas évident) Je te remercie par avance de ton aide.
Bloug Posté(e) le 11 février 2023 Signaler Posté(e) le 11 février 2023 (modifié) et là : local My_Json = "{\n \"access_token\" : \"fH8v3F4cgw3zsoC7QEP8tDXNYyYrfKJbVcT1j16eGQvnbUEjHdeXbH\",\n \"token_type\" : \"Bearer\",\n \"expires_in\" : 7200\n}" My_Json = My_Json:gsub('%s+', '') print(My_Json) access_token = json.decode(My_Json).access_token token_type = json.decode(My_Json).token_type expires_in = json.decode(My_Json).expires_in print(access_token) print(token_type) print(expires_in) Modifié le 11 février 2023 par Bloug
chrisalex Posté(e) le 11 février 2023 Auteur Signaler Posté(e) le 11 février 2023 merci @Bloug c'est nickel désormais ça fonctionne à merveille (va falloir que j'essaye de comprendre la syntaxe de ce "gsub" pour être autonome la prochaine fois car c'est vraiment top de pouvoir modifier les strings) Tu m'as bien rendu service encore merci.
chrisalex Posté(e) le 11 février 2023 Auteur Signaler Posté(e) le 11 février 2023 (modifié) Hello @Bloug, désolé je me suis un peu emballé en effet ton code fonctionne bien mais uniquement si je lui passe la variable comme tu l'as fait mais en la renseignant manuellement. Etrange. Le souci perdure si je fais appelle à la variable. Je m'explique : Ton code qui marche local My_Json = "{\n \"access_token\" : \"fH8v3F4cgw3zsoC7QEP8tDXNYyYrfKJbVcT1j16eGQvnbUEjHdeXbH\",\n \"token_type\" : \"Bearer\",\n \"expires_in\" : 7200\n}" print("My_Json :", My_Json) My_Json = My_Json:gsub('%s+', '') print("My_Json 2 :", My_Json) access_token = json.decode(My_Json).access_token token_type = json.decode(My_Json).token_type expires_in = json.decode(My_Json).expires_in print("access_token :", access_token) print("token_type :", token_type) print("expire in :", expires_in) cela renvoie très bien comme attendu : En revanche si je set la variable en provenance du résultat du pcall (la première ligne du code ci-dessous) alors cela ne fonctionne plus (très étonnant) : local My_Json = json.encode(response.data) print("My_Json :", My_Json) My_Json = My_Json:gsub('%s+', '') print("My_Json 2 :", My_Json) access_token = json.decode(My_Json).access_token token_type = json.decode(My_Json).token_type expires_in = json.decode(My_Json).expires_in print("access_token :", access_token) print("token_type :", token_type) print("expire in :", expires_in) Pourtant ce code que tu m'as fourni et le mien semble identique, non? mais le comportement est différent : local My_Json = "{\n \"access_token\" : \"fH8v3F4cgw3zsoC7QEP8tDXNYyYrfKJbVcT1j16eGQvnbUEjHdeXbH\",\n \"token_type\" : \"Bearer\",\n \"expires_in\" : 7200\n}" et My_Json : "{\n \"access_token\" : \"3amy13oLFVuhaxZdUQJICVFD5DLUOqZ6X85IjJQK4qt6fmfcai53Du\",\n \"token_type\" : \"Bearer\",\n \"expires_in\" : 7200\n}" Le souci ne viendrait il pas du fait que j'encode par json encode? merci par avance de ton avis Modifié le 11 février 2023 par chrisalex
Bloug Posté(e) le 11 février 2023 Signaler Posté(e) le 11 février 2023 (modifié) Tu as les " repasse sur mon premier post avec : My_Json = My_Json:gsub('%s+', '') My_Json = My_Json:sub(1, -2) My_Json = My_Json:sub(2) print(My_Json) et montre moi les resultats des prints Modifié le 11 février 2023 par Bloug
jang Posté(e) le 11 février 2023 Signaler Posté(e) le 11 février 2023 You shouldn't encode response.data. It's already encoded. Just use decode. The '\n' is no problem. print("My_Json:" , response.data) local My_Json = json.decode ( response.data ) access_token = My_Json.access_token token_type = My_Json.token_type expires_in = My_Json.expires_in print ( "access_token:" , access_token ) print ( "token_type:" , token_type ) print ( "expires in:" , expires_in ) 2
chrisalex Posté(e) le 11 février 2023 Auteur Signaler Posté(e) le 11 février 2023 Thanks to @Bloug and @jang very interesting subjet for me The solution is : local My_Json = response.data print("My_Json :", My_Json) access_token = json.decode(My_Json).access_token print("access_token :", access_token) The result : Effectively the json was already encoded and to encode again was the issue
Messages recommandés