向Instagram商业账号上传视频总返回Media ID is not available错误如何解决
错误原因
- 核心触发逻辑:Instagram Graph API的图片内容容器创建是同步处理,创建接口返回ID即可直接调用发布;但视频内容容器的创建是异步流程,接口返回的creation_id只是一个临时标识,此时平台还在后台拉取你的视频文件、完成转码、合规校验、元数据解析等处理,你拿到ID后立即调用发布接口时,容器还未完成处理处于不可用状态,就会触发该报错。
- 其他可能原因:
- 视频参数不符合平台规范,后台处理过程中容器创建失败,返回的临时ID无效
- 视频存储服务器响应过慢,平台拉取视频超时,容器处理失败
- Access Token缺少
instagram_basic、pages_show_list等必要权限
解决方法
- 增加容器状态轮询逻辑:拿到creation_id之后不要直接调用发布接口,先循环查询容器处理状态,直到状态为可发布再走后续流程。查询请求如下:
GET https://graph.facebook.com/{你的creation_id}?fields=status_code,status&access_token={你的access_token}
返回的status_code为FINISHED时可以调用发布接口;为IN_PROGRESS时间隔2-5秒重试查询;为ERROR时可通过status字段查看具体失败原因,调整视频参数后重试。 - 提前校验视频参数符合平台要求:
- 视频编码为H.264,音频编码为AAC
- 单视频文件大小不超过4GB
- 时长范围:Feed视频3秒-60分钟,Reels视频15秒-90秒
- 长宽比范围1.91:1 ~ 9:16
- 调整后代码参考:
let mediaContainerUrl = `https://graph.facebook.com/${igUserId}/media`; let containerParams = new URLSearchParams(); if (isPhoto) { containerParams.append('image_url', mediaUrl); } else { containerParams.append('video_url', mediaUrl); containerParams.append('media_type', 'VIDEO'); } containerParams.append('caption', caption); containerParams.append('access_token', accessToken); try { let mediaContainerResponse = await axios.post(mediaContainerUrl, containerParams); let { id: creationId } = mediaContainerResponse.data; // 新增视频容器状态轮询逻辑 if (!isPhoto) { let containerStatus = ''; let retryCount = 0; const maxRetry = 60; // 最多轮询60次,每次间隔2秒,总等待2分钟可根据需求调整 while (retryCount < maxRetry && containerStatus !== 'FINISHED') { const statusRes = await axios.get(`https://graph.facebook.com/${creationId}`, { params: { fields: 'status_code', access_token: accessToken } }); containerStatus = statusRes.data.status_code; if (containerStatus === 'ERROR') { throw new Error('视频容器处理失败,请检查视频参数'); } if (containerStatus === 'IN_PROGRESS') { await new Promise(resolve => setTimeout(resolve, 2000)); retryCount++; } } if (retryCount >= maxRetry) { throw new Error('视频处理超时,请稍后重试'); } } // 容器状态正常后再调用发布接口 let mediaPublishResponse = await axios.post(`https://graph.facebook.com/${igUserId}/media_publish`, null, { params: { creation_id: creationId, access_token: accessToken } }); let publishedMediaId = mediaPublishResponse.data.id; console.log(`File uploaded to Instagram!`); } catch (e) { console.log(`Instagram file upload failed miserably`); console.log(e); }
内容的提问来源于stack exchange,提问作者ololo
相关产品推荐
相关产品推荐

