【问题标题】:Using tweepy to stream users' timeline and filtered tweets使用 tweepy 流式传输用户的时间线和过滤的推文
【发布时间】: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()

非常感谢您的帮助!谢谢。

【问题讨论】:

    标签: python twitter tweepy


    【解决方案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],)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2017-09-08
      • 2020-06-10
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      相关资源
      最近更新 更多