Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tweepy SSLError_Python_Ssl_Twitter_Tweepy - Fatal编程技术网

Python Tweepy SSLError

Python Tweepy SSLError,python,ssl,twitter,tweepy,Python,Ssl,Twitter,Tweepy,我有一个Django管理命令,通过supervisord启动,它使用tweepy来使用twitter流API 代理运行得很好,但我注意到日志中每10-15分钟就会出现一次错误,supervisord正在重新启动代理 tweepy软件包是最新的1.11版。服务器是ubuntu 12.04 LTS。我已经尝试将cacert安装到下面链接中提到的钥匙链中,但没有成功 有什么建议吗 [2012-08-26 19:28:15,656: ERROR] Error establishing the conn

我有一个Django管理命令,通过supervisord启动,它使用tweepy来使用twitter流API

代理运行得很好,但我注意到日志中每10-15分钟就会出现一次错误,supervisord正在重新启动代理

tweepy软件包是最新的1.11版。服务器是ubuntu 12.04 LTS。我已经尝试将cacert安装到下面链接中提到的钥匙链中,但没有成功

有什么建议吗

[2012-08-26 19:28:15,656: ERROR] Error establishing the connection
Traceback (most recent call last):.../.../datasinks.py", line 102, in start
    stream.filter(locations=self.locations)
  File "/site/pythonenv/local/lib/python2.7/site-packages/tweepy/streaming.py", line 228, in filter
    self._start(async)
  File "/site/pythonenv/local/lib/python2.7/site-packages/tweepy/streaming.py", line 172, in _start
    self._run()
  File "/site/pythonenv/local/lib/python2.7/site-packages/tweepy/streaming.py", line 117, in _run
    self._read_loop(resp)
  File "/site/pythonenv/local/lib/python2.7/site-packages/tweepy/streaming.py", line 150, in _read_loop
    c = resp.read(1)
  File "/usr/lib/python2.7/httplib.py", line 541, in read
    return self._read_chunked(amt)
  File "/usr/lib/python2.7/httplib.py", line 574, in _read_chunked
    line = self.fp.readline(_MAXLINE + 1)
  File "/usr/lib/python2.7/socket.py", line 476, in readline
    data = self._sock.recv(self._rbufsize)
  File "/usr/lib/python2.7/ssl.py", line 241, in recv
    return self.read(buflen)
  File "/usr/lib/python2.7/ssl.py", line 160, in read
  return self._sslobj.read(len)
SSLError: The read operation timed out
下面是代码的概要

from tweepy import API, OAuthHandler
from tweepy.streaming import StreamListener, Stream
# snip other imports

class TwitterSink(StreamListener, TweetSink):

  def __init__(self):
    self.auth = OAuthHandler(settings.TWITTER_OAUTH_CONSUMER_KEY, settings.TWITTER_OAUTH_CONSUMER_SECRET)
    self.auth.set_access_token(settings.TWITTER_OAUTH_ACCESS_TOKEN_KEY, settings.TWITTER_OAUTH_ACCESS_TOKEN_SECRET)
    self.locations = '' # Snip for brevity

  def start(self):
    try:
        stream = Stream(self.auth, self,timeout=60, secure=True)
        stream.filter(locations=self.locations)
    except SSLError as e:
        logger.exception("Error establishing the connection")
    except IncompleteRead as r:
        logger.exception("Error with HTTP connection")

  # snip on_data()
  # snip on_timeout()
  # snip on_error()

证书似乎不是问题。错误只是一个超时。对我来说,tweepy的SSL处理似乎有问题。配置用于处理
套接字。超时
并重新打开连接,但不是通过
SSLError
到达的超时

但是,看看
ssl
模块(or),我看不到一个很好的方法来捕捉它。引发的
SSLError
对象没有任何参数,只有字符串描述。由于缺乏更好的解决方案,我建议在前面添加以下内容:

首先,为什么它会超时是个好问题。我没有什么比重复Travis Mehlinger关于设置更高的
超时时间的建议更好的了。下面是我的建议(修改后的解决方案):


Github上还提供了另一种替代解决方案:


如果将
超时设置为更大的值,会发生什么情况?我怀疑你的<代码>流<代码>是超时的,因为它偶尔会超过60秒而没有接收到更新。如果你还没有的话,你应该考虑打开一个问题。良好的思维和良好的工作浏览代码。我也会发布我的代码。为什么
nsecs=random.randint(60,63)
?@pomber dunno,它在原始线程中,我把它放在那里只是因为它不痛。尽管问问作者可能会有用。很好的解决方案。不过,捕捉异常可能捕捉得太多
ImportError
KeyError
NameError
MemoryError
SyntaxError
以及其他许多代码也继承自
异常
。谢谢@kichik。这很有道理。我知道,但我在那里感觉很懒,我真的没有其他例外。而且,文档建议至少在那里放一个异常,以避免只捕获除:。
except SSLError, e:
  if 'timeout' not in exception.message.lower(): # support all timeouts
    exception = e
    break
  if self.listener.on_timeout() == False:
    break
  if self.running is False:
    break
  conn.close()
  sleep(self.snooze_time)
l = MyListener()
auth = OAuthHandler(settings.CONSUMER_KEY, settings.CONSUMER_SECRET)
auth.set_access_token(settings.ACCESS_TOKEN, settings.ACCESS_TOKEN_SECRET)
# connect to stream
stream = Stream(auth, l, timeout=30.0)
while True:
    # Call tweepy's userstream method with async=False to prevent
    # creation of another thread.
    try:
        stream.filter(follow=reporters, async=False)
         # Normal exit: end the thread
         break
    except Exception, e:
         # Abnormal exit: Reconnect
         logger.error(e)
         nsecs = random.randint(60, 63)
         logger.error('{0}: reconnect in {1} seconds.'.format(
             datetime.datetime.utcnow(), nsecs))
         time.sleep(nsecs)