使用 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 返回用户的推文

如何使用“关注”流式传输一个用户的推文

如何使用 tweepy 流式传输 Twitter 提及?

在 Tweepy Streaming API 中包含过滤条件

使用 tweepy 从“user_timeline”获取完整的推文文本

传入过滤关键字 | Python Tweepy API