2016-09-16 3 views
0

私は楽しい目的のためにTweepyを使ってTwitterボットを実装しています。TwitterのストリーミングAPIを読んで、特定のキーワードに基づいてユーザーに返信するにはどうすればいいですか?

私がコードしようとしているのは、特定のキーワードを追跡し、それに基づいてボットが与えられた文字列でツイートしたユーザーに返信するものです。

私は、.jsonファイルにTwitterのストリームを格納し、すべてのユーザーにTweetオブジェクトをループすることを検討しましたが、ストリームを受信するとループ上のプログラムをロックするので実用的ではありません。

TwitterのストリームAPIで特定のキーワードに基づいてつぶやきを追跡し、それをツイートしたユーザーに返信するにはどうすればよいですか?

現在のコード:

from tweepy import OAuthHandler 
    from tweepy import Stream 
    from tweepy.streaming import StreamListener 

class MyListener(StreamListener): 
    def on_data(self, data): 
     try: 
      with open("caguei.json", 'a+') as f: 
       f.write(data) 
       data = f.readline() 
        tweet = json.loads(data) 
        text = str("@%s acabou de. %s " % (tweet['user']['screen_name'], random.choice(exp))) 
        tweepy.API.update_status(status=text, in_reply_to_status_id=tweet['user']['id']) 
       #time.sleep(300) 
       return True 
     except BaseException as e: 
      print("Error on_data: %s" % str(e)) 
     return True 
    def on_error(self, status): 
     print(status) 
     return True 

    api = tweepy.API(auth) 
    twitter_stream = Stream(auth, MyListener()) 

    twitter_stream.filter(track=['dengue']) #Executing it the program locks on a loop 
+1

あなたは単にあなたの* on_data *関数内のことを行うことはできません* MyListener? – SpiXel

+0

@SpiXel APIを正しく使用する方法がわかりません。私はAPIの経験があまりありません – ovrwngtvity

+0

@SpiXelああ、私は理解することができたと思う。 on_dataメソッドは、Twitterのストリームを受信しながら実行されます。私はそれがちょうどランダムな名前だと思った。私は私が意図していることを達成できると思う。 – ovrwngtvity

答えて

1

Tweepy StreamListenerクラスは、あなたはそれがon_data方法だ上書きすることができます。それがあなたのロジックを行うべき場所です。

コード

class StreamListener(object): 

    ... 

    def on_data(self, raw_data): 
     """Called when raw data is received from connection. 

     Override this method if you wish to manually handle 
     the stream data. Return False to stop stream and close connection. 
     """ 
     ... 

あたりのようにあなたのリスナーには、このメソッドをオーバーライドして、カスタム・ロジックを行うことができます。

class MyListener(StreamListener): 

    def on_data(self, data): 

     do_whatever_with_data(data) 

また、他のいくつかの方法(on_direct_messageなど)をオーバーライドすることができ、私はたStreamListenerのコードを見てみることをお勧めします。

更新

さて、あなたは意図次に何をすべきかを行うことができます:*

class MyListener(StreamListener): 

    def __init__(self, *args, **kwargs): 
     super(MyListener, self).__init__(*args, **kwargs) 
     self.file = open("whatever.json", "a+") 

    def _persist_to_file(self, data): 
     try: 
      self.file.write(data) 
     except BaseException: 
      pass 

    def on_data(self, data): 
     try: 
      tweet = json.loads(data) 
      text = str("@%s acabou de. %s " % (tweet['user']['screen_name'], random.choice(exp))) 
      tweepy.API.update_status(status=text, in_reply_to_status_id=tweet['user']['id']) 
      self._persist_to_file(data) 
      return True 
     except BaseException as e: 
      print("Error on_data: %s" % str(e)) 
     return True 

    def on_error(self, status): 
     print(status) 
     return True 
関連する問題