Warum kann eine Python-POST-Anfrage keine Übereinstimmung in einem Drittsystem speichern, während sie in einem Browser fPython

Python-Programme
Guest
 Warum kann eine Python-POST-Anfrage keine Übereinstimmung in einem Drittsystem speichern, während sie in einem Browser f

Post by Guest »

Zuallererst bin ich Anfänger im Programmieren und verlasse mich oft auf ChatGPT. Dies ist auch meine erste Frage hier, also seien Sie bitte barmherzig. Ich bin für jede verfügbare Hilfe dankbar.
Ich versuche, den Prozess des Speicherns von Spieldaten in der Junior-Eishockey-Anwendung mithilfe von Python und der Anforderungsbibliothek zu automatisieren. Wenn ich die POST-Anfrage über einen Browser (Google Chrome Developer Tools) ausführe, funktioniert die Anfrage und der Abgleich wird erfolgreich gespeichert. Wenn ich jedoch versuche, dieselbe POST-Anfrage programmgesteuert in Python zu replizieren, schlägt der Speichervorgang fehl.
Eine erfolgreiche POST-Anfrage vom Browser enthält die folgenden Parameter:
Payload der Browser-POST-Anfrage
Mein Code zum Hinzufügen eines Spiels nach der Anmeldung mit meinem eigenen Benutzernamen und Passwort:

Code: Select all

def add_game(self, game_data):
add_game_url = "https://ha...ox2020/Games/Game.aspx"

# Get form data
response = self.session.get(add_game_url, headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64;  x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Referer": add_game_url,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
})

if response.status_code != 200:
print(f"Form page load failed!: {response.status_code}")
return

# Parse HTML ja fetch values
soup = BeautifulSoup(response.text, 'html.parser')
viewstate = soup.find("input", {"name": "__VIEWSTATE"})["value"]
eventvalidation = soup.find("input", {"name": "__EVENTVALIDATION"})["value"]
viewstategenerator = soup.find("input", {"name": "__VIEWSTATEGENERATOR"})["value"]

# Build payload
payload = {
"__EVENTTARGET": "",
"__EVENTARGUMENT": "",
"__LASTFOCUS": "",
"__VIEWSTATE": viewstate,
"__VIEWSTATEGENERATOR": viewstategenerator,
"__EVENTVALIDATION": eventvalidation,
"ctl00$MenuContentPlaceHolder$MainMenu$SiteSelector1$DropDownListSeasons": game_data.get("SeasonId", ""),
"ctl00$MenuContentPlaceHolder$MainMenu$SiteSelector1$DropDownListSubSites": game_data.get("SubSiteId", ""),
"ctl00$MainContentPlaceHolder$GameTabs$TabsDropDownList": "javascript:void(0)",
"ctl00$MainContentPlaceHolder$GamesBasicForm$LeagueDropdownList": game_data.get("LeagueDropdownList", ""),
"ctl00$MainContentPlaceHolder$GamesBasicForm$EventDropDownList": game_data.get("EventDropDownList", ""),
"ctl00$MainContentPlaceHolder$GamesBasicForm$HomeTeamTextBox": game_data.get("HomeTeamTextBox", ""),
"ctl00$MainContentPlaceHolder$GamesBasicForm$GuestTeamTextBox": game_data.get("GuestTeamTextBox", ""),
"ctl00$MainContentPlaceHolder$GamesBasicForm$AwayCheckbox": game_data.get("AwayCheckbox", ""),
"ctl00$MainContentPlaceHolder$GamesBasicForm$GameLocationTextBox": game_data.get("GameLocationTextBox", ""),
"ctl00$MainContentPlaceHolder$GamesBasicForm$GameDateTextBox": game_data.get("GameDateTextBox", ""),
"ctl00$MainContentPlaceHolder$GamesBasicForm$GameStartTimeTextBox": game_data.get("GameStartTimeTextBox", ""),
"ctl00$MainContentPlaceHolder$GamesBasicForm$GameDurationTextBox": game_data.get("GameDurationTextBox", "120"),
"ctl00$MainContentPlaceHolder$GamesBasicForm$GameMaxParticipatesTextBox": game_data.get("GameMaxParticipatesTextBox", "0"),
"ctl00$MainContentPlaceHolder$GamesBasicForm$GamePublicInfoTextBox": f"
{game_data.get('GamePublicInfoTextBox', '')}
",
"ctl00$MainContentPlaceHolder$GamesBasicForm$FeedGameDropdown": "0",
"ctl00$MainContentPlaceHolder$GamesBasicForm$GameInfoTextBox": f"""
Ottelu {game_data.get('GameDateTextBox')} klo {game_data.get('GameStartTimeTextBox')}\n
{game_data.get('HomeTeamTextBox')} - {game_data.get('GuestTeamTextBox')}\n
{game_data.get('GameLocationTextBox')}\n\nK...
""",
"ctl00$MainContentPlaceHolder$GamesBasicForm$GameNotificationTextBox": "",
"ctl00$MainContentPlaceHolder$GamesBasicForm$SaveGameButton": "Tallenna"
}

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64;  x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded",
"Referer": "https://hallinta3.jopox.fi/Admin/HockeyPox2020/Games/Game.aspx",
"Cache-Control": "no-cache",
"Pragma": "no-cache",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Language": "fi-FI,fi;q=0.9,en-US;q=0.8,en;q=0.7"
}

print("\nHeaders:")
for key, value in headers.items():
print(f"{key}: {value}")

print("\nPOST URL:", add_game_url)

print("\nCookies:")
for cookie in self.session.cookies:
print(f"{cookie.name}: {cookie.value}")

# Send POST-request
post_response = self.session.post(add_game_url, data=payload, headers=headers, allow_redirects=True)

print("Status Code:", post_response.status_code)
print("Response Headers:", post_response.headers)

soup = BeautifulSoup(post_response.text, 'html.parser')
error_message = soup.find('textarea', {'id': 'ErrorTextBox'})

if error_message:
print("Error found")
else:
print("Error message not found.")

if "ErrorPage" in post_response.headers.get("Location", ""):
print("Server returned an error.")
Cookies vom Entwicklertool nach erfolgreicher POST-Anfrage mit dem Browser:

Code: Select all

_fbp=fb.1.1729010158214.465600806662753604;
__utmz=109879070.1729010159.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided);
__utma=109879070.1919602242.1729010159.1729010159.1734711272.2;
ASP.NET_SessionId=fett[...]f3lwui5t; MopoxAdm=D0BE15FD1A3CF39[...]610364F6B10C5A1AB9306BA4BF69AD530
Cookies in Python POST-Anfrage:

Code: Select all

ASP.NET_SessionId: qax1dppoz4c53kiojivhjcvy
jpxapp: 309B90D89660703B[...]B79453F2B6B7CF96
jpx_team_select: 8787
ASP.NET_SessionId: fbcbhqlv[...]spq3t
MopoxAdm: 2A40350542[...]CD19584826B43AFDFB8CBA2760ED4406320B0D9AA1EE84
PROBLEM:
Wenn ich die POST-Anfrage programmgesteuert sende:
  • Statuscode: 200
  • Antwort-HTML: Der Server speichert die Daten nicht und gibt eine HTML-Seite mit einem Textfeld einschließlich verschlüsselter Fehlermeldung und Anleitung zurück um den Support zu kontaktieren.
Teil der Fehlermeldung: „3jQ%2B%2BD11nInVMikhH5RyAXjs[...]%2BKPlruJNvm37CXTkRxTJQ8fplAjlfqbSk3CWg8c5Q %2B7efRRYAmy%2BE%3D"
Was ich versucht habe:
  • Verglich die Formulardaten und Header der Browser- und Python-POST-Anfragen – Sie scheinen identisch zu sein.
  • Bestätigt, dass dynamische Felder wie __VIEWSTATE, __EVENTVALIDATION und andere korrekt analysiert werden und gesendet.
  • Requests.Session() verwendet, um Cookies und Sitzungspersistenz zu verarbeiten.
  • Mit Entwickler getestet Tool zum erneuten Senden der erfolgreichen POST-Anfrage mit leicht geänderten Daten, aber es kam zu derselben Fehlermeldung.
  • Habe stundenlange Gespräche mit chatGPT mit Nr Glück.
Fragen:
  • Warum schlägt die POST-Anfrage fehl, wenn sie in Python repliziert wird?
  • Gibt es spezielle Überlegungen für die programmgesteuerte Interaktion mit .NET-basierten (.aspx) WebForms-Anwendungen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post