You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Twitter API v2与Tweepy无法提取推文及用户字段问题咨询

解决方案

你遇到的问题并非API请求参数错误,而是Tweepy返回的response对象结构需要主动提取扩展字段——直接打印response只会显示基础的推文ID和文本,扩展字段需从指定属性中获取。具体提取方式如下:

1. 提取推文的扩展字段

response.data是包含所有推文对象的列表,每个推文对象可直接调用你指定的tweet_fields字段:

if response.data:
    for tweet in response.data:
        print(f"推文ID: {tweet.id}")
        print(f"作者ID: {tweet.author_id}")
        print(f"发布时间: {tweet.created_at}")
        print(f"来源: {tweet.source}")
        print(f"文本: {tweet.text}")
        print(f"地理位置: {tweet.geo}")
        print("---")

2. 提取关联的用户信息

用户数据不会直接绑定到推文,而是存放在response.includes['users']中,需通过推文的author_id匹配对应用户:

# 将用户数据转为字典,方便通过author_id快速查找
user_dict = {user.id: user for user in response.includes.get('users', [])}

if response.data:
    for tweet in response.data:
        user = user_dict.get(tweet.author_id)
        if user:
            print(f"用户名: @{user.username}")
            print(f"用户昵称: {user.name}")
            print(f"所在地: {user.location}")
            print(f"认证状态: {'已认证' if user.verified else '未认证'}")
            print("---")

3. 提取地理位置信息

若推文带有geo.place_id,对应的地点数据存放在response.includes['places']中,需通过place_id匹配:

# 将地点数据转为字典,方便通过place_id快速查找
place_dict = {place.id: place for place in response.includes.get('places', [])}

if response.data:
    for tweet in response.data:
        if tweet.geo and tweet.geo.get('place_id'):
            place = place_dict.get(tweet.geo['place_id'])
            if place:
                print(f"国家: {place.country}")
                print(f"国家代码: {place.country_code}")
                print("---")

完整示例代码

response = client.search_recent_tweets(
        "innovation -is:retweet lang:pl",
        max_results=100,
        tweet_fields=['author_id', 'created_at', 'text', 'source', 'lang', 'geo'],
        user_fields=['name', 'username', 'location', 'verified'],
        expansions=['geo.place_id', 'author_id'],
        place_fields=['country', 'country_code']
    )

if response.data:
    # 构建用户和地点的映射字典,提升查找效率
    user_dict = {user.id: user for user in response.includes.get('users', [])}
    place_dict = {place.id: place for place in response.includes.get('places', [])}
    
    for tweet in response.data:
        print(f"推文ID: {tweet.id}")
        print(f"作者ID: {tweet.author_id}")
        print(f"发布时间: {tweet.created_at}")
        print(f"来源: {tweet.source}")
        print(f"文本: {tweet.text}")
        
        # 输出关联用户信息
        user = user_dict.get(tweet.author_id)
        if user:
            print(f"关联用户: @{user.username} ({user.name})")
            print(f"用户所在地: {user.location}")
            print(f"认证状态: {'已认证' if user.verified else '未认证'}")
        
        # 输出关联地点信息
        if tweet.geo and tweet.geo.get('place_id'):
            place = place_dict.get(tweet.geo['place_id'])
            if place:
                print(f"推文地点: {place.country} ({place.country_code})")
        
        print("="*50)

免费版Twitter API v2确实支持你指定的这些字段,问题核心是Tweepy将主推文数据与扩展数据分开存储,需手动提取关联内容,而非直接打印response对象获取所有信息。

内容的提问来源于stack exchange,提问作者user16330403

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:33:28