我一直在用Twython听Twitter公共流,没有任何问题,但生产服务器已经停止接收任何tweet几天了。
我已经创建了一个简单的测试用例:>>> from twython import TwythonStreamer
>>>
>>> class TestStreamer(TwythonStreamer):
... def on_success(self, data):
... print data
...
>>> stream = TestStreamer(KEY, SECRET, TOKEN, TOKEN_SECRET)
>>>
>>> stream.statuses.filter(track='clinton,trump')
这个代码片段在开发服务器上运行。tweet立即开始涌入。在生产中,它似乎再次在倾听,没有抛出错误,但没有tweet。
我想可能是服务器上的防火墙,或者服务器可能在Twitter上被列入黑名单。但是,当我使用Twitter签名生成器开发工具生成的curl命令使用相同的令牌集尝试相同的查询时,该命令立即开始在开发和生产服务器上接收tweet ,没有任何问题。我认为这个curl测试消除了这些防火墙,黑名单或令牌问题选项。
你认为问题可能是什么?非常感谢任何帮助。谢谢。
为了更深入地了解问题和您的解决方案,我希望人们注意到Twitter身份验证机制使用OAuth,它要求查询的DateTime作为任何请求头(oauth_timestamp
)的一部分提供。
当Twitter收到查询时,他们将验证oauth_timestamp
不是太老或无效。当他们完成后,他们将验证oauth_signature
。
大多数库将使用当前机器的DateTime并使用它来创建请求。因此,当使用第三方工具访问Twitter API时,请确保机器的DateTime设置正确。
一些更高级的库将允许您指定一个函数,该函数将被调用以访问DateTime。如果您的软件分发到无法确保DateTime有效性的机器上,这一点特别有用。
原来是AWS EC2服务器上的服务器时钟漂移导致认证失败,因为使用了过期的时间戳。它也Twython抑制异常,这使得情况更加模糊。
我尝试使用Twitter客户端Birdy并获得"未经授权"的响应。然后我看到了这篇文章。
所以我做了一个时钟同步,一切又恢复正常了:
sudo ntpdate -s time.nist.gov