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

使用Facebook Graph API获取多帖评论仅返回最后一篇数据的问题

问题:Facebook Graph API仅返回最后一篇帖子的评论数据

我尝试使用Facebook Graph API获取账号下最近2篇帖子的评论,代码可运行,但仅返回第二篇(最后一个数组)的评论数据。预期返回4个用户ID,实际仅返回最后2个。

原代码

$postItems = $postsArray['posts']['data'];
foreach ($postItems as $post) {
    $fullPostId = $post['id'];
    $comments_number = 10;
    $facebook_graph_api2 = "https://graph.facebook.com/v2.4/$fullPostId/comments?access_token=$accToken&pretty=1&summary=true&limit=$comments_number&after";
    $jsonData = grab_page($facebook_graph_api2,$accCookie);
    $postDataArrays = json_decode($jsonData, true);
    $CommentsItems = $postDataArrays['data'];
}

/** Update Balance Code **/
$toolId = '87637';
@$itemsCount = @count($CommentItems);
$toolPrice = toolPrice($toolId)*$itemsCount;
$finalBalance = updateBalance($toolPrice);

/** Update Balance Code **/
if ($finalBalance) {
    if (isset($CommentItems)) {
        echo '{"status":1,"balance":'.$finalBalance.',"message":"Success !","data":"';
        foreach($CommentItems as $item) {
            echo $users = $item['from']['id'].'\n';
        }
        echo '"}';
    }elseif( isset($postDataArray['error']) && $postDataArray['error']['code']== 1 ){
        $msgError = $postDataArray['error']['message'];
        echo '{"status":0,"message":"Error !","reason":"'.$msgError.'"}';

    }else{
        echo '{"status":0,"message":"Error !","reason":"Please Update Your Facebook Access Token"}';
    }
}else{
    echo '{"status":0,"message":"Error !","reason":"You do not have enough funds on balance"}';
}

问题原因

  • 核心问题:循环中每次将$postDataArrays['data']赋值给$CommentsItems时,是直接覆盖而非追加。循环处理第二篇帖子时,会把第一篇的评论数据替换掉,最终只保留最后一篇的评论。
  • 其他问题:
    • 变量拼写错误:$postDataArray应为$postDataArrays
    • 余额计算仅统计最后一篇的评论数,不符合业务逻辑
    • 直接拼接JSON字符串容易出现格式错误(比如换行符处理)

修正后的代码

// 初始化数组收集所有帖子的评论
$allComments = [];
$postItems = $postsArray['posts']['data'];

foreach ($postItems as $post) {
    $fullPostId = $post['id'];
    $comments_number = 10;
    $facebook_graph_api2 = "https://graph.facebook.com/v2.4/$fullPostId/comments?access_token=$accToken&pretty=1&summary=true&limit=$comments_number&after";
    $jsonData = grab_page($facebook_graph_api2,$accCookie);
    $postDataArrays = json_decode($jsonData, true);

    // 检查API返回是否有评论数据,有则追加到总数组
    if (!empty($postDataArrays['data'])) {
        $allComments = array_merge($allComments, $postDataArrays['data']);
    }

    // 处理API错误(提前捕获,避免后续逻辑出错)
    if (!empty($postDataArrays['error'])) {
        $msgError = $postDataArrays['error']['message'];
        echo json_encode([
            "status" => 0,
            "message" => "Error !",
            "reason" => $msgError
        ]);
        exit;
    }
}

/** Update Balance Code **/
$toolId = '87637';
$itemsCount = count($allComments);
$toolPrice = toolPrice($toolId) * $itemsCount;
$finalBalance = updateBalance($toolPrice);

/** Update Balance Code **/
if ($finalBalance) {
    if (!empty($allComments)) {
        // 提取所有用户ID
        $userIds = array_column($allComments, 'from', 'id');
        $userIdsStr = implode("\n", array_keys($userIds));

        echo json_encode([
            "status" => 1,
            "balance" => $finalBalance,
            "message" => "Success !",
            "data" => $userIdsStr
        ]);
    } else {
        echo json_encode([
            "status" => 0,
            "message" => "Error !",
            "reason" => "No comments found on posts"
        ]);
    }
} else {
    echo json_encode([
        "status" => 0,
        "message" => "Error !",
        "reason" => "You do not have enough funds on balance"
    ]);
}

修正说明

  1. 收集所有评论:初始化$allComments空数组,用array_merge将每篇帖子的评论追加进去,避免数据覆盖。
  2. 提前处理API错误:循环内直接检查API返回的错误,及时输出错误信息并终止脚本,避免无效计算。
  3. 修正余额计算:基于所有评论的总数计算费用,符合业务逻辑。
  4. 规范JSON输出:使用json_encode生成JSON,避免手动拼接导致的格式问题,同时用array_column高效提取用户ID。

内容的提问来源于stack exchange,提问作者egam321

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:00:38