使用Twitter API V1和V2端点发布图文推文失败求助
解决Tweepy使用V2发布带图片推文时的"无效媒体ID"错误
问题根源分析
你的代码存在几个关键问题导致media_ids无效:
- 路径转义错误:Windows路径中的反斜杠
\是转义字符,直接写"C:\wex\pic.jpg"会让\w被解析为特殊字符,导致程序无法正确找到图片文件,媒体上传失败后返回无效ID。 - 冗余的媒体上传操作:代码中重复调用
api.media_upload,不仅浪费资源,还容易混淆有效媒体ID的来源。 - 潜在的媒体处理未完成问题:部分情况下媒体上传后需要短暂等待处理完成,直接发布可能导致ID未生效。
修正后的代码
def Tweet(self, date: str): consumer_key = 'xxxxxxxxxxxxxxxxxx' consumer_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' access_token_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 初始化Twitter API V2客户端 client = tweepy.Client( bearer_token='xxxxxxxxxxxxxxxxxxxxx', consumer_key=consumer_key, consumer_secret=consumer_secret, access_token=access_token, access_token_secret=access_token_secret ) # 初始化V1 API实例,用于媒体上传 auth = tweepy.OAuth1UserHandler( consumer_key, consumer_secret, access_token, access_token_secret ) api = tweepy.API(auth) # 使用原始字符串定义路径,避免转义字符解析错误 image_path = r"C:\wex\pic.jpg" # 单次上传媒体,获取有效媒体ID media = api.media_upload(filename=image_path) media_id = media.media_id_string # 或使用media.media_id(整数类型) # 可选:等待媒体处理完成(针对大文件或GIF/视频) # import time # while True: # status = api.get_media_upload_status(media.media_id) # if status.processing_info['state'] == 'succeeded': # break # elif status.processing_info['state'] == 'failed': # raise Exception("媒体上传失败") # time.sleep(1) # 发布带媒体的推文 response = client.create_tweet(text="This Tweet IS A TEST SORRY!", media_ids=[media_id]) log.info(f"发布成功!推文ID: {response.data['id']}")
额外注意事项
- 确认图片文件存在,且格式符合Twitter要求(支持JPG、PNG、GIF等,单图大小不超过5MB)。
- 若上传GIF或视频,需在
media_upload时指定media_category参数,例如api.media_upload(filename=image_path, media_category="tweet_gif")。 - 确保你的API密钥拥有
write权限,且已完成Twitter开发者平台的权限申请。
内容的提问来源于stack exchange,提问作者Papafortmigas
相关产品推荐
相关产品推荐

