Я розігруюсь, намагаючись написати якийсь код для використання 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, а повідомлення - "tr.im URL уже створений [yacitus]."
Я не повинен правильно виконувати базову аутентифікацію HTTP (за жодної спроби). Ви можете помітити мою проблему? Можливо, мені слід подивитися і побачити, що надсилається по дроту? Я ніколи раніше цього не робив. Чи є API-інтерфейси Python, якими я можу скористатися (можливо, в pdb)? Або є інший інструмент (бажано для Mac OS X), яким я можу скористатися?
"WWW-Authenticate"код 401, перш ніж urllib2 (або httplib2) надішле ваші дані. Дивіться мою відповідь нижче .