Estoy jugando, tratando de escribir código para usar las API de tr.im para acortar una URL.
Después de leer http://docs.python.org/library/urllib2.html , probé:
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()
El código de respuesta es 200 (creo que debería ser 202). url es válida, pero la autenticación HTTP básica no parece haber funcionado, porque la URL abreviada no está en mi lista de URL (en http://tr.im/?page=1 ).
Después de leer http://www.voidspace.org.uk/python/articles/authentication.shtml#doing-it-properly también probé:
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()
Pero obtengo los mismos resultados. (El código de respuesta es 200 y la URL es válida, pero no está registrada en mi cuenta en http://tr.im/ ).
Si uso parámetros de cadena de consulta en lugar de la autenticación HTTP básica, así:
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()
... entonces no solo la URL es válida, sino que está registrada en mi cuenta tr.im. (Aunque el código de respuesta sigue siendo 200).
Sin embargo, debe haber algo mal con mi código (y no con la API de tr.im), porque
$ curl -u yacitus:xxxx http://api.tr.im/api/trim_url.json?url=http://www.google.co.uk
...devoluciones:
{"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"}
... y la URL aparece en mi lista de URL en http://tr.im/?page=1 .
Y si corro:
$ curl -u yacitus:xxxx http://api.tr.im/api/trim_url.json?url=http://www.google.co.uk
... de nuevo, obtengo:
{"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"}
Tenga en cuenta que el código es 201 y el mensaje es "URL de tr.im ya creada [yacitus]".
No debo realizar correctamente la autenticación HTTP básica (en ninguno de los intentos). ¿Puedes detectar mi problema? ¿Quizás debería mirar y ver qué se envía por cable? Nunca había hecho eso antes. ¿Hay API de Python que pueda usar (quizás en pdb)? ¿O hay otra herramienta (preferiblemente para Mac OS X) que pueda usar?
"WWW-Authenticate"
y el código 401 antes de que urllib2 (o httplib2) envíe sus credenciales. Vea mi respuesta a continuación .