Python requests Login

03/15/2016 23:24 Benjihz#1
Hallo,
Versuche mich derzeit in Python und bin gerade, der Übung wegen, dabei ein Skript zu schreiben, mit dem man seinen Zalando Acc verwalten/auslesen kann.
Allerdings hänge ich schon am LogIn des ganzen. Den Request mache ich über requests. Ich glaube das Problem ist, dass der Cookie einfach nicht übergeben wird. Immer wenn ich nach dem LogIn über POST auf das Benutzerkonto zugreifen will(GET), bin ich nicht eingeloggt. Auch wenn ich die Seite direkt nach dem LogIn abfrage, bin ich nicht eingeloggt.

Code:
import requests
with requests.Session() as c:
    url = 'https://www.zalando.de/login/'
    USERNAME = "xxx"
    PASSWORD = "xxx"
    #login_data = dict(email = USERNAME, password = PASSWORD, Referer = "https://www.zalando.de/login/")
    payload = {'email': 'xxx', 'password': 'xxx', 'Referer' : 'https://www.zalando.de/login/'}
    get = c.get(url = url)
    post = c.post(url = get.url, params=payload)
    #print(post.text)
    
    

    page = c.get("https://www.zalando.de/benutzerkonto/", params=payload, cookies=c.cookies)
    print (page.text)

Mir ist aufgefallen, dass wenn ich per post.url die URL der POST-Abfrage abfrage, "www.zalando.de" rauskommt und NICHT "www.zalando.de/login". Wieso? Wieso leitet er wohl auf auf zalando.de?

MfG
03/16/2016 01:32 alpines#2
Du sendest nicht genug Daten, schau dir das hier mal an
Code:
$hSession = _WinHttpOpen("Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36")
$hConnect = _WinHttpConnect($hSession, "www.zalando.de", 443)

Local $sHTML = _WinHttpSimpleSSLRequest($hConnect, "GET", "")
Local $aSrcPageRegEx = StringRegExp($sHTML, "_sourcePage"" value=""(.+?)"" \/>", 3)
Local $aXTKRegEx = StringRegExp($sHTML, "name=""_xtk"" value=""(.+?)""\/>", 3)
Local $a__fpRegEx = StringRegExp($sHTML, "__fp"" value=""(.+?)"" \/>", 3)

Local $sData = "email=" & StringReplace($aUser[0], "@", "%40") & _
	 "&password=" & $aUser[1] & _
	 "&sourceId=account" & _
	 "&softLogin=true" & _
	 "&login=" & _
	 "&_sourcePage=" & $aSrcPageRegEx[1] & _
	 "&_xtk=" & $aXTKRegEx[0] & _
	 "&__fp=" & StringReplace($a__fpRegEx, "=", "%3D")

$sHTML = _WinHttpSimpleSSLRequest($hConnect, "POST", "login", Default, $sData)
If StringInStr($sHTML, "Abmelden") Then
03/16/2016 03:23 MrDami123#3
Man hab ich mir ne Weile lang an Logins die Zähne ausgebissen. :P

Jetzt wo ich weiß wie die ganze Suppe funktioniert, kann ich dir das gerne schnell erklären.

Headers:
Dein Browser sendet standardmäßig spezifische Headers mit jeder Anfrage mit. In deinem Browsereinstellungen oder mit Addons kannst du diese ändern.
Zum Beispiel verwende ich ein Addon um meinen User-Agent zu verschleiern.

Der Server ließt die Infos im Header und reagiert entsprechend darauf.
Beispielsweise hat paypal.com meine Anfrage blockiert mit der Aussage "Deine Browserversion ist zu alt und enthält Sicherheitslücken.", weil mein User-Agent-Verschleierer paypal.com gesagt hat ich benutze Chrome Version 28.

Wenn du Anfragen mittels Software baust, musst du ggf. benötige Headers setzen, damit der Server deine Anfrage akzeptiert. Sehr viele Server ignorieren Anfragen die nicht von Browsern stammen.

Parameter und Formulardaten:
In 'requests' gibt es einen Unterschied zwischen Parametern und Formulardaten. Bei einer POST Anfrage verwendet man 'data=' statt 'params='.
Code:
>>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get('http://httpbin.org/get', params=payload)
Cookies:
Wenn du 'requests.Session()' verwendest, werden Cookies automatisch gespeichert und verwendet.

Sitzungsvariablen:
Wenn du eine neue Sitzung startest ('request.Session'), werden in der Regel serverseitig neue Variablen spezifisch für diese Sitzung erstellt, darunter fallen auch einige Cookies.
Diese Sitzungsvariablen befinden sich auch in Formularen. Sie dienen unter anderem der Sicherheit.

Wie geht man jetzt am Besten vor um den Login nachzustellen?
  1. Mittels Browser einloggen und Anfrage analysieren
  2. Daten aus Anfrage im Skript einbauen
  3. Sitzungsvariablen ermitteln und einbauen
  4. POST Anfrage absenden und Erfolg ermitteln

Browser Anfrage:

Hier ein Skript mit Kommentaren: