Ich spiele herum und versuche, Code zu schreiben, um mithilfe der tr.im- APIs eine URL zu verkürzen.
Nachdem ich http://docs.python.org/library/urllib2.html gelesen hatte , versuchte ich:
TRIM_API_URL = 'http://api.tr.im/api'
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='tr.im',
uri=TRIM_API_URL,
user=USERNAME,
passwd=PASSWORD)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
response = urllib2.urlopen('%s/trim_simple?url=%s'
% (TRIM_API_URL, url_to_trim))
url = response.read().strip()
response.code ist 200 (ich denke, es sollte 202 sein). Die URL ist gültig, aber die grundlegende HTTP-Authentifizierung scheint nicht funktioniert zu haben, da die verkürzte URL nicht in meiner URL-Liste enthalten ist (unter http://tr.im/?page=1 ).
Nachdem ich http://www.voidspace.org.uk/python/articles/authentication.shtml#doing-it-properly gelesen hatte, versuchte ich auch:
TRIM_API_URL = 'api.tr.im/api'
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, TRIM_API_URL, USERNAME, PASSWORD)
auth_handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://%s/trim_simple?url=%s'
% (TRIM_API_URL, url_to_trim))
url = response.read().strip()
Aber ich bekomme die gleichen Ergebnisse. (response.code ist 200 und die URL ist gültig, aber nicht in meinem Konto unter http://tr.im/ gespeichert .)
Wenn ich anstelle der grundlegenden HTTP-Authentifizierung Abfragezeichenfolgenparameter verwende, wie folgt:
TRIM_API_URL = 'http://api.tr.im/api'
response = urllib2.urlopen('%s/trim_simple?url=%s&username=%s&password=%s'
% (TRIM_API_URL,
url_to_trim,
USERNAME,
PASSWORD))
url = response.read().strip()
... dann ist nicht nur die URL gültig, sondern sie wird auch in meinem tr.im-Konto aufgezeichnet. (Obwohl response.code immer noch 200 ist.)
Es muss jedoch etwas mit meinem Code nicht stimmen (und nicht mit der API von tr.im), weil
$ curl -u yacitus:xxxx http://api.tr.im/api/trim_url.json?url=http://www.google.co.uk
...kehrt zurück:
{"trimpath":"hfhb","reference":"nH45bftZDWOX0QpVojeDbOvPDnaRaJ","trimmed":"11\/03\/2009","destination":"http:\/\/www.google.co.uk\/","trim_path":"hfhb","domain":"google.co.uk","url":"http:\/\/tr.im\/hfhb","visits":0,"status":{"result":"OK","code":"200","message":"tr.im URL Added."},"date_time":"2009-03-11T10:15:35-04:00"}
... und die URL erscheint in meiner Liste der URLs unter http://tr.im/?page=1 .
Und wenn ich renne:
$ curl -u yacitus:xxxx http://api.tr.im/api/trim_url.json?url=http://www.google.co.uk
... wieder bekomme ich:
{"trimpath":"hfhb","reference":"nH45bftZDWOX0QpVojeDbOvPDnaRaJ","trimmed":"11\/03\/2009","destination":"http:\/\/www.google.co.uk\/","trim_path":"hfhb","domain":"google.co.uk","url":"http:\/\/tr.im\/hfhb","visits":0,"status":{"result":"OK","code":"201","message":"tr.im URL Already Created [yacitus]."},"date_time":"2009-03-11T10:15:35-04:00"}
Der Hinweiscode lautet 201 und die Nachricht lautet "tr.im URL Already Created [yacitus]".
Ich muss die grundlegende HTTP-Authentifizierung nicht korrekt durchführen (in beiden Versuchen). Kannst du mein Problem erkennen? Vielleicht sollte ich schauen und sehen, was über das Kabel gesendet wird? Das habe ich noch nie gemacht. Gibt es Python-APIs, die ich verwenden kann (möglicherweise in pdb)? Oder gibt es ein anderes Tool (vorzugsweise für Mac OS X), das ich verwenden kann?
quelle
"WWW-Authenticate"
und den Code 401 eingeben, bevor urllib2 (oder httplib2) Ihre Anmeldeinformationen sendet. Siehe meine Antwort unten .Antworten:
Dies scheint wirklich gut zu funktionieren (aus einem anderen Thread entnommen)
quelle
request.add_header('Authorization', b'Basic ' + base64.b64encode(username + b':' + password))
Wirklich günstige Lösung:
(was Sie möglicherweise entscheiden, ist aus einer Reihe von Gründen nicht geeignet, wie z. B. der Sicherheit der URL)
Beispiel für eine Github-API :
quelle
Schauen Sie sich diese SO-Post-Antwort an und sehen Sie sich auch dieses grundlegende Authentifizierungs-Tutorial aus dem fehlenden Handbuch für urllib2 an .
Damit die Basisauthentifizierung von urllib2 funktioniert, muss die http-Antwort den nicht autorisierten HTTP-Code 401 und einen Schlüssel
"WWW-Authenticate"
mit dem Wert"Basic"
andernfalls enthalten. Python sendet Ihre Anmeldeinformationen nicht und Sie müssen entweder Requests oderurllib.urlopen(url)
Ihre Anmeldung in der URL, oder fügen Sie einen Header wie in der Antwort von @ Flowpoke hinzu .Sie können Ihren Fehler anzeigen, indem Sie Ihren
urlopen
in einen Try-Block einfügen:quelle
Die empfohlene Methode ist die Verwendung des
requests
Moduls :Hier ist eine Python 2/3-kompatible
urllib2
Variante aus einer Hand :Python 3.5+ führt Folgendes ein
HTTPPasswordMgrWithPriorAuth()
:Es ist leicht zu ersetzen
HTTPBasicAuthHandler()
mitProxyBasicAuthHandler()
gegebenenfalls in diesem Fall.quelle
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
urrlib.request.HTTPBasicPriorAuthHandler
Es gelten die gleichen Lösungen wie für Python urllib2 Basic Auth Problem .
siehe https://stackoverflow.com/a/24048852/1733117 ; Sie können eine Unterklasse erstellen
urllib2.HTTPBasicAuthHandler
, um denAuthorization
Header zu jeder Anforderung hinzuzufügen, die der bekannten URL entspricht.quelle
strip
überflüssigb64encode
?Versuchen Sie es mit Python-Request oder Python-Grab
quelle