Tweepy如何从user_fields提取数据?无法获取推文作者用户名
问题原因
你无法读取用户名的核心原因有两个:
- 漏传了
expansions参数:Twitter API v2 不会默认返回推文关联的作者用户数据,user_fields的作用只是指定「当用户对象被返回时需要包含哪些字段」,本身不会触发用户数据的拉取,必须显式传入expansions=["author_id"]告诉接口要展开推文对应的作者对象。 - 直接调用
flatten()方法会丢失关联数据:flatten()会把所有分页里的主资源(也就是推文对象)抽平成可迭代序列,但分页响应里附带的includes关联数据(也就是展开的用户对象)会在这个过程中被丢弃,你自然无法从单个tweet实例上拿到用户属性。
修复方案
按如下逻辑调整代码即可:
- 给请求新增
expansions=["author_id"]参数 - 放弃直接用
flatten()抽平结果,改为逐页遍历响应,先把每页返回的用户对象做成id到实例的映射,再和每条推文的author_id匹配拿到对应用户名 - 额外注意:原代码里
tweet_text_list.append(tweet)是错误写法,要存推文文本需要取tweet.text属性,否则存入的是整个推文对象。
修正后可运行代码
for ids in liste: tweet_pages = tweepy.Paginator( client.get_users_tweets, id=ids, exclude=["replies", "retweets"], end_time=current_time, start_time=first_day_of_month, expansions=["author_id"], # 新增:声明展开作者关联字段 tweet_fields=["created_at", "author_id", "public_metrics"], user_fields=["name", "username"], max_results=100 ) for page in tweet_pages: # 构建本页用户id到用户对象的映射 user_mapping = {user.id: user for user in page.includes.get("users", [])} for tweet in page.data: tweet_id_list.append(tweet.id) tweet_created_at.append(tweet.created_at) tweet_text_list.append(tweet.text) # 修正:取推文文本而非整个对象 tweet_user_id.append(tweet.author_id) # 匹配拿到作者用户名 tweet_author = user_mapping.get(tweet.author_id) if tweet_author: tweet_user_name.append(tweet_author.username)
补充说明
- 不要尝试直接访问
tweet.username或tweet.user_name属性:推文对象本身不存储用户字段,用户是独立返回的关联资源,必须通过id匹配获取 - 如果后续需要拉取推文关联的其他资源(比如附带的媒体、地点、话题标签等),逻辑一致:先在
expansions里声明要展开的关联字段,再指定对应的*_fields参数,最后从每页的includes里匹配对应数据即可。
内容的提问来源于stack exchange,提问作者Max Mastermann
相关产品推荐
相关产品推荐

