NEWS
[Frage] HTTP POST - Cookie einfügen ? (Sony TV)
-
MOD-Edit by eric2905; 03.05.2017/09:55; Betreff angepasst
Hallo,
ich möchte meinen Sony Bravia TV mit ioBroker steuern, der syntax und die vorgehensweise sind mir bekannt.
Der TV möchte JSON Strings per HTTP POST haben, bevor er aber eine Steuerung zulässt muß man sich als "Fernbedienung" Registrieren, lesen geht auch ohne Registrierung
die Vorgehensweise zur Registrierung ist wie folgt:
1. POST an http://192.168.xxx.xxx/sony/accessControl mit JSON String:
{"id":13,"method":"actRegister","version":"1.0","params":[{"clientid":"ioBroker:1","nickname":"ioBroker"},[{"clientid":"ioBroker:1","value":"yes","nickname":"ioBroker","function":"WOL"}]]}
2. TV zeigt darauf hin eine Meldung mit PIN
3. PIN in base64 codieren und im Header mit 'Authorization':'Basic Ojg2MzA=' zurück schicken
4. TV Sendet darauf hin ein Cookie z.b. auth=eefbfe6c3bdab6b7876c560cbe292ddb82f425bca256b226d487w03b39fc6a5b <- bis hier hin alles ok, und läuft
5. das Cookie muß jetzt für jeden weitern POST Request mit gesendet werden
jetzt das Problem: wie sende ich das coockie ? ich denke es muß im Header definiert werden ?!
meine Code bis jetz:
var request = require('request'); // Configure the request var options = { url: 'http://192.168.188.24/sony/system', //url: 'http://192.168.188.24/sony/accessControl', method: 'POST', headers: { 'Authorization':'Basic Ojg2MzA=', }, form: '{"method": "setPowerStatus","params": [{"status": false}],"id": 102}' //form:' {"id":13,"method":"actRegister","version":"1.0","params":[{"clientid":"ioBroker:1","nickname":"ioBroker"},[{"clientid":"ioBroker:1","value":"yes","nickname":"ioBroker","function":"WOL"}]]}' }; // Start the request request(options, function (error, response, body) { if (!error && response.statusCode == 200) { // Print out the response body //console.log(body); } console.log('Response:' + JSON.stringify(response)); console.log('Error: ' + error); console.log('Body: '+ body); });
-
Schau mal hier: https://github.com/request/request
fast ganz unten
> Cookies are disabled by default (else, they would be used in subsequent requests). To enable cookies, set jar to true (either in defaults or options).
Da sind auch Beispiele für kompliziertere Fälle, wie das Einfügen eines eigenen Cookies:
var j = request.jar(); var cookie = request.cookie('key1=value1'); var url = 'http://www.google.com'; j.setCookie(cookie, url); request({url: url, jar: j}, function () { request('http://images.google.com') })
-
ok, das erklärt schon mal etwas..
allerdings stehe ich trotzdem gerade aufm Schlauch wo muss ich entsprechend in meinem Code anpassungen machen ? alles was ich bis jetzt versucht habe, hat leider nicht funktioniert
-
hat sich erledigt, klappt jetzt
hier die Lösung
var request = require('request'); var url='http://192.168.188.24/sony/system'; //url: 'http://192.168.188.24/sony/accessControl', PIN=Buffer.from(':'+'0396'); // Configure the request var options = { url: url, jar: true, method: 'POST', headers: {'Authorization':'Basic '+ PIN.toString('base64')}, form: '{"method": "setPowerStatus","params": [{"status": false}],"id": 102}' //form:' {"id":13,"method":"actRegister","version":"1.0","params":[{"clientid":"ioBroker:1","nickname":"ioBroker"},[{"clientid":"ioBroker:1","value":"yes","nickname":"ioBroker","function":"WOL"}]]}' }; var j = request.jar(); var cookie = request.cookie('auth=a63b94235f935cc102ef679eca03081b217b0df10c641099c90d02f8c651d0fe'); // Start the request j.setCookie(cookie,url); request(options, function (error, response, body) { console.log('Response:' + JSON.stringify(response)); console.log('Error: ' + error); console.log('Body: '+ body); });
-
Wenn ich das richtig sehe, solltest du die manuelle Cookie-Zuweisung nicht brauchen, wenn du beim initialen Request jar:true festlegst. Aber wenns funktioniert, ist das schon mal was.