1. ホーム
  2. python

[解決済み] Python urllib2、HTTP基本認証、そしてtr.im

2023-04-25 15:55:56

質問

を使うコードを書こうとして遊んでいます。 tr.im API を使用して 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 リストにはありません (at 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のままですが。)

しかし、私のコードに何か問題があるに違いありません(tr.imのAPIではなく)、なぜなら

$ 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 Already Created [yacitus]." であることに注意してください。

基本的な HTTP 認証を正しく行っていないのでしょう (どちらの試みにおいても)。 私の問題を見つけることができますか。 おそらく私は、ワイヤ上で何が送信されるかを見るべきでしょうか。 私はそれを前にしたことがありません。 私が使うことができるPython APIがありますか(おそらくpdbに)? または、私が使用することができる他のツール(できればMac OS X用)がありますか?

どのように解決するのですか?

これは本当によく動作するようです(別のスレッドから取得)。

import urllib2, base64

request = urllib2.Request("http://api.foursquare.com/v1/user")
base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
request.add_header("Authorization", "Basic %s" % base64string)   
result = urllib2.urlopen(request)