【问题标题】:Twitter Streaming on GAEGAE 上的 Twitter 流媒体
【发布时间】:2013-01-07 21:15:35
【问题描述】:

为什么会出现这个错误?这就是我调用流 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 不允许使用套接字,我不确定如何应用查询术语来获取特定的过滤流推文。我使用这部分代码的目的是获得带有指定关键字的实时流。如果有任何替代方法,请指导。

【问题讨论】:

  • 有人说谷歌不允许我们在GAE中使用socket,有没有其他的例子,请指导。谢谢

标签: python google-app-engine twitter python-2.7 stream


【解决方案1】:

在 App Engine 上,httplib 连接(和 urllib)将使用 Google URL 获取服务。 URL Fetch service 表示其他服务器(不是应用引擎服务实例)执行请求并将响应返回给应用引擎实例,而不是进程本身打开套接字。

我相信您会注意到在 GAE 上运行的 httplib 变体不提供用于设置超时的 sock 属性。但根本问题是无法获取流,在响应完成之前,您不会将任何结果返回到应用引擎。我还没有测试它是如何失败的,但我希望你会从 URL 服务收到 DeadlineExceededError,因为 Twitter 不会关闭流式响应。

目前没有其他方法可以在 GAE 上获取流。它可能适用于后端的出站套接字支持。 Socket 支持目前仅对测试人员可用。

【讨论】:

  • 感谢您的回复。我可以知道我如何成为他们的测试员或获得测试员帐户吗?因为流是需求的一部分,这是强制性的..真的没有替代方法来实现它吗?
  • Here 是出站套接字的注册表单。正如@tesdal 所说,目前没有办法在 GAE 上建立长期联系。我见过使用简单 UrlFetch 的应用程序,任务队列的截止日期很长,我想。但即使你让它发挥作用,它也违反了 Twitter 的 Stream API 政策。
  • 如果您能够通过单个实例处理流,您可以考虑在 EC2 或类似设备上运行该实例,并与 GAE 通信。取决于您要将数据用于什么目的。
【解决方案2】:

我相信 GAE 不支持 httplib.HTTPSConnection。相反,通过将secure = False 参数添加到Stream 构造函数来尝试不安全的连接:

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”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
相关资源
最近更新 更多