如何阅读Twitter的流媒体API并根据某个关键字回复用户?



我正在使用Tweepy实现一个有趣的Twitter机器人。

我想要编码的是一个机器人,跟踪某个关键字,并基于它的机器人回复与给定字符串推特的用户。

我考虑将Twitter的流存储在.json文件中,并为每个用户循环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

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

最新更新