Python 如何调用Twitter';使用urllib2/httplib的s流媒体/筛选器提要?

Python 如何调用Twitter';使用urllib2/httplib的s流媒体/筛选器提要?,python,google-app-engine,twitter-feed,Python,Google App Engine,Twitter Feed,更新: 当我尝试cogent Nick的答案中提出的解决方案时,我将其从Answeed切换回Google的urlfetch: logging.debug("starting urlfetch for http://%s%s" % (self.host, self.url)) result = urlfetch.fetch("http://%s%s" % (self.host, self.url), payload=self.body, method="POST", headers=self.he

更新:

当我尝试cogent Nick的答案中提出的解决方案时,我将其从Answeed切换回Google的urlfetch:

logging.debug("starting urlfetch for http://%s%s" % (self.host, self.url))
result = urlfetch.fetch("http://%s%s" % (self.host, self.url), payload=self.body, method="POST", headers=self.headers, allow_truncated=True, deadline=5)
logging.debug("finished urlfetch")
但不幸的是,
finished urlfetch
从未打印过-我在日志中看到超时发生(5秒后返回200),但执行似乎没有返回


大家好-

我正试图通过谷歌应用引擎(GoogleAppEngine)来玩弄Twitter(我知道这可能不是一个很好的长期游戏,因为你不能通过GAE永久打开连接),但到目前为止,我还没有任何运气让我的程序真正解析推特返回的结果

一些代码:

logging.debug("firing up urllib2")
req = urllib2.Request(url="http://%s%s" % (self.host, self.url), data=self.body, headers=self.headers)
logging.debug("called urlopen for %s %s, about to call urlopen" % (self.host, self.url))
fobj = urllib2.urlopen(req)
logging.debug("called urlopen")
不幸的是,当执行此命令时,我的调试输出从未显示名为urlopen的
行。我怀疑是Twitter保持连接打开,而urllib2没有返回,因为服务器没有终止连接

Wireshark显示正确发送的请求和返回结果的响应

我尝试将
Connection:close
添加到我的请求头,但没有得到成功的结果


关于如何实现这一点有什么想法吗?

appengine上的urllib是一个简单的包装器。关于所发生的事情,您是对的:Twitter的流式API从未终止其响应,因此它会超时,而urlfetch会抛出一个异常


如果直接使用urlfetch,则可以设置超时(最多10秒),并将allow_truncated设置为True,以便获得部分结果。不过,Twitter流式API与App Engine并不匹配,因为App Engine请求的执行时间限制在30秒以内,而urlfetch请求无法逐步发回结果,或者需要10秒以上的时间。使用Twitter的“标准”API将是一个更好的选择。

谢谢-这是一个很好的解释。Re:'standard'API,我想你的意思是类似的-但是流的过滤功能没有很好的模拟,是吗?这取决于你想如何过滤。标准的“搜索”API完成了大部分工作。另一种选择是在其他地方部署一个使用流式API的服务,并打包批次,通过HTTP发送到您的应用程序。如果你感兴趣的话,我已经写了一个小工具来做这个。如果你愿意分享的话,我肯定会对这个工具感兴趣!它在这里,例如它是:。它不是很完善,但基本的工作流程很清楚:它使用生产者/消费者模式从Twitter获取条目并将其添加到队列中。断开的连接将自动重试。使用者从队列中获取批并将其上载到任何HTTP端点,每n个结果或m秒(以先到者为准)生成一个批。@NickJohnson Link已失效。我正在查看您的tweetengine项目,以了解如何在GAE上构建Twitter应用程序,但我对如何实现这一点并没有很好的把握,这是一种拓展流外API工作的好方法。如果你仍然有上面提到的例子,我很想看看。如果你想继续你的日志记录语句,你可能需要捕获deadlineexceederror超时将抛出。