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がソケットを許可していないことが原因で、クエリ用語を適用して特定のフィルタリングされたストリーミングツイートを取得する方法がわかりません。コードのこの部分の目的は、キーワードを指定してライブ ストリームを取得することです。代替方法があれば、ご指導ください。

4

2 に答える 2

3

App Engine では、httplib 接続 (および urllib) は Google URL フェッチ サービスを使用します。URL フェッチ サービスとは、プロセス自体がソケットを開くのではなく、他のサーバー (アプリ エンジン サービス インスタンスではない) がリクエストを実行し、アプリ エンジン インスタンスにレスポンスを返すことを意味します。

お気づきかと思いますが、GAE で実行されている httplib バリアントには、タイムアウトの設定に使用される sock 属性がありません。ただし、根本的な問題は、ストリームを取得する方法がないことです。応答が完了するまで、アプリ エンジンに結果を返すことはできません。どのように失敗するかはテストしていませんが、Twitter はストリーミング応答を閉じないため、URL サービスから DeadlineExceededError が返されると思います。

現時点では、GAE でストリームを取得するための代替方法はありません。バックエンドでのアウトバウンド ソケット サポートで動作する場合があります。現在、ソケットのサポートはテスターのみが利用できます。

于 2013-01-27T00:37:23.943 に答える
1

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))
于 2013-01-25T21:51:20.507 に答える