2016-09-16 1 views
0

Я использую бот Twitter для забавных целей, используя Tweepy.Как читать Twitter Streaming API и отвечать пользователю на основе определенного ключевого слова?

Что я пытаюсь закодировать, это бот, который отслеживает определенное ключевое слово и базирующийся в нем бот отвечает пользователю, который в твиттере данной строки.

Я рассмотрел возможность хранения потока Twitter в файле .json и зацикливания объекта Tweet для каждого пользователя, но кажется непрактичным, поскольку получение потока блокирует программу в цикле.

Итак, как я могу отслеживать твиты с помощью Stream API Twitter, основанные на определенном ключевом слове, и отвечать пользователям, которые его в твиттере?

Текущий код:

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.

Update

Хорошо, вы можете делать то, что вы намерения делать со следующим:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^