Tweepy StreamListener 扩展模式

Lad*_*uka 6 python twitter tweepy

我当前非常简单的代码应该使用 twitter 流 API 来简单地将某个关键字下的所有推文打印到控制台中。但是我不知道如何获取推文的全文而不是截断的版本。该程序还在其他地方利用

    new_tweets = api.user_timeline(screen_name=username, count=200, tweet_mode='extended')
Run Code Online (Sandbox Code Playgroud)

其中最后一个参数准确指定了这一点。

这是我当前的代码:

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)
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*ayo 6

让它工作需要更多的逻辑。首先,添加tweet_modeStream,如下所示:

stream = tweepy.Stream(auth=api.auth, listener=LiveTweetListener(), tweet_mode='extended')
Run Code Online (Sandbox Code Playgroud)

接下来,将您的更改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)
Run Code Online (Sandbox Code Playgroud)

这就是为什么这样做的原因:

  1. 如果原始推文被转发,则status.retweeted_tweet.extended_tweet.full_text保留文本。
  2. 如果这是扩展模式推文,您可以在status.extended_tweet.full_tweet.
  3. 否则,这是一条经典推文,您可以在status.text.

虽然full_text不作为extended_tweet属性出现,但它是 JSON 有效负载的一部分(如果可用),这就是为什么您仍然可以通过['full_text'].