NodeJS 上传到Instagram企业帐户的视频总是返回“媒体ID不可用”错误消息

xj3cbfub  于 2023-05-28  发布在  Node.js
关注(0)|答案(2)|浏览(154)

我需要将照片或视频发布到经过认证的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 Platform”“invalid_request”“媒体ID不可用
经过仔细观察,我注意到确实为视频生成了creation_id,所以坦率地说,我仍然收到上述错误消息很奇怪。
拜托,我能做错什么?
我非常感谢任何解决这个问题的建议。

vd8tlhqk

vd8tlhqk1#

所以,问题就在这里。当您将视频上传到/media端点时,视频需要一些时间来处理,并且在此期间视频将无法发布,因此/media_publish端点返回“Media Id not available”。解决方案是检查容器的发布状态:GET: /{ig-container-id}?fields=status_code。只有当status_code为“FINISHED”时,容器才可用于发布。查看下面的链接了解更多详情
IG内容发布故障排除

qcbq4gxm

qcbq4gxm2#

@aib是正确的。
在调用发布之前,需要检查媒体容器的状态。 meta的文档指出:
如果您能够为视频创建容器,但POST /{ig-user-id}/media_publish端点未返回已发布媒体ID,则可以通过查询GET /{ig-container-id}?fields=status_code端点。
容器准备发布需要一些时间,具体取决于您要上传的视频的大小。对于一个1 Mb的视频,我花了~10秒的时间才让媒体容器可用。我检查GET /{ig-container-id}?fields=status_code端点以返回FINISHED,只有这样我才能最终使用具有creationId的media_publish端点。

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");

相关问题