You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:35:04