Update: Aufgrund von Lees Kommentar habe ich beschlossen, meinen Code zu einem wirklich einfachen Skript zu verdichten und über die Befehlszeile auszuführen:
import urllib2
import sys
username = sys.argv[1]
password = sys.argv[2]
url = sys.argv[3]
print("calling %s with %s:%s\n" % (url, username, password))
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, username, password)
urllib2.install_opener(urllib2.build_opener(urllib2.HTTPBasicAuthHandler(passman)))
req = urllib2.Request(url)
f = urllib2.urlopen(req)
data = f.read()
print(data)
Leider wird der Authorization
Header immer noch nicht generiert (per Wireshark) :(
Ich habe ein Problem beim Senden von AUTH über urllib2. Ich habe mir diesen Artikel angesehen und bin dem Beispiel gefolgt. Mein Code:
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, "api.foursquare.com", username, password)
urllib2.install_opener(urllib2.build_opener(urllib2.HTTPBasicAuthHandler(passman)))
req = urllib2.Request("http://api.foursquare.com/v1/user")
f = urllib2.urlopen(req)
data = f.read()
Ich sehe Folgendes auf dem Draht über Wireshark:
GET /v1/user HTTP/1.1
Host: api.foursquare.com
Connection: close
Accept-Encoding: gzip
User-Agent: Python-urllib/2.5
Sie können sehen, dass die Autorisierung nicht gesendet wird, im Gegensatz dazu, wenn ich eine Anfrage per Curl sende: curl -u user:password http://api.foursquare.com/v1/user
GET /v1/user HTTP/1.1
Authorization: Basic =SNIP=
User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.19.4 OpenSSL/0.9.8k zlib/1.2.3
Host: api.foursquare.com
Accept: */*
Aus irgendeinem Grund scheint mein Code die Authentifizierung nicht zu senden - sieht jemand, was mir fehlt?
Vielen Dank
-simon
python
authentication
urllib2
Simon
quelle
quelle
'WWW-Authenticate'
Header zurückgibt. Sie können dies überprüfen, indem Sietry: urllib2.urlopen(req) except urllib2.HTTPError, e: print e.headers
Siehe diese SO-Post-Antwort verwenden .Antworten:
Das Problem könnte sein, dass die Python-Bibliotheken gemäß HTTP-Standard zuerst eine nicht authentifizierte Anfrage senden und dann nur dann die richtigen Anmeldeinformationen gesendet werden, wenn sie mit einem 401-Wiederholungsversuch beantwortet werden. Wenn die Foursquare-Server keine "Standardauthentifizierung" durchführen, funktionieren die Bibliotheken nicht.
Versuchen Sie, Header für die Authentifizierung zu verwenden:
Hatte das gleiche Problem wie Sie und fand die Lösung aus diesem Thread: http://forums.shopify.com/categories/9/posts/27662
quelle
base64.b64encode
stattdessen einfach anrufen könnenbase64.encodestring
und dann die neue Leitung nicht ersetzen müssen.(Kopieren-Einfügen / angepasst von https://stackoverflow.com/a/24048772/1733117 ).
Zuerst können Sie eine Unterklasse
urllib2.BaseHandler
oder festlegenurllib2.HTTPBasicAuthHandler
undhttp_request
so implementieren , dass jede Anforderung den entsprechendenAuthorization
Header hat.Wenn Sie dann faul sind wie ich, installieren Sie den Handler global
quelle
Hier ist, was ich verwende, um ein ähnliches Problem zu beheben, das beim Versuch, auf die MailChimp-API zuzugreifen, aufgetreten ist. Dies macht das gleiche, nur schöner formatiert.
quelle
Der zweite Parameter muss ein URI sein, kein Domänenname. dh
quelle
http://api.foursquare.com
,api.foursquare.com
,http://api.foursquare.com/v1/
, aber das scheint nicht das Problem zu lösen.'WWW-Authenticate'
. siehe diese SO Post Antwort .Ich würde vorschlagen, dass die aktuelle Lösung darin besteht, mein Paket urllib2_prior_auth zu verwenden , das dies ziemlich gut löst (ich arbeite an der Aufnahme in die Standardbibliothek.
quelle
urllib2.urlopen('http://USER:[email protected]/path/')
urllib2
?