Sto giocando, cercando di scrivere del codice per utilizzare le API tr.im per abbreviare un URL.
Dopo aver letto http://docs.python.org/library/urllib2.html , ho provato:
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 è 200 (penso che dovrebbe essere 202). url è valido, ma l'autenticazione HTTP di base non sembra aver funzionato, perché l'URL abbreviato non è nel mio elenco di URL (su http://tr.im/?page=1 ).
Dopo aver letto http://www.voidspace.org.uk/python/articles/authentication.shtml#doing-it-properly ho anche provato:
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()
Ma ottengo gli stessi risultati. (response.code è 200 e l'URL è valido, ma non è registrato nel mio account su http://tr.im/ .)
Se utilizzo i parametri della stringa di query invece dell'autenticazione HTTP di base, in questo modo:
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()
... allora non solo l'URL è valido ma è registrato nel mio account tr.im. (Anche se response.code è ancora 200.)
Dev'esserci qualcosa di sbagliato nel mio codice (e non nell'API di tr.im), perché
$ curl -u yacitus:xxxx http://api.tr.im/api/trim_url.json?url=http://www.google.co.uk
...ritorna:
{"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"}
... e l'URL appare nel mio elenco di URL su http://tr.im/?page=1 .
E se corro:
$ curl -u yacitus:xxxx http://api.tr.im/api/trim_url.json?url=http://www.google.co.uk
... ancora una volta, ottengo:
{"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"}
Nota il codice è 201 e il messaggio è "URL tr.im già creato [yacitus]".
Non devo eseguire correttamente l'autenticazione HTTP di base (in entrambi i tentativi). Riesci a individuare il mio problema? Forse dovrei guardare e vedere cosa viene inviato tramite il filo? Non l'ho mai fatto prima. Ci sono API Python che posso usare (forse in pdb)? O c'è un altro strumento (preferibilmente per Mac OS X) che posso usare?
"WWW-Authenticate"e codice 401 prima che urllib2 (o httplib2) invii le tue credenziali. Vedi la mia risposta di seguito .