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 的一些很好的讨论,它似乎是一个无法验证 G2 VeriSign 证书的 openssl:http: //pastebin.com/ZZj3s5uN

看来我使用 certool 获得了 VeriSign CA:

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

chrome / safari 正在使用它,而不是命令行上的 openssl 。我可以做些什么来让 Requests 加载正确的证书吗?

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 的底层更新有助于解决这种情况。请注意,为了将 rauth 与 > Requests 1.0.0 一起使用,您必须使用 rauth 0.5.x;旧版本与 Requests 1.0.0 API 更改不兼容。

于 2013-03-29T00:51:09.763 回答