micropython: urequests und auth funktioniert nicht - Workaround?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Moin,

    Ich lese mit einem Raspi meinen Datenlogger von Photon-Control Datenlogger aus. Auf dem Logger läuft eine Website mit "User" und "PW" gesichertem Zugang. Der Raspi ist mit der Aufgabe eigentlich unterfordert und ich versuche, das mit einem ESP32 und Micropython zu erledigen. Anstelle von "requests" (Python) versuche ich es mit "urequests" (mpy). Habe überall gesucht, ob es mittlerweile eine Lösung für die Integration von "auth" in mpy gibt, aber nichts gefunden. Gibt es einen Workaround?

    Mein Testprogramm:

    Mit dem dummy - User bekomme ich folgende Ausgabe. Es werden nur die ersten wenigen Zeichen der HTML Seite ausgegeben (bitte keine Kommentare zu den absoluten Positionen, daran ändert sich bei dem Server nichts. Ich weiß, dass "parsen" die richtigere Methode wäre).

    Code
    Mit WLAN verbinden...
    WLAN:  ('192.168.178.121', '255.255.255.0', '192.168.178.1', '192.168.178.1')
    SSID: FRITZ!Box 7490
    IP: 192.168.178.121
    (2023, 1, 12, 20, 59, 48, 3, 12)
    (2023, 1, 12, 21, 59, 48, 3, 12)
    
    
    HTML><HEAD><TITLE>401 Unauthorized</TITLE></HEAD><BODY>401 Unauthorized</BODY></HTML>

    Mit korrektem User/PW wird es leider auch nicht besser:

    urequests hat bei Line 32 folgenden Text:

    Code
    @property
        def text(self):
            return str(self.content, self.encoding)    Zeile aus dem Fehlerhinwei)

    Gibt es einen Workaround oder muss ich bei meinem Raspi bleiben.

    Hans-Jürgen

  • micropython: urequests und auth funktioniert nicht - Workaround?? Schau mal ob du hier fündig wirst!

    • Hilfreichste Antwort

    Probier mal:

    Code
    r = urequests.get('http://192.168.178.197/cgi-bin/menu.cgi?mode=data' , auth=('dummy' , 'root'))
    
    print(r.content)
  • Auf das Encoding kann man sich nicht immer verlassen. Manchmal sind die Angaben des Webservers falsch und stimmen nicht mit dem ausgelieferten Encoding des HTML-Dokuments überein.

    Das Encoding wird mit dem HTTP-Header ausgeliefert:

    Code
    content-type: text/html; charset=utf-8

    Und zusätzlich kann es noch im HTML-Dokument als Meta-Tag vorkommen:

    Code
    <meta charset="utf-8">


    Das Modul requests verwertet den HTTP-Header (nicht meta charset), um das Encoding zu erfahren.

    Das Modul urequests setzt hingegen immer utf8 als Encoding ein.

    Wenn es sich um ein anderes Encoding als utf8 handelt, könnte man nach dem Erstellen der Instanz das richtige Encoding zuweisen.

    Code
    r = urequests.get('http://192.168.178.197/cgi-bin/menu.cgi?mode=data' , auth=('dummy' , 'root'))
    r.encoding = "latin1"
    print(r.text)

    Da sehe ich aber ein ganz großes Problem. Der Speicherplatz reicht sicherlich nicht für die Codecs aus. Ich gehe mal von aus, dass wenn überhaupt Codecs vorhanden sind, diese nur eine rudimentäre Implementierung sind.

    Es gibt noch die Möglichkeit Fehler zu ignorieren bzw. durch ? zu ersetzen.

    Code
    r = urequests.get('http://192.168.178.197/cgi-bin/menu.cgi?mode=data' , auth=('dummy' , 'root'))
    print(r.content.decode("utf8", errors="replace"))
    # oder errors="ignore"
  • Moin,

    der Tipp mit 'r.encoding' hat auf Anhieb geklappt. Jetzt kann ich die Werte aus der Seite auslesen. Habe das Programm testweise etwas erweitert:

    und bekomme diese Ausgabe, genauso wie ich es benötige:

    Code
    Mit WLAN verbinden...
    WLAN:  ('192.168.178.121', '255.255.255.0', '192.168.178.1', '192.168.178.1')
    SSID: FRITZ!Box 7490
    IP: 192.168.178.121
    (2023, 1, 13, 15, 59, 25, 4, 13)
    (2023, 1, 13, 16, 59, 25, 4, 13)
    HTML_Seite b'HTML><HEAD><TITLE>Menu</TITLE>\r\n<meta http-equiv="Content-Type" content="text/html; charset=iso-885'
    Kilowattstunden b'00044428.92' 44428.92

    Danke für die schnellen und hilfreichen Tipps.

    Hans-Jürgen

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!