在GAE上使用Twitter流API

5
我为什么会遇到这个错误?以下是我如何调用流式 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,我不确定如何应用查询术语来获取特定的过滤流推文。我编写这部分代码的目的是获取带有指定关键字的实时流。如果有任何替代方法,请指导。


有人说Google不允许我们在GAE中使用socket,是否有任何替代方法并提供示例,请指导。谢谢。 - 1myb
2个回答

3
在App Engine上,httplib连接(和urllib)将使用Google URL抓取服务。URL Fetch service意味着其他服务器(而不是应用程序引擎服务实例)执行请求并将响应返回给应用程序引擎实例,而不是进程本身打开套接字。
我相信您已经注意到在GAE上运行的httplib变体不提供用于设置超时的sock属性。然而,根本问题在于没有办法获得流,直到响应完成,您将无法将任何结果返回到应用程序引擎中。我尚未测试它如何失败,但我预计您将从URL服务收到DeadlineExceededError,因为Twitter不会关闭流式响应。
目前在GAE上没有获取流的替代方法。它可能适用于后端的出站套接字支持。套接字支持目前仅向测试人员提供。

谢谢您的回复。我想知道如何成为他们的测试人员或获得测试人员账户?因为流是要求的一部分,是必须的...难道真的没有其他替代方法吗? - 1myb
2
这是外向套接字的注册表格。正如@tesdal所说,目前在GAE上没有长期连接的方法。我看到一些应用程序使用来自任务队列的简单UrlFetch和高期限。但即使您让它工作,也违反了Twitter的Stream API政策。 - Igor Kharin
如果您可以通过单个实例处理流,则可以考虑在EC2或类似平台上运行该实例,并与GAE通信。这取决于您将使用数据的方式。 - tesdal

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))

不好意思,还是一样的问题,HTTP返回错误。 AttributeError: HTTPConnection实例没有'sock'属性。 - 1myb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接