我正在使用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