【问题标题】:streaming api with tweepy only returns second last tweet and NOT the immediately last tweet带有 tweepy 的流 api 仅返回倒数第二条推文,而不是立即返回最后一条推文
【发布时间】:2012-04-22 11:01:21
【问题描述】:

我不仅是 python 新手,而且完全是编程新手,所以非常感谢您的帮助!

我正在尝试使用 Tweepy 过滤检测来自 twitter 流 API 的所有推文。

我已按用户 ID 过滤并确认正在实时收集推文。

然而,似乎只有倒数第二条推文被实时收集,而不是最新的推文。

你们能帮忙吗?

import tweepy
import webbrowser
import time
import sys

consumer_key = 'xyz'
consumer_secret = 'zyx'


## Getting access key and secret
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth_url = auth.get_authorization_url()
print 'From your browser, please click AUTHORIZE APP and then copy the unique PIN: ' 
webbrowser.open(auth_url)
verifier = raw_input('PIN: ').strip()
auth.get_access_token(verifier)
access_key = auth.access_token.key
access_secret = auth.access_token.secret


## Authorizing account privileges
auth.set_access_token(access_key, access_secret)


## Get the local time
localtime = time.asctime( time.localtime(time.time()) )


## Status changes
api = tweepy.API(auth)
api.update_status('It worked - Current time is %s' % localtime)
print 'It worked - now go check your status!'


## Filtering the firehose
user = []
print 'Follow tweets from which user ID?'
handle = raw_input(">")
user.append(handle)

keywords = []
print 'What keywords do you want to track? Separate with commas.'
key = raw_input(">")
keywords.append(key)

class CustomStreamListener(tweepy.StreamListener):

    def on_status(self, status):

        # We'll simply print some values in a tab-delimited format
        # suitable for capturing to a flat file but you could opt 
        # store them elsewhere, retweet select statuses, etc.



        try:
            print "%s\t%s\t%s\t%s" % (status.text, 
                                      status.author.screen_name, 
                                      status.created_at, 
                                      status.source,)
        except Exception, e:
            print >> sys.stderr, 'Encountered Exception:', e
            pass

    def on_error(self, status_code):
        print >> sys.stderr, 'Encountered error with status code:', status_code
        return True # Don't kill the stream

    def on_timeout(self):
        print >> sys.stderr, 'Timeout...'
        return True # Don't kill the stream

# Create a streaming API and set a timeout value of ??? seconds.

streaming_api = tweepy.streaming.Stream(auth, CustomStreamListener(), timeout=None)

# Optionally filter the statuses you want to track by providing a list
# of users to "follow".

print >> sys.stderr, "Filtering public timeline for %s" % keywords

streaming_api.filter(follow=handle, track=keywords)

【问题讨论】:

    标签: python twitter streaming tweepy


    【解决方案1】:

    我遇到了同样的问题。在我的情况下,答案并不像运行无缓冲的 python 那样简单,而且我认为它也没有解决原始海报的问题。问题实际上出在名为 streaming.py 和函数 _read_loop() 的文件中的 tweepy 包的代码中,我认为需要对其进行更新以反映 twitter 从其流 api 输出数据的格式的更改。

    我的解决方案是从 github 下载最新的 tweepy 代码,https://github.com/tweepy/tweepy 特别是 streaming.py 文件。您可以查看最近所做的更改以尝试在此文件的提交历史记录中解决此问题。

    我查看了 tweepy 类的详细信息,发现 streaming.py 类在 json 推文流中读取的方式存在问题。我认为这与 twitter 更新他们的流 api 以包含传入状态的位数有关。长话短说,这是我在 streaming.py 中替换的函数来解决这个问题。

    def _read_loop(self, resp):
    
        while self.running and not resp.isclosed():
    
            # Note: keep-alive newlines might be inserted before each length value.
            # read until we get a digit...
            c = '\n'
            while c == '\n' and self.running and not resp.isclosed():
                c = resp.read(1)
            delimited_string = c
    
            # read rest of delimiter length..
            d = ''
            while d != '\n' and self.running and not resp.isclosed():
                d = resp.read(1)
                delimited_string += d
    
            try:
                int_to_read = int(delimited_string)
                next_status_obj = resp.read( int_to_read )
                # print 'status_object = %s' % next_status_obj
                self._data(next_status_obj)
            except ValueError:
                pass 
    
        if resp.isclosed():
            self.on_closed(resp)
    

    此解决方案还需要学习如何下载 tweepy 包的源代码,对其进行修改,然后将修改后的库安装到 python 中。这是通过进入您的顶级 tweepy 目录并根据您的系统键入类似 sudo setup.py install 的内容来完成的。

    我还在 github 上对这个包的编码人员发表了评论,让他们知道发生了什么。

    【讨论】:

    • 我已经分叉了他们的仓库并把这个修复放进去,只是在等待一个拉取请求。暂时可以在这里获取固定版本:github.com/robbrit/tweepy
    • @robbrit - 谢谢!我真的很感激这一点。拉动完成了吗?
    【解决方案2】:

    这是一个输出缓冲的例子。使用 -u(无缓冲)运行 python 以防止这种情况发生。

    或者,您可以通过在 print 语句后执行 sys.stdout.flush() 来强制刷新缓冲区。

    请参阅this answer 了解更多想法。

    【讨论】:

    • 谢谢!我知道这是小事。
    猜你喜欢
    • 2016-09-20
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2023-04-08
    • 2013-02-28
    • 2018-10-29
    相关资源
    最近更新 更多