Facebook Graph API视频动态故事发布失败排查求助
Facebook视频Stories发布失败(500错误)的排查与修复
以下是针对你遇到问题的核心排查点和修复建议,结合你的代码逐一分析:
1. 视频上传请求方法错误
你在第二步上传视频时使用了POST请求,但Facebook明确要求通过file_url远程上传视频必须使用PUT方法,错误的请求方法会直接触发服务器500错误。
修复:将cURL的CURLOPT_POST改为CURLOPT_PUT,无需设置CURLOPT_POSTFIELDS(通过file_url是告知Facebook拉取远程文件,而非本地文件上传)。
2. 视频规格不符合Stories要求
Facebook Stories对视频有严格格式限制:
- 比例必须为9:16竖屏
- 分辨率至少720p(1280x720)
- 时长不超过15秒
- 格式为MP4/MOV
你使用的示例视频是16:9比例,不符合Stories要求,会导致上传后无法完成发布流程,甚至触发服务器错误。
3. 初始化上传阶段缺少必填参数
在start上传阶段,你未提供file_size参数。即便Facebook可自动拉取远程文件大小,明确传递该参数能避免服务器处理异常,尤其是大文件场景,这可能是500错误的诱因之一。
修复:在初始化请求中添加file_size参数,可通过get_headers获取远程文件大小(注意跨域权限问题)。
4. 权限与令牌有效性问题
虽然图片动态可正常发布,但视频Stories需要额外权限:
- 必须拥有
pages_manage_posts、pages_manage_engagement权限 - 令牌需包含
video_upload权限 - 检查令牌是否过期,以及应用是否处于开发模式(开发模式下仅测试用户能访问上传内容,且有上传限制)
5. cURL请求的错误处理缺失
你的代码未处理cURL本身的错误(如SSL连接失败、网络超时等)。当返回500错误时,curl_exec可能返回非JSON内容,导致json_decode失败,无法获取有效错误信息。
修复:添加cURL错误检查逻辑:
$uploadResponse = curl_exec($ch); if(curl_errno($ch)){ throw new Exception('cURL错误: ' . curl_error($ch)); } curl_close($ch);
修改后的代码示例
function postStoriesVideoFacebook($fb, $pageId, $pageAccessToken, $mediaUrls) { $mediaUrls = 'https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4'; // 获取远程视频文件大小 $headers = get_headers($mediaUrls, true); $fileSize = isset($headers['Content-Length']) ? $headers['Content-Length'] : 0; // 阶段1:初始化上传会话 $response = $fb->post("/{$pageId}/video_stories", [ 'upload_phase' => 'start', 'file_size' => $fileSize, // 添加文件大小参数 ], $pageAccessToken); $initData = $response->getDecodedBody(); $videoId = $initData['video_id']; $uploadUrl = $initData['upload_url']; var_dump($initData, $videoId, $uploadUrl); // 阶段2:通过远程URL上传视频 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $uploadUrl); curl_setopt($ch, CURLOPT_PUT, true); // 改为PUT方法 curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: OAuth $pageAccessToken", "file_url: $mediaUrls" ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 生产环境建议开启SSL验证 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); $uploadResponse = curl_exec($ch); if(curl_errno($ch)){ throw new Exception('cURL错误: ' . curl_error($ch)); } curl_close($ch); $uploadData = json_decode($uploadResponse, true); var_dump($uploadData); if (isset($uploadData['success']) && $uploadData['success'] === true) { // 阶段3:发布视频到Stories $finishResponse = $fb->post("/{$pageId}/video_stories", [ 'upload_phase' => 'finish', 'video_id' => $videoId, ], $pageAccessToken); $result = $finishResponse->getDecodedBody(); var_dump($result); if (isset($result['success']) && $result['success'] === true) { return $result['post_id']; } else { throw new Exception('发布视频Stories失败: ' . (isset($result['error']['message']) ? $result['error']['message'] : '未知错误')); } } else { $errorMsg = isset($uploadData['error']['message']) ? $uploadData['error']['message'] : '上传失败'; throw new Exception('视频上传失败: ' . $errorMsg); } }
内容的提问来源于stack exchange,提问作者Atendimento Agência Prime
相关产品推荐
相关产品推荐

