2013-01-24 5 views
5

なぜこのエラーが発生しますか?ここで私はストリーミングAPIをどのように呼びます。おそらく、GAEによって引き起こさTwitterでストリーミングする

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

ソケットを許可されていない、私は特定のフィルタストリーミングツイートを取得するには、クエリ用語を適用するかどうかはわかりません。このコード部分の私の目的は、指定されたキーワードでライブストリームを取得することです。代替方法がある場合は、ご案内ください。

+0

一部の人は、GoogleがGAEでソケットを使用することを許可していないと述べていますが、他にも例がありますので参考にしてください。ありがとう – 1myb

答えて

3

、httplib接続(とurllibは)GoogleのURLは、サービスをフェッチ使用します。その代わり、Streamコンストラクタにsecure = Falseパラメータを追加することにより、安全でない接続を試してみてください。 URL Fetch serviceは、ソケットを開くプロセス自体ではなく、他のサーバー(インスタンスを処理するアプリケーションエンジンではない)がリクエストを実行し、アプリケーションエンジンインスタンスに応答を返すことを意味します。

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

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

+0

返信ありがとうございます。どのように私は彼らのテスターに​​なることができるか、テスターのアカウントを取得することができますか?ストリームは要件の一部であるため、必須です。これを達成するための代替方法はありませんか? – 1myb

+2

[こちら](https://docs.google.com/spreadsheet/viewform?formkey=dF9QR3pnQ2pNa0dqalViSTZoenVkcHc6MQ#gid=0)はアウトバウンドソケットのサインアップフォームです。 @tesdalによれば、現在、GAEに長時間の接続を持たせる方法はありません。私はタスクキューから高い期限で簡単なUrlFetch'esを使ってアプリを見てきました。しかし、それを機能させるとしても、TwitterのStream APIポリシーに反する。 –

+0

ストリームを単一のインスタンスで処理できる場合は、そのインスタンスをEC2などで実行し、GAEと通信することを検討できます。あなたがデータを使用することに依存します。 – tesdal

1

GAEはhttplib.HTTPSConnectionをサポートしていないと私は信じています。 App Engineの上

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

幸運の男。 HTTPの場合と同じ戻り値 AttributeError:HTTPConnectionインスタンスに属性 'sock'がありません – 1myb

関連する問題