Aller au contenu

Help - requete HTTPS vers synology


Messages recommandés

Posté(e)

Bonjour,

je cherche de l'aide car je bloque sur quelque chose qui doit être facile mais qui pour moi est très compliqué.

 

J'aimerai envoyer une requete HTTPS depuis la HC3 pour déclencher une action préconfigurée dans  surveillance station (synology).

 

En clair la HC3 remonte un mouvement PIR et pousse la requête HTTPS qui déclenche l'action préconfigurée dans surveillance station.

 

le requête est la suivante :

https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="Trigger"&version=1&eventId=1&eventName="This is external event1"&account="{account}"&password="{password}"

Dans Firefox, j'ai le bon retour "success" et l'action préconfigurée fonctionne.

 

Comme j'ai vu que l'on pouvait faire ce genre de chose avec net.HTTPClient(), je me suis lancé mais évidement ce n'est pas si simple, du moins pour moi...

 

J'ai créé une scene lua et en déclaration j'ai ;

{
  conditions = { {
      id = 216,
      isTrigger = true,
      operator = "==",
      property = "value",
      type = "device",
      value = true
    } },
  operator = "all"
}

 

en action j'ai ;

local http = net.HTTPClient()
http:request("https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="Trigger"&version=1&eventId=1&eventName="This is external event1"&account="MONLOGIN"&password="MONPASSWORD"", {
	success = function(response)
		if response.status == 200 then
			fibaro:debug('OK, réponse : '.. response.data)
		else
			fibaro:debug("Erreur : status=" .. tostring(response.status))
		end
	end,
	error = function(err)
		fibaro:debug("Erreur : " .. err)
	end,
	options = {
		method = 'GET'
	}
})

 

Selon mes essais j'ai toujours des messages d'erreurs

[02.03.2021] [06:31:47] [ERROR] [SCENE99]: (load):3: ')' expected near 'Trigger'

[02.03.2021] [06:46:11] [ERROR] [SCENE99]: (load):3: ')' expected near '"&method="'

[02.03.2021] [06:47:13] [ERROR] [SCENE99]: (load):3: ')' expected near '"Trigger"'

 

J'ai compris que le problème c'est la requête HTTPS en elle même car elle contient des " un peu partout.

Elle n'est pas prise en compte dans son intégralité et du coup le reste de la requête génère des erreurs.

 

Pourriez vous m'aider SVP ?

 

  

Posté(e)

La réponse saute aux yeux avec la coloration du code, et en plus le message d'erreur t'indique où ça coince : près de Trigger dans ton URL

 

Ce sont les guillemets, tu ne peux pas les mettre ainsi dans une chaine de caractère (string) elle-même entourée de guillemets.

 

Donc soit tu entoures ta chaine complète de single quotes à la place des doubles quotes, soit tu protège les doubles quotes à l'intérieur de la chaine par des antislashs.

 

'https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="Trigger"&version=1&eventId=1&eventName="This is external event1"&account="MONLOGIN"&password="MONPASSWORD"'

-- ou :

"https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method=\"Trigger\"&version=1&eventId=1&eventName=\"This is external event1\"&account=\"MONLOGIN\"&password=\"MONPASSWORD\""

(tu vois bien que la chaine entière est colorée, il n'y a plus de rupture)

 

Par ailleurs, si ton intention était de concaténer la chaine de caractères avec une variable, alors il faut lui dire avec les 2 petits points :

"https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="..Trigger.."&version=1&eventId=1&eventName="..This_is_external_event1.."&account="..MONLOGIN.."&password="..MONPASSWORD

(tu noteras que j'ai mis des underscores dans le nom de variable This_is_external_event1, car les espaces sont évidemment impossibles dans un nom de variable)

  • Like 1
Posté(e)

Ok,

j'ai compris la notion de chaine, quote et antislashs.

 

Je test ca !

Merci Bcp,

 

 

Posté(e) (modifié)

j'ai essayé les 3 possibilités en prenant en compte les explications.avec cette version je vois qu'il prend bien la totalité de ma requête
 

local http = net.HTTPClient()
http:request('https://IPSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="Trigger"&version=1&eventId=1&eventName="This_is_external_event1"&account="LOGIN"&password="PASSWORD"', {
    success = function(response)
        if response.status == 200 then
            fibaro:debug('OK, réponse : '.. response.data)
        else
            fibaro:debug("Erreur : status=" .. tostring(response.status))
        end
    end,
    error = function(err)
        fibaro:debug("Erreur : " .. err)
    end,
    options = {
        method = 'PUT'
    }
})

 

j'ai une erreur à la fin mais sans precision

[02.03.2021] [18:51:33] [ERROR] [SCENE99]:

 

avec les Slashs j'ai ca :(

[02.03.2021] [18:18:00] [ERROR] [SCENE99]: (load):3: unexpected symbol near '<\239>'

 

les .. il veut pas :20:

[02.03.2021] [18:23:40] [ERROR] [SCENE99]: (load):2: unfinished string near ''https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="..Trigger.."&version=1&eventId=1&eventName="..This_is_external_event1.."&account="..LOGIN.."&password="..PASSWORD, {'

 

 

 

Modifié par jucom
modif insertion code
Posté(e)

J'ai lu que pcall permettait de détecter plus facilement ou se trouvent les erreurs.

le truc c'est que je ne sais pas comment l’implémenter.

 

Posté(e)

Déjà il te dit clairement où est l'erreur : dans la string qui contient ton URL.

Je ne sais pas quel éditeur de code tu utilises, mais Notepad++ par exemple, permet la coloration du texte selon le langage utilisé (qu'il détecte automatiquement si le fichier porte l'extension .lua), ça aide énormément à détecter les erreurs de syntaxe.

 

pcall() s'utilise de cette façon là :

local status, err = pcall(function()

	http:request(url, {
		success = function(response)
			-- Suite des traitements...
		end,
		error = function(err)
			-- Gestion de l'erreur
		end,
		options = {
			-- options...
		}
	}) -- http:request()

end) -- pcall()

if not status then
	-- Gestion de l'erreur
	print(err)
end

Cela évite de faire planter le script, permet de traiter l'erreur, et de continuer l'exécution.

 

Pour information pcall() est également très utile (voire indispensable) pour une autre fonction qui a la fâcheuse habitude de planter : json.decode() si le JSON donné en argument est mal formaté.

Exemple :

local status, jsonTable = pcall(function() return json.decode(response.data) end)
if status then
	-- Suite des traitements...
else
	print(jsonTable or "json.decode() failed")
end

 

Posté(e)

Bon j'ai bien avancé grâce a tes conseil Lazer et aux échanges que j'ai pu lire sur le forum

local http = net.HTTPClient()
http:request('https://AdresseSynology/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="Trigger"&version=1&eventId=1&eventName="This_is_external_event1"&account="LOGIN"&password="PASSWORD"', {
    success = function(response)
        if response.status == 200 then
            print('OK, réponse : '.. response.data)
        else
            print("Erreur : status=" .. tostring(response.status))
        end
    end,
    error = function(err)
        print("Erreur : " .. err)
    end,
    options = {
        method = 'GET'
    }

J'ai remplacé fibaro:debug() par print() et ca fonctionne enfin... presque :-)

 

La commande est bien envoyée,

mais la HC3 a pour réponse du Synology ;
[06.03.2021] [23:53:17] [DEBUG] [SCENE99]: OK, réponse : {"error":{"code":101},"success":false}

Cela correspond à un paramètre invalide ce que je ne comprends pas puisque la même commande HTTPS fonctionne quand elle est utilisée seule dans un navigateur.

J'ai testé en méthode 'GET' et 'PUT' c'est pareil.

Je continu mes recherches...

Posté(e)

Je pense qu'il n'aime pas les doubles quotes dans l'URL, il faudrait que tu fasses un urlencode() de ta chaine avant de la donner à http:request()

 

Mais je suis surpris quand même, est-tu certain de la nécessité de mettre des guillemets ?

J'utilise l'API Synology pour d'autres usages, et je n'ai jamais eu besoin... et c'est même carrément pas standard comme pratique, en général on utilise uniquement des caractères classiques dans les URL, autant que possible.

Posté(e)

Effectivement la commande dépouillée des " passe bien dans le navigateur

https://ADRESSEDUSYNO/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&amp;method=Trigger&amp;version=1&amp;eventId=1&amp;eventName=This_is_external_event1&amp;account=LOGIN&amp;password=PASSWORD 

 

Mais pas via la HC3 qui renvoie toujours 

[07.03.2021] [18:38:28] [DEBUG] [SCENE99]: OK, réponse : {"error":{"code":101},"success":false}

J'ai testé avec ' juste avant et après le requête HTTPS et " aussi mais le résultat est le même.

 

La requête https initial est générée tel quel par surveillance station avec tous ces ".

Je l'utilisais dans EEDOMUS et je la teste dans un navigateur.

 

 

 

 

 

 

Posté(e)

oui OK mais il faut toujours que tu fasses un urlencode()

 

A vue de nez, rien que les espace dans ton message "This is external event" ne sont pas valides dans une requête

 

function urlencode(str)
	if str then
		str = string.gsub(str, "\n", "\r\n")
		str = string.gsub(str, "([^%w %-%_%.%~])", function(c) return string.format("%%%02X", string.byte(c)) end)
		str = string.gsub(str, " ", "+")
	end
	return str	
end

Puis :

local url = urlencode("https://ADRESSEDUSYNO/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method=Trigger&version=1&eventId=1&eventName=This_is_external_event1&account=LOGIN&password=PASSWORD")

http:request(url, {
	-- la suite ...

 

Posté(e) (modifié)

J'ai trouvé !!

Laser tu m'a mis sur la voie avec les ".


J'ai creusé pour tomber sur ce site faisant référence à Encodage-pourcent

https://developer.mozilla.org/fr/docs/Glossary/percent-encoding

 

L'HC3 avec net.HTTPClient() semble ne pas aimer du tout certain caractères spéciaux et je pense que les navigateurs modernes les interprètent tout seul.

Apres vu mon niveau je me trompe peut être dans l'analyse.

 

J'ai donc enlevé tous les ? les & et je les ai remplacés.

 

ca donne ca

https://ADRESSESYNOLOGY/webapi/entry.cgi%3Fapi=SYNO.SurveillanceStation.ExternalEvent%26method=Trigger%26version=1%26eventId=1%26eventName=This_is_external_event1%26account=LOGIN%26password=PASSWORD

 

au lieu de ca

https://ADRESSEDUSYNO/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method=Trigger&version=1&eventId=1&eventName=This_is_external_event1&account=LOGIN&password=PASSWORD 

 

Ca fonctionne enfin !

Un grand merci pour le temps passé !

:60:

Modifié par jucom
correction code
Posté(e)

Ah voilà, tu vois !

Tant mieux, m'enfin tu aurais utilisé la fonction urlencode() que je t'ai proposé d'utiliser depuis ce matin ça aurait été plus vite ;)

 

Posté(e)

Oui j'avais commencé a regarder,
c'est juste que pour moi c'est une nouvelle fonction à apprendre et je ne sais pas comment l'utiliser. 

Du coup j'ai fait au plus simple d'abord mais plus long du coup ..

 

Merci encore !
:5:

 

 

 

  • 1 an après...
Posté(e)
Le 07/03/2021 à 20:40, Lazer a dit :

Ah voilà, tu vois !

Tant mieux, m'enfin tu aurais utilisé la fonction urlencode() que je t'ai proposé d'utiliser depuis ce matin ça aurait été plus vite ;)

 

J'ai voulu utiliser cette fonction

et à la ligne 

url = string.gsub(url, "([^%w %-%_%.%~])", function(c) return string.format("%%%02X", string.byte(c)) end)

(url = 

    local url = "https://maker.ifttt.com/trigger/xxxx/with/key/xxxxx?value1=supèrde&value2=&value3=TestDepuisHC3"
)
J'ai l'erreur suivante
[30.05.2022] [17:53:00] [ERROR] [QUICKAPP173]: QuickApp crashed
[30.05.2022] [17:53:00] [ERROR] [QUICKAPP173]: Unknown error occurred: std::runtime_error: 'Invalid argument'

qu'ai-je mal fait ?

Posté(e)

Tu es quand même très fort pour être le seul à trouver des erreurs inédites @jojo :13:

(chat noirs inside :lol: )

 

Je vois un accent "è" dans ton url, ce qui est interdit, c'est probablement la cause.

Posté(e)

mais justement, ton bout de code ce n'est pas pour que les caractères spéciaux passent ?

 

en tout cas ce code passe (avec le "è" et une instruction mise en commentaire)

    local http = net.HTTPClient()
    local url = "https://maker.ifttt.com/trigger/Message/with/key/bZ5dr5MH9lcZ8c53F4AXau?value1=supèr de faire dire ce qu'on veut à ses Google Home&value2=&value3=Test Depuis HC3"
      url = string.gsub(url, "\n", "\r\n")
--      url = string.gsub(url, "([^%w %-%_%.%~])", function(c) return string.format("%%%02X", string.byte(c)) end)
      url = string.gsub(url, " ", "+")
    http:request(url, {
        success = function(response)
            if response.status == 200 then
                print('OK, réponse : '.. response.data)
            else
                print("Erreur : status = " .. tostring(response.status))
            end
        end,
        error = function(err)
            print("Erreur : " .. err)
        end,
        options = {
            method = 'GET'
        }
    })

donc je ne crois pas que mes chats noirs soient revenus (et je ne suis pas pressé de les revoir)

Posté(e)

Les caractères spéciaux oui (espace, &, ...), mais les accents c'est plus que spécial, c'est juste une aberration de certaines langues latines (pas de chance pour nous) !

Parce qu'on ne sait jamais trop si c'est encodé en UTF8 ou ISO-8859, bref une plaie que les Unixiens et Linuxiens connaissent bien.

 

Historiquement les accents sont interdits dans les URL, mais une rapide recherche me montre que ça semble maintenant autorisé. Comme quoi tu évolue :)

 

Du coup... ben... ce code LUA pour la fonction urlencode() qu'on utilise depuis des années.... tu as découvert qu'il n'est pas compatible avec les accents !

En commentant une ligne gsub(), tu as contourné le problème, mais tu vas t'en créer d'autre, car la fonction ne fera plus la conversion de tout un tas de caractères spéciaux (les caractères spéciaux "normaux", ceux qu'on connais de manière historique : - _ . ~ etc...)

 

Je n'utilise pas IFTTT, mais n'as tu pas la possibilité de passer tes paramètres en données d'une requête POST ou PUT, plutôt que dans l'URL d'une requête GET ?

Posté(e)

ma ligne en commentaire me permet de faire paler mes GH. Je sais, ce n'est pas beau.

Mais en la réactivant et en supprimant tout les caractères spéciaux, ça ne fonctionne toujours pas.

Mon url modifiée :

    local url = "https://maker.ifttt.com/trigger/xxx/with/key/xxx?value1=supairdefairedirececonveutasesGoogleHome&value2=&value3=TestDepuisHC3"
      url = string.gsub(url, "\n", "\r\n")
      url = string.gsub(url, "([^%w %-%_%.%~])", function(c) return string.format("%%%02X", string.byte(c)) end)
      url = string.gsub(url, " ", "+")
    http:request(url, { ...

l'erreur

01.06.2022] [15:40:00] [DEBUG] [QUICKAPP173]: onInit
[01.06.2022] [15:40:00] [ERROR] [QUICKAPP173]: QuickApp crashed
[01.06.2022] [15:40:00] [ERROR] [QUICKAPP173]: Unknown error occurred: std::runtime_error: 'Invalid argument'

ce sont mes chats noir qui reviendraient ?

 

Pour des requètes POST et PUT, je vais regarder, mais il faudrait d'abord que je comprenne la différence avec du GET ...

Posté(e)

en fait je le fais par ce biais, car ça ne fonctionnait pas par GEA. Maintenant ok, je crois avoir vu ce qui n'allait pas (comment reproduire le problème dans GEA)

Posté(e)
Le 01/06/2022 à 15:43, jojo a dit :

ma ligne en commentaire me permet de faire paler mes GH

tu utilises quel système pour les faire parler ?

moi j'utilise Pushbullet avec  nodeJS...

Posté(e)

j'utilise cette solution également (cfr tuto que j'avais écrit TTS pour assistant vocaux - lien dans ma signature)

Maintenant, dès que je suis prêt avec ma migration vers HC3, je vais regarder une autre solution : j'ai vu ici une solution avec nodered, ce qui semblerait simplifier l'architecture

Posté(e)

pour la partie nodeJS, j'ai fais une installation sous windows, sur un PC allumé H24 7/7, ça fonctionne très bien, et assez simple à mettre en œuvre.

Tu nous diras avec nodered...

Posté(e)

Pour nodeJS, je l'ai installé sur une Debian sur EXSI et un HP Gen8 qui tourne 24/7. J'ai abonné la solution sous Synology

×
×
  • Créer...