6

私は、oauth で認証されたリクエストを送信する方法を考え出すことで、壁に頭をぶつけてきました。

アクセス トークンを取得できましたが、アクセス トークンを使用してリクエストを送信する方法が完全にはわかりませんでした。Twitterの開発者情報でこれを見つけました:

https://dev.twitter.com/docs/auth/oauth/single-user-with-examples#python には、承認されたリクエストを送信するためのコード例がいくつかあります。

def oauth_req(url, key, secret, http_method="GET", post_body=None,http_headers=None):
    consumer = oauth.Consumer(key=consumerKey, secret=consumerSecret)
    token = oauth.Token(key=tokenKey, secret=tokenSecret)
    client = oauth.Client(consumer, token)
    resp, content = client.request(
        url,
        method=http_method,
        body=post_body,
        headers=http_headers,
        #force_auth_header=True                                                                                                                                                 
        )
    return resp,content

oauth_req('http://openapi.etsy.com/v2/shops/:user/transactions',tokenKey,tokenSecret)

ただし、すべての情報を含めたところ、次のエラーが表示されました。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/tmp/python-22060Umg.py", line 153, in <module>
    transactions = oauth_req('http://openapi.etsy.com/v2/shops/:user/transactions',tokenKey,tokenSecret)
  File "/tmp/python-22060Umg.py", line 76, in oauth_req
    force_auth_header=True
TypeError: request() got an unexpected keyword argument 'force_auth_header'

ここで、:user は実際のユーザー (投稿から削除しました) であり、tokenKey/tokenSecret はアクセス トークンです。

おそらく、問題のある行をコメントアウトするのと同じくらい簡単だと思いましたが、そのような運はありませんでした:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/tmp/python-22060hwm.py", line 153, in <module>
    transactions = oauth_req('http://openapi.etsy.com/v2/shops/:user/transactions',tokenKey,tokenSecret)
  File "/tmp/python-22060hwm.py", line 75, in oauth_req
    headers=http_headers
  File "/usr/lib/python2.7/dist-packages/oauth2/__init__.py", line 662, in request
    req.sign_request(self.method, self.consumer, self.token)
  File "/usr/lib/python2.7/dist-packages/oauth2/__init__.py", line 493, in sign_request
    self['oauth_body_hash'] = base64.b64encode(sha(self.body).digest())
TypeError: must be string or buffer, not None

だから今、スタックオーバーフロー、あなたは私の唯一の希望です! 私のアクセストークンを使用してリクエストを送信する方法について、誰か提案がありますか?

ありがとう!

4

2 に答える 2

10

Twitterのドキュメントはoauth2古くなっています。リンク先のバージョンは3年前のフォークです。のキーワード引数はforce_auth_headerもうありませんoauth2.Client.request

問題のある行を削除してもエラーが発生する理由は、のデフォルト値post_bodyNoneに直接渡されるためoauth2.Client.requestです。実際にはそれを行うことはできません。このエラーを防ぐには、その引数を要求するか、機能するデフォルト値(たとえば、空の文字列)を選択するか、パススルーする前にチェックする必要があります。

于 2012-09-28T14:42:26.573 に答える
4

Rafeのコメントを拡張するだけです...

Python の oAuth ライブラリの大部分は、信じられないほど壊れており、時代遅れであり、もはや維持されていません。それらのほとんどは、フォーマット仕様は言うまでもなく、独自のテストにも合格しません。Twitterはそのようなものを参照すべきではありませんが、参照しています.

Twythonは、oAuth をラップする Python twitter クライアントです - https://github.com/ryanmcgrath/twythonrequests -およびrequests-oauthパッケージを介して oAuth1 仕様をラップします - http://docs.python-requests.org/en/latest/http: //pypi.python.org/pypi/requests-oauth - ただし、Twitter の API はそれを受け入れます。

oAuth 2に関しては、このライブラリにはそれを実装しようとする最近の作業があります(最後のコミットは2か月前)- https://github.com/idan/oauthlib 。私は自分で試したことはなく、昨日知ったばかりです。

すぐに追加するには - etsy を使用している場合でも、oauth1 をサポートしている場合は、twython をリバース エンジニアリングして etsy エンドポイントを使用できるはずです。

于 2012-09-28T14:59:41.320 に答える