我需要将照片或视频发布到经过身份验证的Instagram商业帐户。
我已经获得了Instagram商业帐户的访问令牌,现在我希望将视频上传到该帐户,但我不断返回此错误消息
媒体ID不可用
我按照说明从这里的文档上传视频或照片https://developers.facebook.com/docs/instagram-api/guides/content-publishing/
请注意,下面的代码在上传照片时工作得很好,但在上传视频时总是失败。
下面是我在他们的文档之后的代码:
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 } = mediaContainerResponse.data;
// id above is supposed to be the creation_id needed for the next step below:
// I can confirm that the id for the created media container was actually returned.
// So, it's weird for me to keep getting the Media ID not available error message.
let mediaPublishResponse = await axios.post(`https://graph.facebook.com/${igUserId}/media_publish?creation_id=${id}&access_token=${access_token}`);
let mediaPublishResponseData = mediaPublishResponse.data;
let publishedMediaId = mediaPublishResponseData.id;
console.log(`File uploaded to Instagram!`);
} catch (e) {
console.log(`Instagram file upload failed miserably`);
console.log(e);
}
请注意,上面的mediaUrl
来自远程url,例如https://somewhere.com/video.mp4
再一次,用上面的代码上传照片工作得很好但如果是视频,就行不通了。我一直得到以下完整的错误信息:
OAuth "Facebook平台"invalid_request"媒体ID不可用
经过仔细观察,我注意到creation_id
确实是为视频生成的,所以坦率地说,很奇怪,我仍然得到上述错误信息。
拜托,我能做错什么吗?
我很感谢任何解决这个问题的建议。
问题就在这里。当您将视频上传到/media端点时,视频需要一些时间来处理,并且在此期间视频不可用于发布,因此/media_publish端点返回"media Id not available"的原因。解决这个问题的方法是检查容器的发布状态:GET: /{ig-container-id}?fields=status_code
。只有当status_code为"FINISHED"容器是否可用于发布。查看下面的链接了解更多详情
IG内容发布故障排除
@aib是正确的。
在调用publish之前需要检查媒体容器的状态。Meta的文档说明:
如果你能够为视频创建一个容器,但是POST/{ig-user-id}/media_publish端点不返回已发布的media ID,可以查询容器的发布状态GET/{ig-container-id}?字段= status_code端点。
需要一些时间,这取决于你上传的视频的大小,容器准备好发布。对于一个1Mb的视频,我花了大约10秒的时间才使媒体容器可用。我检查GET /{ig-container-id}?fields=status_code
端点是否返回FINISHED
,只有这样我才能最终使用media_publish端点和creationId。
async function checkIfMediaContainerReady(containerReady) {
if (!containerReady) {
console.log('waiting for ig media container to be ready...');
await sleep(5000);
let res = await Request(mediaContainerStatusCheckUrl, {method: "GET", headers: headers});
let statusResponseJson = await JSON.parse(res);
await checkIfMediaContainerReady(statusResponseJson.status_code === 'FINISHED');
}
}
const res = await Request(mediaContainerStatusCheckUrl, {method: "GET", headers: headers});
const statusResponseJson = await JSON.parse(res);
await checkIfMediaContainerReady(statusResponseJson.status_code === 'FINISHED');
console.log("ig media container is ready");