Tweepy StreamListener 扩展模式

6

我当前的代码通过使用Twitter流API,将某个关键字下的所有推文打印到控制台上。但是我无法弄清楚如何获取推文的完整文本而不是被截断的版本。该程序还在其他地方使用了。

    new_tweets = api.user_timeline(screen_name=username, count=200, tweet_mode='extended')

最后一个参数就是指定了这个。

这是我的当前代码:

class LiveTweetListener(tweepy.StreamListener):
    def on_status(self, status):
        try:
            print(status.full_text)
        except AttributeError:
            print(status.text)

    def on_error(self, status_code):
        if status_code == 420:
            print("420")
            return False

def start_stream(track):
    Listener = LiveTweetListener()
    stream = tweepy.Stream(auth=api.auth, listener=LiveTweetListener())
    stream.filter(track=track, async=True)

使用tweepy.Stream时传递tweet_mode='extended'似乎不起作用。


请附上当前输出和期望输出? - ZdaR
目前在使用 tweepy 流时,可以获取 .text,但当超过 140 个字符时会被截断。我正在研究是否有办法获取完整的文本:当前 Status.text 显示前 137 个字符和结尾的省略号,如果推文太长。 - Ladislav Louka
1个回答

6

需要一些逻辑才能使它正常工作。首先,将tweet_mode添加回Stream中,如下所示:

stream = tweepy.Stream(auth=api.auth, listener=LiveTweetListener(), tweet_mode='extended')

接下来,将您的on_status更改为以下内容:
def on_status(self, status):
    try:
        if hasattr(status, 'retweeted_status') and hasattr(status.retweeted_status, 'extended_tweet'):
            print('retweeted: ' + status.retweeted_status.extended_tweet['full_text'])
        if hasattr(status, 'extended_tweet'):
            print('extended_tweet: ' + status.extended_tweet['full_text'])
        else:
            print('text: ' + status.text)
    except AttributeError:
        print('attribute error: ' + status.text)

这是为什么它有效的原因:
  1. 如果原始推文被转发,status.retweeted_tweet.extended_tweet.full_text 保存了文本。
  2. 如果这是扩展模式推文,则可以在 status.extended_tweet.full_tweet 中找到文本。
  3. 否则,这是一个经典的推文,您可以在 status.text 中找到文本。
尽管 full_text 不作为 extended_tweet 属性出现,但当可用时,它是 JSON 负载的一部分,这就是为什么您仍然可以通过 ['full_text'] 访问它的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接