2016-09-16 54 views
0

我正在使用Tweepy來實現一個Twitter機器人的趣味目的。如何閱讀Twitter的Streaming API並根據某個關鍵字回覆用戶?

我想要編碼的是一個跟蹤特定關鍵字並基於它的機器人回覆用給定字符串發送推文的用戶。

我曾考慮將Twitter的流存儲在.json文件中,併爲每個用戶循環播放Tweet對象,但接收流鎖定循環中的程序似乎不切實際。

那麼,我怎麼能跟蹤基於某個關鍵字的Twitter Stream 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 
相關問題