Tweepy StreamListener extended mode

Viewed 1551

My current very simple code is supposed to use the twitter streaming API for simply printing all tweets under a certain keyword into console. However I can't figure out how to get the full text of the tweet instead of the truncated version. The program also elsewhere utilizes

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

in which the last parameter specifies exactly that.

This is my current code:

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)

Passing tweet_mode='extended' with stream = tweepy.Stream doesn't seem to work

1 Answers

There's a bit more logic required for getting this to work. First, add tweet_mode back to the Stream, like this:

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

Next, change your on_status to something like this:

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)

Here's why this works:

  1. If the original tweet was retweeted, status.retweeted_tweet.extended_tweet.full_text holds the text.
  2. If this is an extended mode tweet, you can find the text in status.extended_tweet.full_tweet.
  3. Otherwise, this is a classic tweet and you can find the text in status.text.

While full_text doesn't appear as an extended_tweet attribute, it is part of the JSON payload, when available, which is why you can still access it via ['full_text'].

Related