Я играю, пытаясь написать код для использования API tr.im для сокращения URL-адреса.
Прочитав http://docs.python.org/library/urllib2.html , я попробовал:
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 (думаю, должно быть 202). URL-адрес действителен, но базовая HTTP-аутентификация, похоже, не сработала, потому что сокращенного URL-адреса нет в моем списке URL-адресов ( http://tr.im/?page=1 ).
Прочитав http://www.voidspace.org.uk/python/articles/authentication.shtml#doing-it-properly, я также попробовал:
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()
Но получаю те же результаты. (response.code - 200, а url действителен, но не записан в моей учетной записи на http://tr.im/ .)
Если я использую параметры строки запроса вместо базовой HTTP-аутентификации, например:
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()
... тогда URL-адрес не только действителен, но и записан в моей учетной записи tr.im. (Хотя response.code по-прежнему 200.)
Что-то должно быть не так с моим кодом (а не с API tr.im), потому что
$ curl -u yacitus:xxxx http://api.tr.im/api/trim_url.json?url=http://www.google.co.uk
... возвращает:
{"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"}
... и URL-адрес действительно отображается в моем списке URL-адресов на http://tr.im/?page=1 .
А если я бегу:
$ curl -u yacitus:xxxx http://api.tr.im/api/trim_url.json?url=http://www.google.co.uk
... снова я получаю:
{"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"}
Код заметки - 201, а сообщение - «URL tr.im уже создан [yacitus]».
Я не должен правильно выполнять базовую аутентификацию HTTP (ни в одной из этих попыток). Вы можете определить мою проблему? Может, мне стоит посмотреть, что передается по сети? Я никогда раньше этого не делал. Могу ли я использовать Python API (возможно, в pdb)? Или есть другой инструмент (желательно для Mac OS X), который я могу использовать?
"WWW-Authenticate"
код 401, прежде чем urllib2 (или httplib2) отправит ваши учетные данные. Смотрите мой ответ ниже .