Aller au contenu

Messages recommandés

Posté(e)

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

 

Posté(e)

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

Posté(e) (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 :D

 

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é par Bloug
Posté(e)

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.

Posté(e) (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é par Bloug
Posté(e)

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.

 

Posté(e) (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 :

image.thumb.png.b3a039b55353e868f4501944f4954d68.png

 

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)

image.thumb.png.4f4e6f9262240dc3ecbeade985bd7f37.png

 

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é par chrisalex
Posté(e) (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é par Bloug
Posté(e)

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 )

 

  • Like 2
Posté(e)

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 :

image.thumb.png.a5f30672e9af69a57faf6a4f21cda565.png

 

Effectively the json was already encoded and to encode again was the issue

×
×
  • Créer...