使用Tweepy调用X API发布图片时提示媒体ID无效问题求助
错误原因及解决方法
核心错误原因
媒体ID类型不匹配
Twitter API v1.1的media_upload返回的media_id_string是字符串格式,但v2的create_tweet接口要求media_ids参数传入整数类型的媒体ID,直接传入字符串会被判定为无效ID。媒体文件未完成平台处理
通过v1.1上传媒体后,X平台需要完成转码、审核等处理流程。如果立即调用v2发布接口,媒体可能处于pending(处理中)状态,此时媒体ID会被判定为无效。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
相关产品推荐
相关产品推荐

