Seite 1 von 1

[Anfänger] Webform mit requests.post abfragen

Verfasst: Mittwoch 23. August 2023, 08:24
von JohnnyB
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()

Re: [Anfänger] Webform mit requests.post abfragen

Verfasst: Mittwoch 23. August 2023, 09:18
von __blackjack__
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()

Re: [Anfänger] Webform mit requests.post abfragen

Verfasst: Mittwoch 23. August 2023, 10:05
von Sirius3
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.

Re: [Anfänger] Webform mit requests.post abfragen

Verfasst: Mittwoch 23. August 2023, 12:34
von __blackjack__
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.

Re: [Anfänger] Webform mit requests.post abfragen

Verfasst: Mittwoch 23. August 2023, 13:20
von JohnnyB
Dann müsste ich den Zeitstempel vom ersten request (session.get(URL, params={"AUFRUF": "WNL"}).raise_for_status()) auslesen und verwenden, oder?