2017-10-03 2 views
0

Ich übergebe Anfragen an eine API, die oft mehrere Stunden dauern kann, bis meine Anfragen abgeschlossen und Daten zurückgegeben werden. Ich arbeite daran, eine Python-Lösung zu schreiben, in der mein Skript die Anfragen übermittelt und die Statusinformationen in eine Datei auf meinem Laptop schreibt, die später bei Bedarf abgerufen werden kann.Python-Anfrage mit Cookie aus Gurke String?

Wenn ich einen Job an die API übergebe, antwortet die API mit einer Status-URL, die zur Überprüfung des Status meines Jobs verwendet werden kann. Aufgrund des Lastausgleichs der Site muss ich jedoch das Sitzungscookie von meiner ursprünglichen Anfrage abrufen und dieses Cookie verwenden, um sicherzustellen, dass ich den richtigen Server trete, wenn ich die zurückgegebene Status-URL zur Überprüfung meines Jobstatus verwende.

Ich kann die Status-URL aus der API sowie den Cookie aus der Anfrage mit diesem Code abrufen. Beachten Sie, dass ich oft mehrere Jobs einreichen, so kann es sein, mehrere Status-URL/Cookies in der Datei:

# Submit the request to the API 
rPOST = requests.post(url, auth=(uname, passwd), data=json_data, headers=headers) 
CookieMonster = pickle.dumps(rPOST.cookies) # Get the cookie as a string 

# Grab the JSON data currently in the file: 
with open(statFile, mode='r') as status_json: 
    StatusDict = json.load(status_json) 
    status_json.close() 
# Add new URL and cookie to the JSON and write back to the file: 
with open(statFile, mode='w') as status_json: 
    StatusDict[(str(json.loads(rPOST.text)[u'link'][u'href']))] = CookieMonster 
    json.dump(StatusDict, status_json) 
    status_json.close() 

Die einreichen Code funktioniert gut, aber ich erhalte einen 404-Fehler beim Versuch, den Auftragsstatus zu prüfen, die mit Status URL

# Grab the JSON data currently in the file:  
with open(statFile, mode='r') as status_json: 
    StatusDict = json.load(status_json) 
    status_json.close() 

# Check each URL and see if my job's are done: 
for url in StatusDict: 
    CookieMonster = pickle.loads(StatusDict[url]) 
    rGET = requests.get(url, auth=(uname, passwd), cookies=CookieMonster) 

die JSON in meiner Statusdatei sieht wie folgt aus:

{ 
    "https://example.com/sfsalk242234": "Pickled cookie string data here", 
    "https://example.com/sfsa34532234": "Pickled cookie string data here", 
    "https://example.com/23423fsdfssd": "Pickled cookie string data here" 
} 

Das ist etwas mit der Cookies = Cookie Parameter zu tun hat. Wenn ich den Cookie-Parameter entferne und den Code nur ein paar Mal abbringe, werde ich schließlich den Lastausgleich auf den richtigen Server vornehmen und eine Antwort erhalten. Wenn ich jedoch den Cookie-Parameter verwende, erhalte ich nie eine Antwort und bekomme immer eine HTTP 404-Nachricht.

Beachten Sie auch, dass ich für Jobs, die sehr lange dauern, oft meinen Laptop trennen, schlafen, neu starten, etc ... also das Skript zum Erhalt des ursprünglichen Cookie-Objekts laufen lassen ist nicht wirklich eine praktikable Option Aus diesem Grund schreibe ich die Status-URLs und Cookie-Daten auf die Festplatte.

Wie kann ich einen Cookie so speichern und ihn dann zur Verwendung in einer zukünftigen Anfrage abrufen?

Aktualisiert Lösung

rPOST = requests.post(url, auth=(uname, passwd), data=json_data, headers=headers) 
CookieMonster = rPOST.cookies 
with open(statFile, mode='w') as status_json: 
    StatusDict[(str(json.loads(rPOST.text)[u'link'][u'href']))] = CookieMonster.items() 
    json.dump(StatusDict, status_json) 

Dann die Abfrage wie folgt aussehen ändern:

# Check each URL and see if my job's are done: 
for url, cookies in StatusDict: 
    rGET = requests.get(url, auth=(uname, passwd), cookies=dict(cookies)) 

Antwort

0

Ich möchte vermeiden, Gurke, wobei als das RequestsCookieJar um ein Wörterbuch so etwas wie ein Wrapper und Anfragen Methoden nehmen Wörterbücher als Eingabe für Cookies.

with open(statFile, mode='w') as status_json: 
    StatusDict[(str(json.loads(rPOST.text)[u'link'][u'href']))] = CookieMonster.items() 
    json.dump(StatusDict, status_json) 

Dann später

# Check each URL and see if my job's are done: 
for url, cookies in StatusDict: 
    rGET = requests.get(url, auth=(uname, passwd), cookies=dict(cookies)) 
+0

Thank you! Die einzige Sache, die ich Ihrem Code hinzufügen würde, ist, dass CookieMonster = pickle.dumps (rPOST.cookies) zu CookieMonster = rPOST.cookies geändert werden muss, um zu arbeiten. Mit diesem Update funktionierte es wie ein Zauber! – user3246693