9

Tweepyを使用してTwitterストリーミングAPIを使用するDjango管理コマンドがsupervisordを介して起動されています。

エージェントは非常にうまく機能しますが、ログに10〜15分ごとにSSLErrorがあり、supervisordがエージェントを再起動していることに気付きました。

tweepyパッケージは、最新のバージョン1.11です。サーバーはubuntu12.04LTSです。以下のリンクに記載されているように、cacertをキーチェーンにインストールしようとしましたが、うまくいきませんでした。

TwitterAPISSLルートCA証明書

助言がありますか?

[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()
4

3 に答える 3

7

証明書は問題ではないようです。エラーは単なるタイムアウトです。私には、tweepyのSSL処理に関する問題のようです。コードは接続を処理して再開するために装備されていますsocket.timeoutが、を介して到着するタイムアウトはありませんSSLError

sslただし、モジュールコード(またはドキュメント)を見ると、それをキャッチするための適切な方法がわかりません。SSLErrorオブジェクトは引数なしで発生し、文字列の説明だけが発生します。より良い解決策がないため、tweepy/streaming.pyの118行目の直前に次を追加することをお勧めします。

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)

そもそもなぜタイムアウトになるのかは良い質問です。私は、より高い値を設定するというTravisMehlingerの提案を繰り返すことに勝るものはありませんtimeout

于 2012-11-02T08:07:04.500 に答える
2

これが私がそれを持っている方法です(ここから修正されたソリューションhttps://groups.google.com/forum/?fromgroups=#!topic/tweepy/80Ayu1joGJ4):

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)
于 2012-11-03T20:41:54.997 に答える
2

Githubで提供される別の代替ソリューションがあります。

https://github.com/tweepy/tweepy/pull/132

于 2012-11-09T08:24:50.090 に答える