NEWS
[gelöst] Fehler beim https post für ein Formular (Car-Net)
-
Hallo zusamen,
bin gerade dabei das Python-Skript von https://github.com/wez3/volkswagen-carn … net_web.py als JavaScript in ioBroker zu implementieren. Ich bin auch schon durch eine https-Requests durch und scheitere nun am Übergeben der Formulardaten bei einem POST-Request.
Skript:
! ````
// Skript zum Abragen des Status im Car-Net von Volkswagen
// V1.0.0 - 03.06.2018 - initiale Version
! var request = require('request');
! var base = "https://www.volkswagen-car-net.com";
var authbase = "https://security.volkswagen.com";
var csrf = "";
var refUrl = "";
var viewState = "";
var email = "user-email";
var password = "passwort";
var errCount = 0; // Anzahl zulässige Fehler bis Mail verschickt wird
! function carNet_error(meldung, typ) {
if (typ === undefined)
typ = "";
! var sendMail = true;
log('CarNet: ' + meldung, 'error');
if (typ == "main") {
errCount ++;
if (errCount < 3)
sendMail = false;
}
if (sendMail)
sendTo("email", {
subject: "FEHLER bei CarNet-Verarbeitung",
text: meldung
});
}
! function getPartOfSite(content, startTag, endTag, startOffset) {
if (startOffset === undefined)
startOffset = 0;
var pos = content.indexOf(startTag, startOffset);
if (pos >= 0) {
pos += startTag.length;
var pos2 = content.indexOf(endTag, pos +1);
if (pos2 >= 0) {
return {
found: true,
value: content.substring(pos, pos2).trim(),
start: pos,
end: pos2,
cutter: pos2 + endTag.length
};
}
}
return null;
}
! function carNet_login() {
csrf = "";
refUrl = "";
viewState = "";
request(base + '/portal/en_GB/web/guest/home', process_login1);
}
! function get_csrf(body) {
var data = getPartOfSite(body, '');
if (data === null) {
carNet_error('Kein Token für Login gefunden\n' + body);
return "";
}
return data.value;
}
! function get_loginUrl(body) {
var data = getPartOfSite(body, 'cn-login-url="', '"');
if (data === null) {
carNet_error('Keine Login-URL gefunden\n' + body);
return "";
}
return data.value;
}
! function get_viewState(body) {
var data = getPartOfSite(body, 'name="javax.faces.ViewState" id="j_id1:javax.faces.ViewState:0" value="', '"');
if (data === null) {
carNet_error('Keinen Viewstate für Login gefunden\n' + body);
return "";
}
return data.value.replace(/\x3a/g, ":").replace(/\x2f/g, "/").replace(/\x2e/g, ".");
}
! function get_redirectUrl(body) {
var data = getPartOfSite(body, '');
if (data === null) {
//carNet_error('Keine Redirect-URL nach Login gefunden\n' + body);
console.log("Mist, nichts gefunden!!!"+body);
return "";
}
return data.value.replace('&', '&');
}
! function get_authheader(url, redir) {
if (redir === undefined)
redir = true;
var options = null;
if (redir)
options = {
url: url,
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0.1; D5803 Build/23.5.A.1.291; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36',
'Referer': base + '/portal',
'X-CSRF-Token': csrf
}
};
else
options = {
url: url,
followRedirect: function (resp) {
return false;
},
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0.1; D5803 Build/23.5.A.1.291; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36',
'Referer': base + '/portal',
'X-CSRF-Token': csrf
}
};
return options;
}
! function process_login1(err, stat, body) {
if (err)
carNet_error('Fehler "' + err + '" beim Abruf der Login-Seite');
else if(body) {
var detailsUrl = stat.request.uri.href;
csrf = get_csrf(body);
if (csrf === "")
return;
console.log("Session = " + csrf);
request(get_authheader(base + "/portal/web/guest/home/-/csrftokenhandling/get-login-url"), process_login2);
} else {
carNet_error("Login1-Seite ist leer (" + stat.statusCode + ")");
}
}function process_login2(err, stat, body) {
if (err)
carNet_error('Fehler "' + err + '" beim Abruf der Login-Seite 2');
else if(body) {
var loginUrl = get_loginUrl(body);
if (loginUrl === "")
return;
//console.log('Login-URL: ' + loginUrl);
request.get(get_authheader(loginUrl, false), process_login3);
} else {
carNet_error("Login2-Seite ist leer (" + stat.statusCode + ")");
}
}function process_login3(err, stat, body) {
if (err)
carNet_error('Fehler "' + err + '" beim Abruf der Login-Seite 3');
else if(stat.statusCode == 302) {
refUrl = stat.headers.location;
if (refUrl === "") {
carNet_error("Keine Location für Redirect gefunden");
return;
}
console.log('refURL: ' + refUrl);
request.get(get_authheader(refUrl), process_login4);
} else {
carNet_error("Login3-Seite ist leer (" + stat.statusCode + ")");
}
}function process_login4(err, stat, body) {
if (err)
carNet_error('Fehler "' + err + '" beim Abruf der Login-Seite 4');
else if(body) {
viewState = get_viewState(body);
if (viewState === "")
return;
console.log('ViewState = ' + viewState);
var formData = {
'loginForm': 'loginForm',
'loginForm:email': email,
'loginForm:password': password,
'loginForm:j_idt19': '',
'javax.faces.ViewState': viewState,
'javax.faces.source': 'loginForm:submit',
'javax.faces.partial.event': 'click',
'javax.faces.partial.execute': 'loginForm:submit loginForm',
'javax.faces.partial.render': 'loginForm',
'javax.faces.behavior.event': 'action',
'javax.faces.partial.ajax': 'true'
};
var options = {
url: authbase + '/ap-login/jsf/login.jsf',
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0.1; D5803 Build/23.5.A.1.291; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36',
'Faces-Request': 'partial/ajax',
'Referer': refUrl,
'X-CSRF-Token': ''
},
form: formData,
method: 'POST'
};
console.log("URL: " + options.url);
console.log("ref: " + refUrl);
request(options, process_login5);
} else {
carNet_error("Login4-Seite ist leer (" + stat.statusCode + ")");
}
}function process_login5(err, stat, body) {
if (err)
carNet_error('Fehler "' + err + '" beim Abruf der Login-Seite 5');
else if (body) {
console.log('Status = ' + stat.statusCode);
var redirectUrl = get_redirectUrl(body);
if (redirectUrl === "")
return;
console.log('Wow! ' + redirectUrl);
//request.get(get_authheader(refUrl), process_login4);
} else {
carNet_error("Login5-Seite ist leer (" + stat.statusCode + ")");
}
}! function doRequest() {
carNet_login();
}
! doRequest(); // einmal gleich losstartenDie Daten, die ich beim Post in process_login4 übergebe entsprechen genau denen die auch im Python-Skript übergeben werden. Leider erhalte ich aber keinen Login wie im Phython-Skript (das funktioniert, hab ich getestet) sondern nur einen Response 500 und dass die Applikation zur Zeit nicht zur Verfügung stehe. Wenn ich die Form-Daten weglasse, kommt es zum selben Fehler. Ich vermute daher, dass diese nicht korrekt übergeben werden. Hab es schon mit request.post versucht, hab die Daten mit stringify als body übergeben, wie hier [https://stackoverflow.com/questions/171 … st-module ](https://stackoverflow.com/questions/17121846/node-js-how-to-send-headers-with-form-data-using-request-module) beschrieben. Leider alles erfolglos. Hat jemand einen Tipp für mich? Ich hatte bei mir natürlich gültige Login-Daten im Skript. Aber bei falschen Daten käme auch im Python-Skript eine andere Fehlermeldung. Also müsste man das auch ohne Zugangsdaten testen können. Viele Grüße Sneak-L8
-
Aber ich [emoji3]
Problem war, dass das Python-Skript eine Session benutzt, um z.B. Cookies durchzureichen.
Wenn man dem Request ein jar: request.jar() mit gibt, dann klappt es…
Edit: Hier viewtopic.php?f=35&t=15308 ist das Skript.