GAE上的Twitter流媒体

5 投票
2 回答
791 浏览
提问于 2025-04-17 13:30

我为什么会遇到这个错误呢?这是我调用流媒体API的方式。

import tweepy
import sys

creds = json.loads(open('credential.json').read())
tw_consumer_key = creds['tw_consumer_key']
tw_consumer_secret = creds['tw_consumer_secret']
tw_access_token = creds['tw_access_token']
tw_access_token_secret = creds['tw_access_token_secret']

try:
    auth = tweepy.OAuthHandler(tw_consumer_key, tw_consumer_secret)
    auth.set_access_token(tw_access_token, tw_access_token_secret)
    api = tweepy.API(auth)
except Exception:
    service = None
    api = None    

# Query terms
Q = "Better"

class CustomStreamListener(tweepy.StreamListener):
    def on_status(self, status):
        try:
            print "%s\n%s\n%s\n%s\n\n" % (status.text, 
                                      status.author.screen_name, 
                                      status.created_at, 
                                      status.source,)
        except Exception, e:
            print >> sys.stderr, 'Encountered Exception:', e
            pass

    def on_error(self, status_code):
        print >> sys.stderr, 'Encountered error with status code:', status_code
        return True # Don't kill the stream

    def on_timeout(self):
        print >> sys.stderr, 'Timeout...'
        return True # Don't kill the stream



class LiveStream(webapp2.RequestHandler):
    def get(self):
        streaming_api = tweepy.streaming.Stream(auth, CustomStreamListener(), timeout=60)
        self.response.out.write(streaming_api.filter(track=Q))

可能是因为GAE(谷歌应用引擎)不允许使用socket,我不太确定怎么应用查询条件来获取特定过滤的推特流。我写这部分代码的目的是想获取带有特定关键词的实时推特流。如果有其他的方法,请指教。

2 个回答

1

我认为 GAE(谷歌应用引擎)不支持 httplib.HTTPSConnection。相反,你可以尝试使用不安全的连接,方法是在 Stream 的构造函数中添加 secure = False 这个参数:

class LiveStream(webapp2.RequestHandler):
    def get(self):
        streaming_api = tweepy.streaming.Stream(auth, CustomStreamListener(), timeout=60, secure=False)
        self.response.out.write(streaming_api.filter(track=Q))
3

在App Engine上,httplib连接(还有urllib)会使用谷歌的URL获取服务。URL获取服务的意思是,其他服务器(而不是App Engine的服务实例)会执行请求,然后把结果返回给App Engine实例,而不是直接在程序里打开一个连接。

我想你注意到了,在GAE上运行的httplib版本没有提供用来设置超时的sock属性。根本的问题是,你无法获取到数据流,直到响应完成之前,你不会收到任何结果。我没有测试过具体会怎么失败,但我猜测你会从URL服务那里收到一个DeadlineExceededError,因为Twitter不会关闭这个数据流的响应。

目前在GAE上没有其他方法可以获取数据流。也许在后端支持外部连接的情况下可以实现,但现在这个功能只对测试人员开放。

撰写回答