NEWS
http (GET) Aufruf mit username:password@ funktioniert nicht
-
Hallo
ich bekomme folgenden Scriptteil einfach nicht zum laufen.
Das Script wird ausgeführt, zumindest wird die debug Message ausgegeben, danach passiert aber nichts weiter.Wenn ich die Adresszeile in den Browser eingebe dauert es zwar 10-20s aber dann sagt das Gerät message received auf der Browserseite und es hat funktioniert.
Die ganze Adresszeile die aufgerufen werden soll sieht ungefähr so aus:
http://username:passwort@dynamischedns.my.to:1234/set?soc=2Liegt das Ganze daran dass der Get Befehl insgesamt nicht wirklich funktioniert oder am Adapter der das mit Username und Passwort so irgendwie nicht rüberbringt?
-
@arumpel
Schau Dir mal statt "Data" den "Staus code" an. -
@codierknecht
Da kommt 401 zurück was unauthorized heißt.
Wenn ich die URL aber mit copy und paste in den Brower kopiere und aufrufe klappt es.
Muss ich da irgendwas bei der Javascript Instanz noch einstellen oder installieren oder wo klemmts? -
@arumpel sagte in http (GET) Aufruf mit username:password@ funktioniert nicht:
Liegt das Ganze daran dass der Get Befehl insgesamt nicht wirklich funktioniert oder am Adapter der das mit Username und Passwort so irgendwie nicht rüberbringt?
Der Get-Befehl wird schon funktionieren, aber evtl. nicht vollumfänglich mit Blockly. Je nach Art der zulässigen Authentifizierung (Basic, Bearer etc.) der Gegenseite müsste das evtl. in eine JS-Funktion ausgelagert werden.
Bei der Übergabe per URL müssen Sonderzeichen im Kennwort übrigens URL-kodiert werden. Das macht der Browser automatisch, der Get-Befehl in Blockly vermutlich nicht.Näheres dazu kann vielleicht Matthias @haus-automatisierung sagen.
-
@codierknecht Wenn es so im Browser geht, ist es ja einfach nur Basic-Authentication. Das klappt so auch mit Blockly.
Mal den Verbose-Mode im Script aktivieren. Dann sieht man mehr was genau gesendet wird und ob etwas zurückkommt.
-
@haus-automatisierung könnte/wäre/würde so ein Gerät vielleicht eventuell möglicherweise den User Agent prüfen?
-
@homoran Der User-Agent ist ja nur ein separater HTTP-Header und muss nichtmal übermittelt werden. Eine API würde den Agent-Header (hoffentlich) nie prüfen oder validieren.
Dennoch übermittelt der JavaScript-Adapter bei httpGet einen Agent, weil manche damit ja auch Webseiten parsen usw. Siehe
-
@haus-automatisierung sagte in http (GET) Aufruf mit username:password@ funktioniert nicht:
Wenn es so im Browser geht, ist es ja einfach nur Basic-Authentication. Das klappt so auch mit Blockly.
Es könnten aber vielleicht bestimmte Sonderzeichen Ärger machen. Wird der Kram von httpGet auch URL-codiert?
-
@arumpel sagte in http (GET) Aufruf mit username:password@ funktioniert nicht:
Wenn ich die URL aber mit copy und paste in den Brower kopiere und aufrufe klappt es.
hast du dich in dem Browser schon mal manuell authentifiziert?
oder andersherum:
klappt das auch im Inkognito-Tab? -
@haus-automatisierung sagte in http (GET) Aufruf mit username:password@ funktioniert nicht:
Eine API würde den Agent-Header (hoffentlich) nie prüfen oder validieren.
Hatte ich auch schon. Musste dem Request dann einen unverfänglichen Agenten "unterjubeln"
-
@codierknecht sagte in http (GET) Aufruf mit username:password@ funktioniert nicht:
Es könnten aber vielleicht bestimmte Sonderzeichen Ärger machen.
Alles Mutmaßungen und bringt ja niemanden weiter. URL Escaping muss man natürlich selbst machen.
Aber all das würde man im Log des Verbose-Mode ja sehen... -
@haus-automatisierung
Danke für die rege Beteiligung. Ich hoffe ich habe das richtige Log was Ihr sehen wollt. Geändert habe ich darin nur die dynamische DNS Adresse und username sowie passwort. Das sind aber alles nur normale Kleinbuchstaben im Original.javascript.0 09:35:24.768 info script.js.BMS: Ändere BMS SOC
javascript.0 09:35:24.769 info script.js.BMS: httpGet(config={"method":"get","url":"http://dynamischedns.my.to:4718/set?soc=2","responseType":"text","responseEncoding":"utf8","timeout":60000,"auth":{"username":"username","password":"passwort"},"headers":{"User-Agent":"Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0"}})
javascript.0 09:35:24.778 info script.js.BMS: getState(id=mqtt.0.BMS.Pack_Cell_Low_Voltage, timerId=undefined) => {"val":3.169,"ack":true,"ts":1745307321735,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1745307305763}
javascript.0 09:35:24.778 info script.js.BMS: sendTo(instance=telegram.0, cmd=send, msg={"text":"Akkustand kritisch! Geringste Zellenspannung: 3.169V"}, hasCallback=false)
javascript.0 09:35:25.979 info script.js.BMS: httpGet(url=http://username:passwort@dynamischedns.my.to:4718/set?soc=2, responseTime=1210ms)
javascript.0 09:35:25.980 info script.js.BMS: 401 -
@homoran
Also im Chrome Inkognito Tab wenn ich die URL reinkopiere sagt er:dynamischedns.my.to unterstützt keine sichere Verbindung
Du siehst diese Warnung, weil diese Website kein HTTPS unterstützt und du den Inkognitomodus nutzt. Weitere Informationen zu dieser Warnung...Die URL die ich gepasted habe war aber nur http://... also ohne das s
Wenn ich es im Firefox Broswer im privaten Fenster mache klappt es.
Dann kommt ein message received vom Device zurück und der SOC wurde per Webhook geändert. -
@arumpel sagte in http (GET) Aufruf mit username:password@ funktioniert nicht:
Die URL die ich gepasted habe war aber nur http://... also ohne das s
war das auch hinterher noch so?
die Browser ändern das je nach Einstellungen eigenständig ab. -
Im Chrome habe ich es mehrfach probiert. Wenn ich paste mache und da http://... drin steht kommt die Fehlermeldung das kein HTTPS unterstützt wird. In der Adresszeile fehlt aber der Zusatz http:// oder auch https:// komplett, nur der Rest der Adresse steht noch drin.
Trotzdem funktioniert es wenn ich es im Firefox im privaten Fenster eingebe. Das Device gibt dann eine Rückmeldung und der Webhook hat funktioniert.
Nur eben in Blockly mit Get Auffruf funktioniert das nicht. Ich kann so halt nichts automatisieren.
-
@arumpel Was ist das für ein Server, welcher unverschlüsselt im Internet hängt? Da kann ja jeder dazwischenliegende Hop mitlesen.
Ist es Dein eigener, dann schalte die Verschlüsselung ein.
Es gibt noch den Parameter validateCertificate
httpGet( URL, { validateCertificate: false, timeout: 2000, responseType: 'arraybuffer' }, async (err, response) => { ... ... ...
wie das in Blockly aussieht, weiß ich allerdings nicht. Auch nicht, ob Dir das weiterhilft.
In Chrome zeigt er schon das Protokoll an. Dafür muss man in die Adresszeile reinklicken. Die Screenshots sind zwar vom Vivaldi, gilt aber auch für Chrome:
-
@peterfido
Es ist nur ein kleiner Wifi ESP welcher ein PV Akku BMS ausließt um die Werte zu übermitteln. Man kann auch einen SOC Wert setzen, das ist eben ab und an erforderlich wenn die Batterie durch Eigenentladung ziemlich leer ist wenn lange nicht geladen wurde. Ich hab die Software für das Ding nicht programmiert, will nur den Befehl automatisieren.Ja wenn ich in die Adressleiste mit Rechtklick klicke und vollständige URL Anzeigen wähle dann steht die Adresse mit http wie im Versuch mit Paste drin. Ich muss dann auf trotzdem weiter zur unsicheren Seite klicken dann geht der Befehl auch. Nur wenn Blockly das aufruft irgendwie nicht. Ich weiß nicht ob der Programmierer von dem Teil da vielleicht auch irgendwelche Fehler drin hat die es per Blockly unmöglich machen. Es dauert manchmal sehr lange bis das Device antwortet aber ich habe ja schon einen Timeout von 60s gesetzt.