Tôi đang cố gắng viết một số mã để sử dụng các API tr.im để rút ngắn URL.
Sau khi đọc http://docs.python.org/library/urllib2.html , tôi đã thử:
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 là 200 (tôi nghĩ nó phải là 202). url hợp lệ, nhưng xác thực HTTP cơ bản dường như không hoạt động vì URL rút gọn không có trong danh sách URL của tôi (tại http://tr.im/?page=1 ).
Sau khi đọc http://www.voidspace.org.uk/python/articles/authentication.shtml#doing-it-properly, tôi cũng đã thử:
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()
Nhưng tôi nhận được kết quả tương tự. (response.code là 200 và url hợp lệ, nhưng không được ghi lại trong tài khoản của tôi tại http://tr.im/ .)
Nếu tôi sử dụng các tham số chuỗi truy vấn thay vì xác thực HTTP cơ bản, như sau:
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()
... thì url không chỉ hợp lệ mà còn được ghi lại trong tài khoản tr.im của tôi. (Mặc dù response.code vẫn là 200.)
Phải có điều gì đó sai với mã của tôi (và không phải API của tr.im), bởi vì
$ curl -u yacitus:xxxx http://api.tr.im/api/trim_url.json?url=http://www.google.co.uk
... trả về:
{"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"}
... và URL xuất hiện trong danh sách URL của tôi trên http://tr.im/?page=1 .
Và nếu tôi chạy:
$ curl -u yacitus:xxxx http://api.tr.im/api/trim_url.json?url=http://www.google.co.uk
... một lần nữa, tôi nhận được:
{"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"}
Mã ghi chú là 201 và thông báo là "URL tr.im Đã được tạo [yacitus]."
Tôi không được thực hiện xác thực HTTP cơ bản một cách chính xác (trong cả hai lần thử). Bạn có thể phát hiện ra vấn đề của tôi không? Có lẽ tôi nên nhìn và xem những gì đang được gửi qua dây? Tôi chưa bao giờ làm điều đó trước đây. Có API Python nào tôi có thể sử dụng (có lẽ trong pdb) không? Hoặc có công cụ nào khác (tốt nhất là cho Mac OS X) tôi có thể sử dụng không?
"WWW-Authenticate"
và mã 401 trước khi urllib2 (hoặc httplib2) gửi thông tin đăng nhập của bạn. Xem câu trả lời của tôi bên dưới .