sixohsix的Twitter API for Python中的未知错误

时间:2013-01-22 08:06:51

标签: python python-2.7 twitter httplib

我有一个小脚本,使用sixohsix' s重复(每小时)从API获取推文 Twitter Wrapper for Python。我成功处理了大多数(如果不是全部)来自Twitter API的错误,即所有5xx和4xx的内容。

尽管如此,我随机观察了以下错误追溯(仅在2-3天内一次)。我的意思是程序退出并且回溯显示在shell中。我不知道这可能意味着什么,但认为它与我的脚本没有直接关系,因为它证明了自己在大多数情况下正确运行。

这是我在脚本中调用包装器函数的地方:

KW = {
        'count': 200, # number of tweets to fetch (fetch maximum)
        'user_id' : tweeter['user_id'],
        'include_rts': 'false', # do not include native RT's 
        'trim_user' : 'true', 
     }
     timeline = tw.twitter_request(tw_endpoint,\
         tw_endpoint.statuses.user_timeline, KW)

函数tw.twitter_request(tw_endpoint, tw_endpoint.statuses.user_timeline, KW)基本上是return tw_endpoint.statuses_user_timeline(**args),其中args转换为KW,而tw_endpoint是使用sixohsix&#39}获得的OAuthorized端点。图书馆的

return twitter.Twitter(domain='api.twitter.com', api_version='1.1',
                    auth=twitter.oauth.OAuth(access_token, access_token_secret,
                    consumer_key, consumer_secret))

这是追溯:

Traceback (most recent call last):
  File "search_twitter_entities.py", line 166, in <module>
    tw_endpoint.statuses.user_timeline, KW)
  File "/home/tg/mild/twitter_utils.py", line 171, in twitter_request
    return twitter_function(**args)
  File "build/bdist.linux-x86_64/egg/twitter/api.py", line 173, in __call__
  File "build/bdist.linux-x86_64/egg/twitter/api.py", line 177, in _handle_response
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 400, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 418, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open
    return self.do_open(httplib.HTTPSConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1180, in do_open
    r = h.getresponse(buffering=True)
  File "/usr/lib/python2.7/httplib.py", line 1030, in getresponse
    response.begin()
  File "/usr/lib/python2.7/httplib.py", line 407, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python2.7/httplib.py", line 371, in _read_status
    raise BadStatusLine(line)
httplib.BadStatusLine: ''

我唯一可以从该回溯中获得的是错误发生在另一个Python库的深处,并且与来自Twitter API或包装器的无效HTTP统计有关...但正如我所说,也许你们中的一些人可以给我一个关于如何调试/解决这个问题的提示,因为经常检查我的脚本并重新启动它以继续获取推文非常烦人。

编辑:为了澄清这一点,回溯中的前两个函数已经在try-except块中。例如,文件中的try-except-Block&#34; twitter_utils.py&#34;过滤掉40x和50x异常,但也只查找except:的一般异常。所以我不明白为什么错误不会被抓到这个位置,相反,程序是强制关闭并打印回溯?简而言之,我处于无法捕获错误的情况,就像PHP脚本中的解析错误一样。那我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

也许这会指出你正确的方向。这是调用BadStatusLine时调用的内容:

class BadStatusLine(HTTPException):
    def __init__(self, line):
        if not line:
            line = repr(line)
        self.args = line,
        self.line = line

我对httplib并不太熟悉,但是如果我不得不猜测,那么你会得到一个空的响应/错误行,而且它无法被解析。在程序停止的行之前有评论:

    # Presumably, the server closed the connection before
    # sending a valid response.
    raise BadStatusLine(line)

如果twitter在发送回复之前关闭了连接,您可以再试一次,这意味着在“search_twitter_entities.py”,第166行尝试一下/几次(丑陋)。

try:
     timeline = tw.twitter_request(tw_endpoint,\
              tw_endpoint.statuses.user_timeline, KW)
except:
     try:
          timeline = tw.twitter_request(tw_endpoint,\
                   tw_endpoint.statuses.user_timeline, KW) # try again
     except:
          pass 

或者,假设您每次都可以将时间轴重新分配为无,请执行while循环:

timeline = None
while timeline == None:
     try:
          timeline = tw.twitter_request(tw_endpoint,\
              tw_endpoint.statuses.user_timeline, KW)
     except:
          pass

我没有对此进行测试。检查代码是否错误。