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

时间:2016-09-16 16:37:17

标签: python api twitter stream tweepy

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

我想要编写的代码是一个跟踪某个关键字的机器人,并且在其中,机器人会回复使用给定字符串发送推文的用户。

我考虑将Twitter的Stream存储在.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 个答案:

答案 0 :(得分: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