2012-09-09 27 views
1

我試圖用rauth做的OAuth與Twitter,但它似乎並出現以下錯誤地失敗:爲什麼請求在嘗試訪問Twitter的API時引發此SSLError?

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運行的類似,所以我不確定它爲什麼不能在我的機器上運行。

與@托馬​​斯 - 奧羅斯科一些偉大的disccusion這似乎是一個OpenSSL的是無法驗證的G2 VeriSign證書:http://pastebin.com/ZZj3s5uN

但看來我用certool有威瑞信CA:

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

chrome/safari正在使用哪一個,而不是通過命令行上的openssl。有什麼我可以做的,以便請求將加載正確的證書?

+0

這不是一個「請求」問題,而是一個SSL問題。我似乎也沒有遇到這個問題。您可能想了解一下http://marc.info/?l=openssl-users&m=124875408916917關於如何調試的一些想法。基本上,你應該嘗試使用'openssl s_client -debug'。 –

+0

我正在使用一個幾乎格式化的OSX 10.8安裝,所以我不知道爲什麼openssl是問題。也從我上面的例子github https驗證,但api.twitter不。檢查出openssl:http://pastebin.com/ZZj3s5uN它似乎無法獲得本地簽發者證書。是否有一個原因,沒有加載twitter鏈,但在同一個系統上的鉻工作? _感謝您找到link_ – Alex

+0

您的'openssl'安裝似乎缺少以下證書:'/ C = US/O = VeriSign,Inc./OU=Class 3公共主認證機構 - G2/OU =(c)1998 VeriSign,Inc. - 僅限授權使用/ OU =威瑞信託網絡。這很令人驚訝,但我的OpenSSL安裝了它 - 但是我正在運行Ubuntu。也許http://gagravarr.org/writing/openssl-certs/others.shtml#ca-osx可以幫助你。 –

回答

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;舊版本與請求1.0.0 API更改不兼容。

相關問題