如何通过Facebook API为Facebook主页帖子附加媒体文件
问题根因与修复方案
你遇到的文本发布成功但附件丢失的情况,是因为Facebook接口检测到附件参数格式异常时,会自动忽略附件部分,只要文本参数合法就会正常发布纯文本帖子,所以才会出现不返回明确参数错误、只报未知错误的情况,可按以下步骤排查修复:
1. 修复照片上传逻辑,避免单独发布
当前上传照片时没有加published=false参数,默认情况下调用/{page-id}/photos接口会直接把照片单独发布为独立帖子,后续关联到feed帖时就会失效。上传照片的接口需要调整为:
// 新增encodeURIComponent处理照片URL,同时加published=false参数 let mediaUploadUrl = `https://graph.facebook.com/${pageId}/photos?url=${encodeURIComponent(photoUrl)}&published=false&access_token=${pageAccessToken}`;
encodeURIComponent用于处理URL中的特殊字符,避免请求解析异常。
2. 修正attached_media参数格式
你直接把对象传给了URLSearchParams,它会自动序列化为[object Object]字符串,不符合Facebook接口要求,需要先把media对象转为JSON字符串再append:
urlParams.append(`attached_media[${i}]`, JSON.stringify(mediaIdObject));
3. 校验必要权限
确认你的access token已经申请了pages_manage_posts权限,且是通过Page管理角色账号授权的,不是普通用户授权的token。
4. 验证照片资源可用性
确保你传入的photoUrl是公网可直接访问的地址,不需要登录、没有防盗链限制,Facebook的爬虫可以正常抓取到资源。
修正后的核心代码片段
let mediaIds = []; for (let photoUrl of photoUrls) { let mediaUploadUrl = `https://graph.facebook.com/${pageId}/photos?url=${encodeURIComponent(photoUrl)}&published=false&access_token=${pageAccessToken}`; let response = await axios.post(mediaUploadUrl); let { id } = response.data; if (id) { mediaIds.push(id); } } let urlParams = new URLSearchParams(); urlParams.append("access_token", pageAccessToken); urlParams.append("message", "Hello World"); let postUrl = `https://graph.facebook.com/${pageId}/feed`; if (mediaIds.length > 0) { for (let i = 0; i < mediaIds.length; i++) { let mediaId = mediaIds[i]; let mediaIdObject = { media_fbid: mediaId }; urlParams.append(`attached_media[${i}]`, JSON.stringify(mediaIdObject)); } } try { let { data } = await axios.post(postUrl, urlParams); let postId = data.id; } catch (e) { done = false; console.log(e); }
内容的提问来源于stack exchange,提问作者ololo
相关产品推荐
相关产品推荐

