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