Почему запросы вызывают этот SSLError при попытке доступа к API Twitter?
Я пытаюсь использовать rauth для выполнения 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
Похоже, что у меня VeriSign CA с помощью certool:
certtool y k=/System/Library/Keychains/SystemCACertificates.keychain | grep -i verisign
Который используется chrome / safari, но не openssl в командной строке. Могу ли я что-нибудь сделать, чтобы Requests загрузил нужный сертификат?
1 ответ
Я дал этому выстрел с Рут 0.5.3 и Запросы 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; старая версия не совместима с изменениями API запросов Re.0ts 1.0.0.