NEWS
http request reolink json => login failed
-
Hallo zusammen,
ich versuche meine Kamera direkt anzusteuern und komme nicht mehr weiter.
Was habe ich gemacht (analog zu anderen Forenbeiträgen):Der Befehl auf meinem iobroker-Pi
curl -d '[{"cmd":"Login","action":0,"param":{"User":{"userName":"admin","password":"xxx"}}}]' 192.168.178.xx/api.cgi?cmd=Login
ergibt genau das, was ich als Antwort (den Token) haben möchte:
[ { "cmd" : "Login", "code" : 0, "value" : { "Token" : { "leaseTime" : 3600, "name" : "981a2aab3efef8f" } } } ]
Eine Umsetzung in javascript hatte ich mir so im Forum ersucht:
var url1="http://192.168.178.xx/cgi-bin/api.cgi?cmd=Login"; var json=[{"cmd":"Login","action":0,"param":{"User":{"userName":"admin","password":"xxx"}}}]; var request = require('request'); var options = { url: url1, method: 'POST', form:json }; request(options,function (error, response, body){ console.log(response); console.log('error ' + error); console.log('body ' + body); });
Als Antwort erhalte ich einen leeren body - als Log erhalte ich:
Ändere ich den Code wie folgt, erhalte ich als body => json parse err.//form:json formData: "{'User':{'userName':'admin','password':'xxx'}"
Ändere ich den Code wie folgt, erhalte ich als body => [ { "cmd" : "Login", "code" : 1, "error" : { "detail" : "login failed", "rspCode" : -7 } } ], was ja schon einmal gut aussieht, aber auch falsch ist, denn wenn ich den username ändere, würde ich "invalid user" erwarten, wie ich es per http aus einem Browser auch bekomme.//form:json //formData: "{'User':{'userName':'admin','password':'xxx'}" headers : {'Authorization':'"User":{"userName":"admin","password":"xxx"}'}
Jetzt bin ich ziemlich ratlos, was ich noch machen kann oder an welcher Stelle ich mich für euch "alte Hasen" ungeschickt anstelle ...
-
@peterpan Kompletten curl in ein Exec:
-
@mcu sagte in http request reolink json => login failed:
@peterpan Kompletten curl in ein Exec:
Danke für den Tipp, leider verwende ich kein Blocky, aber wenn ich es so umsetze, erhalte ich " json parse err", obwohl der curl-Befehl so in der Shell funktioniert.
exec("curl -d '[{'cmd':'Login','action':0,'param':{'User':{'userName':'admin','password':'xxx'}}}]' 192.168.178.xx/api.cgi?cmd=Login" , function (error, stdout, stderr) { console.log(error); console.log(stdout); console.log(stderr); });
Ändere ich "-d" jetzt in "-s -H", so erhalte ich als Antwort "[ { "cmd" : "Login", "code" : 1, "error" : { "detail" : "login failed", "rspCode" : -7 } } ]".
Hast du ggf. noch eine Idee?
-
Damit klappt es (exec):
exec('curl -d \'[{"cmd":"Login","action":0,"param":{"User":{"userName":"admin","password":"xxxxx"}}}]\' 192.168.0.147/api.cgi?cmd=Login', async function (error, result, stderr) { console.log(result); json = JSON.parse(result.toString()); token = json[0].value.Token.name; console.log(token); });
Mit request habe ich es auch nicht hinbekommen. Du mittlerweile?
Kannst mich ja mal auf dem Laufenden halten, welche GETs und SETs du zum Laufen bekommen hast.
Welche Cam nutzt du?
-
@nukleuz
Vielen Dank. Ich hatte mich an dem Blocky von MCU versucht, bin da aber nicht weitergekommen. Erst das Umschalten von meinen Blocky-Resten mit dem Befehl auf JS hatte mir den Hinweis gegeben, dass die "\" im Code gefehlt haben. Ich hatte das hier offen gelassen, damit vielleicht doch jemand das mit request hinbekommt.
Was allerdings jetzt ist, dass ich mich mit exec zwar einloggen kann, den token bekomme, aber keine weiteren Befehle mit dem erhaltenen token absetzen kann. Hier kommt der Hinweis, dass ich mich erst einloggen soll. Bspw. sollte nach dem erfolgreichen Login ein http://IPC_IP/api.cgi?cmd=Format&token=TOKEN mit den POST data [{"cmd": "Format", "param": {"HddInfo": {"id": [0]}}}] und dem token aus dem Login möglich sein. Natürlich auch andere Befehle. Hast du das geschafft, nach dem Login noch irgendetwas an die Kamera zu senden oder hast du ggf. einen Hinweis wie ich das bewerkstellen könnte? Wenn ich das schaffen sollte, könnte ich schauen, welche GETs und SETs ich ans Laufen bekomme, aber im Moment scheitert es an den Basics
Ich benutze die E1 Zoom. -
Kein Problem - bei mir sieht es ähnlich aus. Verzweifele bald
Hier mal was bei mir läuft (das ist auch für mich das Wichtigste gewesen - Motion und Snapshot):
Snapshot-URL:http://192.168.0.147/cgi-bin/api.cgi?cmd=Snap&channel=0&rs=wuuPhkmUCeI9WG7C&user=admin&password=password
Motion Detection
http://192.168.0.147/api.cgi?cmd=GetMdState&user=admin&password=password
Mit der Motion aktualisiere ich alle 3 Sekunden einen Datenpunkt (0/1) und lasse mir mit dem Snapshot ein Bild mit Text über Telegram senden, sowie das Licht auf dem Hof einschalten bei Nacht.
Was ich versucht habe, wie du, ist es mit dem erhaltenen Token weiterzuarbeiten - bislang ohne Erfolg.
Ich habe leider nur die Basics des Programmierens und heute ist so ein Abend wo unbedingt Pause sein muss :)))Wenn du da etwas fitter bist, was ich hoffe, dann kann das ja vielleicht was werden
Hier die Versuche:
curl -d '[{"cmd":"Login","action":0,"param":{"User":{"userName":"admin","password":"password"}}},{"cmd":"SetIrLights","action":0,"param":{"IrLights":{"state":"Off"}}}]' 192.168.0.147/api.cgi?cmd=Login&cmd=SetIrLights Response: { "cmd" : "Login", "code" : 0, "value" : { "Token" : { "leaseTime" : 3600, "name" : "44aecc633acd413" } } }, { "cmd" : "SetIrLights", "code" : 1, "error" : { "detail" : "ability error", "rspCode" : -26 } } ]
Hier noch ein paar sehr interessante Links:
https://community.jeedom.com/t/reolink-liste-de-commandes-via-api/25565
https://github.com/ReolinkCameraAPI/reolinkapipy
https://forums.zoneminder.com/viewtopic.php?t=27185Bei Fragen oder Tests einfach her damit!
PS: Ich nutze eine RLC-410W
-
@nukleuz
Ja, ich bin auch nahe am Zusammenbruch . Danke für die Links, schaue ich mir noch an. Ich habe jetzt deinen Code genommen, die "\" ergänzt und einen anderen Befehl genommen:C(); function C(){ exec('curl -d \'[{"cmd":"Login","action":0,"param":{"User":{"userName":"admin","password":"xxxx"}}},{"cmd":"GetDevInfo"}]\' 192.168.178.78/api.cgi?cmd=Login&cmd=GetDevInfo' ,function (error, stdout, stderr) { console.log(error); console.log(stdout); console.log(stderr); } ); }
Damit erhalte ich tatsächlich, ohne den token zu verwenden, die Eigenschaften der Kamera ausgelesen. Bitte versuche es bei dir einmal, bin gespannt.
Ggf. könnte bei dir im Code noch der channel fehlen? ich habe als Beipsiel für POST DATA folgendes bei mir gefunden (Auto noch durch off ergänzen ;)):
[{"cmd": "SetIrLights","action": 0,"param": {"IrLights": {"channel": 0,"state": "Auto"}}}]
Ich habe zwei RLC-410W draußen, die ich über meine Synology Surveillance Station laufen lasse. Hier wird bei Bewegung (zusätzlicher Bewegungsmelder) ein Photo gemacht und via pushover versendet sowie ein kurzer Film aufgenommen und gespeichert.
Meine E1 Zoom steht drinnen, hier erfolgt der Snapshot und die Weiterleitung via pushover wie bei dir, allerdings wenn die Haustüre geöffnet wird. Mein Ziel ist es, die Kamera in eine bestimmte Position verfahren zu können, wenn einer anwesend ist. -
@nukleuz
Noch ein kleines Update und ein kleines Licht am Tunnel ...
Ein paar weitere Befehle funktionieren auf diese Art und Weise. Deinen "ability error" bekomme ich bspw. bei den von mir gewünschten Ptz-Positionen meiner Kamera. Die gibt es nämlich nicht ... Daher scheint der Befehl bei mir nicht möglich zu sein, also rspCode -26. Der Befehl PtzCtrl funktioniert dagegen wieder.