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

使用Tweepy调用X API发布图片时提示媒体ID无效问题求助

错误原因及解决方法

核心错误原因

  1. 媒体ID类型不匹配
    Twitter API v1.1的media_upload返回的media_id_string是字符串格式,但v2的create_tweet接口要求media_ids参数传入整数类型的媒体ID,直接传入字符串会被判定为无效ID。

  2. 媒体文件未完成平台处理
    通过v1.1上传媒体后,X平台需要完成转码、审核等处理流程。如果立即调用v2发布接口,媒体可能处于pending(处理中)状态,此时媒体ID会被判定为无效。

  3. Windows路径转义错误
    代码中的Windows路径使用了单反斜杠,Python会将\U解析为Unicode转义开头,导致路径无法正确识别,上传的媒体文件无效,最终引发媒体ID错误。

对应解决方法

1. 转换媒体ID类型

将v1.1返回的字符串类型媒体ID转换为整数后,再传入v2的create_tweet接口:

media_upload_result = api.media_upload(filename=media_path)
media_id = int(media_upload_result.media_id_string)  # 转换为整数

2. 等待媒体处理完成

上传后通过v1.1的get_media_status接口检查媒体状态,确认处理完成后再发布:

import time
# 循环检查媒体状态
while True:
    status = api.get_media_status(media_id)
    if status.processing_info["state"] == "succeeded":
        break
    elif status.processing_info["state"] == "failed":
        raise Exception("媒体处理失败,请检查文件格式")
    time.sleep(1)  # 每1秒检查一次

3. 修正Windows路径写法

使用原始字符串(前缀加r)或者双反斜杠避免转义错误:

# 原始字符串写法
media_path = r"C:\Users\jonca\Documents\Python_Files\final_graph.png"
# 或者双反斜杠写法
media_path = "C:\\Users\\jonca\\Documents\\Python_Files\\final_graph.png"

完整修正后的代码

#V1.1 Twitter API Authentication
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)

#V2 Twitter API Authentication
client = tweepy.Client(
    consumer_key=CONSUMER_KEY,
    consumer_secret=CONSUMER_SECRET,
    access_token=ACCESS_TOKEN,
    access_token_secret=ACCESS_TOKEN_SECRET,
)

def publicate_twitter(tweet_text):
    try:
        # 修正路径写法
        media_path = r"C:\Users\jonca\Documents\Python_Files\final_graph.png"

        # Upload image with API v1.1
        media_upload_result = api.media_upload(filename=media_path)
        media_id = int(media_upload_result.media_id_string)
        print("The media ID is: ", media_id)

        # 等待媒体处理完成
        import time
        while True:
            status = api.get_media_status(media_id)
            processing_state = status.processing_info.get("state")
            if processing_state == "succeeded":
                break
            elif processing_state == "failed":
                raise Exception("媒体处理失败,请检查文件是否符合X平台要求")
            time.sleep(1)

        # Create tweet with API v2
        client.create_tweet(text=tweet_text, media_ids=[media_id])
        print("Tweeted!")

    except Exception as e:
        print(f"Error Twitter: {e}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:22:36