[Anfänger] Webform mit requests.post abfragen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
JohnnyB
User
Beiträge: 2
Registriert: Mittwoch 23. August 2023, 07:46

Hallo zusammen,

ich würde als Anfänger gerne automatisiert ein Webform abfragen.
Dazu habe ich geschaut, welche Eigenschaften / Parameter der Firefox übergibt und diese nachgestellt.
Ich erhalte zwar eine Antwort (html), aber mir fehlt der 'Info' Teil bzw. das Ergebnis meiner Suche - könnt ihr mir sagen, was ich falsch mache?

Vielen Dank und viele Grüße

JohnnyB

Code: Alles auswählen

import requests
import datetime

start_url = "https://laikra-igv.komm.one/verkehr-igv/servlet/Internetgeschaeftsvorfaelle?AUFRUF=WNL"
post_url = "https://laikra-igv.komm.one/verkehr-igv/servlet/Internetgeschaeftsvorfaelle"

def submit_form():
    """Submit a form"""
    current_time = datetime.datetime.now()
    
    payload = {"WKZ_UNTERSCH_Z" : "WN", "WKZ_ERKENN_Z" : "AA", "WKZ_ZIFFERN" : "1", "WKZ_SUCHMERKMAL" : "NULL", "BTN_WKZSUCHE" : "suchen", "ZEITSTEMPEL" : current_time.strftime("%Y%m%d%H%M%S")}

    s = requests.session()
    res1 = s.get(start_url)
    res2 = s.post(post_url, payload)
    print (res2.text)

if __name__ == '__main__':
    submit_form()
Er tat was er konnte.
Nicht viel es war.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Im Moment bekommt man da einen Hinweis, dass der Dienst gerade nicht zur Verfügung steht.

Allgemeine Anmerkungen zum Quelltext: Konstanten werden KOMPLETT_GROSS geschrieben. Die beiden URLs sind ja eigentlich die gleiche URL, nur das bei `START_URL` noch Abfrageparameter dabei sind. Die würde ich getrennt übergeben.

Die ”Dokumentation” „Submit a form“ bei einer Funktion die `submit_form()` heisst, kann man sich sparen. Da steckt ja keinerlei Mehrwert für den Leser drin.

Namen sollten keine kryptischen Abkürzungen enthalten, oder gar nur daraus bestehen und nicht nummeriert werden. Wenn man einen Wert nicht verwendet, muss man den auch gar nicht erst an einen Namen binden.

`requests.Session`-Objekte sind Kontextmanager, die sollte man mit ``with`` verwenden.

Bei HTTP-Antworten sollte man auf den Antwort-Code achten, ob es sich um eine Fehlermeldung oder eine reguläre Antwort handelt, und entsprechend reagieren.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
from datetime import datetime as DateTime

import requests

URL = "https://laikra-igv.komm.one/verkehr-igv/servlet/Internetgeschaeftsvorfaelle"


def submit_form():
    with requests.session() as session:
        session.get(URL, params={"AUFRUF": "WNL"}).raise_for_status()
        response = session.post(
            URL,
            {
                "WKZ_UNTERSCH_Z": "WN",
                "WKZ_ERKENN_Z": "AA",
                "WKZ_ZIFFERN": "1",
                "WKZ_SUCHMERKMAL": "NULL",
                "BTN_WKZSUCHE": "suchen",
                "ZEITSTEMPEL": DateTime.now().strftime("%Y%m%d%H%M%S"),
            },
        )
        response.raise_for_status()
        print(response.text)


if __name__ == "__main__":
    submit_form()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn ich die selben Requests mache, wie der Browser, kommt trotzdem die Fehlermeldung:
Ihre Eingaben konnten leider nicht &uuml;bernommen werden, da Sie die Navigationsbuttons Ihres Browsers benutzt haben. Bitte wiederholen Sie Ihre Eingabe und klicken Sie anschlie&szlig;end auf die Buttons (<strong>zur&uuml;ck</strong> oder <strong>weiter</strong>) am Seitenende, um weiter auf der Webseite zu navigieren.
Woher der Server weiß, dass ich den Service nicht ordnungsgemäß nutze, ist mir ein Rätsel.
Aber offensichtlich möchten die Betreiber nicht, dass man ihre Seite mißbraucht.
Der saubere Weg wäre, bei der KFZ-Stelle nachzufragen, wie ihr Service per API nutzbar ist.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Vielleicht liegt es am Zeitstempel. Der wird nicht generiert wenn man auf Suchen klickt, sondern der steht schon im Formular als fester Wert, vermutlich wann die Seite ausgeliefert wurde.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
JohnnyB
User
Beiträge: 2
Registriert: Mittwoch 23. August 2023, 07:46

Dann müsste ich den Zeitstempel vom ersten request (session.get(URL, params={"AUFRUF": "WNL"}).raise_for_status()) auslesen und verwenden, oder?
Er tat was er konnte.
Nicht viel es war.
Antworten