1

rauth を使用して twitter で oauth を実行しようとしていますが、次のエラーで失敗しているようです:

requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

いくつかのテストの後、api.twitter.com にアクセスして https 接続を確認しようとすると、リクエストが壊れているように見えることがわかりました。以下に例を示します。 https://github.com では動作するように見えますが、https://api.twitter.comでは失敗します:

>>> import requests
>>> requests.get('https://github.com', verify=True)
<Response [200]>
>>> requests.get('https://api.twitter.com/oauth/request_token',verify=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "requests/api.py", line 65, in get
    return request('get', url, **kwargs)
  File "requests/safe_mode.py", line 39, in wrapped
    return function(method, url, **kwargs)
  File "requests/api.py", line 51, in request
    return session.request(method=method, url=url, **kwargs)
  File "requests/sessions.py", line 252, in request
    r.send(prefetch=prefetch)
  File "requests/models.py", line 632, in send
    raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
>>> requests.get('https://api.twitter.com',verify=True)
[SNIP] Same error as above

これはリクエストのバグですか?これは、rauth が実行しているものと似ているはずなので、私のマシンで動作しない理由がわかりません。

@thomas-orozco からのいくつかの優れた議論により、openssl が G2 VeriSign 証明書を検証できないようです: http://pastebin.com/ZZj3s5uN

certool を使用して VeriSign CA を取得しているようです。

certtool y k=/System/Library/Keychains/SystemCACertificates.keychain | grep -i verisign

コマンドラインのopensslではなく、chrome / safariで使用されています。リクエストが正しい証明書をロードするようにできることはありますか?

4

1 に答える 1

0

私は rauth 0.5.3 と Requests 1.1.0 で試してみました。参考までに、私は OS X 10.8.3 を新規インストールしています。期待通りに動作しているようです。使用したスクリプトの例は次のとおりです。

from rauth import OAuth1Service

# Get a real consumer key & secret from https://dev.twitter.com/apps/new
twitter = OAuth1Service(
    name='twitter',
    consumer_key='J8MoJG4bQ9gcmGh8H7XhMg',
    consumer_secret='7WAscbSy65GmiVOvMU5EBYn5z80fhQkcFWSLMJJu4',
    request_token_url='https://api.twitter.com/oauth/request_token',
    access_token_url='https://api.twitter.com/oauth/access_token',
    authorize_url='https://api.twitter.com/oauth/authorize',
    base_url='https://api.twitter.com/1/')

request_token, request_token_secret = twitter.get_request_token(verify=True)

authorize_url = twitter.get_authorize_url(request_token)

print 'Visit this URL in your browser: ' + authorize_url
pin = raw_input('Enter PIN from browser: ')

session = twitter.get_auth_session(request_token,
                                   request_token_secret,
                                   method='POST',
                                   data={'oauth_verifier': pin},
                                   verify=True)

params = {'include_rts': 1,  # Include retweets
          'count': 10}       # 10 tweets

r = session.get('statuses/home_timeline.json', params=params, verify=True)

for i, tweet in enumerate(r.json(), 1):
    handle = tweet['user']['screen_name'].encode('utf-8')
    text = tweet['text'].encode('utf-8')
    print '{0}. @{1} - {2}'.format(i, handle, text)

私のアドバイスは、可能であれば更新を試み、どのような結果が得られるかを確認することです。urllib3 の基本的な更新により、この状況が改善されるのではないかと思います。> Requests 1.0.0 で rauth を使用するには、rauth 0.5.x を使用する必要があることに注意してください。古いバージョンは Requests 1.0.0 API の変更と互換性がありません。

于 2013-03-29T00:51:09.763 に答える