使用 tweepy 流式传输用户的时间线和过滤的推文
Posted
技术标签:
【中文标题】使用 tweepy 流式传输用户的时间线和过滤的推文【英文标题】:Using tweepy to stream users' timeline and filtered tweets 【发布时间】:2014-05-05 17:09:29 【问题描述】:几天前我开始探索 tweepy,并且能够实时流式传输过滤(带有关键字)的推文。现在,我不仅要流式传输过滤后的推文,还要流式传输来自几个特定 Twitter 用户的推文。这可以通过使用 tweepy 实现吗?似乎 stream.userstream() 只从我的推特帐户中获取实时推文,而不是从其他特定用户那里获取,对吧?我已经尝试使用我为测试而创建的另一个推特帐户,但它根本没有获取我发布的任何新推文。
但如果可行,我可以同时使用 stream.userstream() 和 stream.filter() 下载推文吗?如果没有,我怎样才能同时获得过滤后的推文和用户的实时推文?
顺便说一句,我使用了来自@alexhanna 的示例代码。
api = tweepy.API(auth)
def main( mode = 1 ):
follow = []
track = ['Houston Rockets','Lakers','Chicago Bulls']
listen = SListener(api, 'test')
stream = tweepy.Stream(auth, listen)
try:
stream.userstream('NBA','ESPN')
stream.filter(track = track, follow = follow)
except:
print "error!"
stream.disconnect()
非常感谢您的帮助!谢谢。
【问题讨论】:
【参考方案1】:尝试使用 .filter(follow="")
而不事先使用 .userstream()
。 Userstream
只是来自与您的应用程序关联的帐户的推文。 Here 是一个(注释很好的)示例。
如果您想同时获取用户的推文和过滤后的推文,您需要创建两个单独的Stream()
对象。
编辑:我链接到的page 现在已经死了。 Internet Archive 链接应无限期保持活动状态,但解决用户问题的所有相关信息都已包含在此答案中。我没有从链接页面复制和粘贴示例,因为我不是它的作者,因为它只是说明正确使用 Stream
侦听器的示例。
【讨论】:
谢谢路易斯! filter(follow) 确实适用于来自特定用户的流式实时推文。而且我已经测试过,我似乎能够只用一个 Stream() 对象同时获取用户的推文和过滤的推文。我为“用户的推文”创建了另一个 twitter 测试帐户,并使用我的“OAuth-ed”帐户过滤推文,并且似乎将两条推文都放在一个 json 文件中。有什么问题吗?按照您的建议制作两个单独的 Stream() 对象会更好吗? 我建议作为替代方案,只要将两者收集在同一个文件中对您有用。如果您想将两者分开,从概念上讲,将它们收集为两个单独的Stream()
对象可能会更容易,但您可以自己轻松过滤来自一个 Stream()
对象的输出。
您能否更新答案中给出的链接?它不起作用。 oreilly 显示支持主页
@mrtipale 正在编辑,链接已损坏,所以我正在添加指向互联网存档页面的链接并复制相关代码
请注意,存档似乎正在进行维护,今天早上运行有点慢【参考方案2】:
如果你想流式传输特定的用户时间线:
1) 通过this 网站或 google 查找他/她的 ID,以了解 如何找到 twitter ID。
2) 使用以下代码:
from tweepy import OAuthHandler
from tweepy import Stream
from tweepy import StreamListener
listener = StreamListener()
auth = OAuthHandler(config.API_KEY, config.API_SECRET)
auth.set_access_token(config.ACCESS_TOKEN, config.ACCESS_TOKEN_SECRET)
stream = Stream(auth, listener)
stream.filter(follow=['3511430425']) # user ID for random account
【讨论】:
这会返回所有提到用户的推文(使用那个 id),你如何获得由 id 推文的推文 @maheshmnj 我建议你覆盖 Stream 对象的 'on_status' 方法并过滤那里的 ID 匹配。我找不到其他方法来实现这一点。 @MaheshJamdade 你发现了吗? 是的,我能够获取特定用户的推文。让我添加一个答案。【参考方案3】:您可以按照以下代码示例实时获取特定用户的推文。
import tweepy
from tweepy import OAuthHandler, Stream, StreamListener
username="maheshmnj" # Add your target users username here
userId=12345678 # Add target users userId
class TweetListener(StreamListener):
""" A listener handles tweets that are received in real time. """
def on_data(self, status):
try:
data = json.loads(status)
user = data['user']['screen_name']
tweet_id = data['id']
if(user == f'username'):
print(f'user tweeted, his tweetId=@tweet_id do something with the Tweet');
else:
print('found user',user)
except Exception as e:
print(e)
print('failed to retweet')
return True
def on_error(self, status_code):
if status_code == 420:
# returning False in on_data disconnects the stream
return False
print(status_code)
if __name__ == '__main__':
print(f'bot started listening to username')
listen = TweetListener()
auth = tweepy.OAuthHandler(APP_KEY, APP_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
stream = Stream(auth, listen)
stream.filter(follow=[userId],)
【讨论】:
以上是关于使用 tweepy 流式传输用户的时间线和过滤的推文的主要内容,如果未能解决你的问题,请参考以下文章
在 Tweepy Streaming API 中包含过滤条件