I am using tweepy
4.10.1
to fetch Tweets using StreamingClient
, but I am unable to load any media
info or even includes
object itself. I have tried the similar code using get_tweet()
method and media
and includes
were received fine.
The code:
class TweetPrinter(tweepy.StreamingClient): def on_tweet(self, tweet): print(tweet.includes) streaming_client = TweetPrinter('bearer-token') streaming_client.add_rules(tweepy.StreamRule("from:xxxyyy")) streaming_client.filter(tweet_fields=['author_id', 'created_at'], media_fields=['preview_image_url', 'url'], expansions=['attachments.media_keys']) print(tweet.includes)
I am receiving following error:
raise AttributeError from None
When I use the same tweet id with get_tweet()
method, I can retrieve media
from includes
fine.
client = tweepy.Client(config.BEARER) ID = 'xxxxyyyy' tweet = client.get_tweet(ID, tweet_fields=['author_id', 'created_at'], media_fields=['preview_image_url', 'url'], expansions=['attachments.media_keys']) print(tweet.includes)
According to Google, official docs and FAQ, I have tried all recommended steps I found
- Why am I not getting expansions or fields data with API v2 using Client?
- tweepy.StreamingClient.filter allows
media_fields
andexpansions
- Tweepy does not return url media field while using Twitter API v2 methods
- tweepy.StreamingClient.on_includes this valides that
includes
should be available
What am I missing here?
Advertisement
Answer
EDIT
I have discovered that using on_data()
is the proper way how to retrieve all data from tweet. It covers all tweet
, includes
and other objects.
So the proper code should looks like this:
import orjson class TweetPrinter(tweepy.StreamingClient): def on_data(self, raw_data): # Received as bytes, needs to be loaded by json (I use orjson) raw_data = orjson.loads(raw_data) print("data") print(raw_data.get('data', None)) print("media") print(raw_data.get('includes', None))
Deprecated solution
The TweetPrinter
class should contain function to handle when includes
received like this:
class TweetPrinter(tweepy.StreamingClient): def on_tweet(self, tweet): print(tweet.data) def on_includes(self, includes): print(includes)
Thanks to this article, it helped me to find the proper solution :)