Python 为什么请求在尝试访问Twitter的API时会引发此错误?

Python 为什么请求在尝试访问Twitter的API时会引发此错误?,python,twitter,openssl,python-requests,rauth,Python,Twitter,Openssl,Python Requests,Rauth,我试图使用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连接时,请求似乎正在中断。下面是一个示例,它似乎适用于,但不适用于: chrome/safar

我试图使用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连接时,请求似乎正在中断。下面是一个示例,它似乎适用于,但不适用于:


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

我用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与>请求1.0.0一起使用,您必须使用rauth 0.5.x;旧版本与Requests 1.0.0 API更改不兼容。

这不是请求问题,而是SSL问题。我似乎也没有遇到这个问题。您可能想看看如何调试它。基本上,您应该尝试使用openssl s_client-debug。我使用的几乎是刚格式化的osx 10.8安装,所以我不确定为什么openssl会出现问题。同样来自我上面的示例github https验证,但api.twitter不验证。签出openssl:它似乎无法获得本地颁发者证书。推特链没有被加载,而是在同一系统的chrome中工作,这有什么原因吗?感谢您发现链接您的openssl安装似乎缺少以下证书:/C=US/O=VeriSign,Inc./OU=Class 3公共主证书颁发机构-G2/OU=C 1998 VeriSign,Inc.-仅供授权使用/OU=VeriSign信任网络。这是相当令人惊讶的,虽然我的OpenSSL安装有它-但我运行的是Ubuntu。也许可以帮助你。小更新,我忘了告诉你将CApath s_客户端参数指向证书所在的目录。不过,不知道它在Mac OS上的什么位置。对于其他人来说,osx将所有证书都保存在密钥链文件下。有关详细信息,请参见此处:。经过一些挖掘和此命令certtool y k=/System/Library/Keychains/SystemRootCertificates.keychain | grep-i verisign之后,似乎我已经安装了第三代证书,twitter只返回了G2证书,即使他们被认为在G3:12周前已返回:。我想我应该和推特谈谈。
certtool y k=/System/Library/Keychains/SystemCACertificates.keychain | grep -i verisign
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)