使用PHP SDK调用Graph API无法获取Facebook评论者信息求助
解决Facebook Graph API无法获取评论者
from字段的问题 我之前也遇到过一模一样的问题,核心根源其实是Facebook的权限限制和API版本要求,下面是一步步的解决方案:
1. 确认必要的权限配置
要获取页面评论中普通用户的id和name,你的Facebook应用必须满足两个条件:
- 应用已申请并获得
pages_read_engagement权限(测试阶段用测试账号/页面可跳过正式审核); - 你的账号是目标页面的管理员/编辑/版主角色,否则即使有权限也无法读取评论者信息。
可以登录Facebook开发者后台,在「权限与功能」中检查权限状态,同时在Graph API Explorer里验证页面访问令牌是否包含该权限。
2. 使用最新的Graph API版本
旧版本的API(比如v12.0及以下)对评论者信息的获取规则差异很大,建议直接使用最新的稳定版本(比如v18.0+)。在PHP SDK初始化时明确指定版本:
$fb = new Facebook([ 'app_id' => '你的APP_ID', 'app_secret' => '你的APP_SECRET', 'default_graph_version' => 'v18.0', // 指定最新版本 ]);
3. 验证请求与令牌的有效性
你的请求字段结构是正确的,但要确保使用的是页面访问令牌(不是普通用户访问令牌)。可以先在Graph API Explorer中测试请求:
/[PAGE_ID]/posts?fields=message,comments.summary(true){message,from{id,name},likes.summary(true)},likes.summary(true),created_time
如果Explorer中能正常返回from字段,说明问题出在SDK的调用或令牌传递上;如果Explorer也返回不了,那肯定是权限或API版本的问题。
4. PHP SDK的正确调用示例
确保用带权限的页面访问令牌发起请求,并正确处理嵌套字段:
use Facebook\Facebook; use Facebook\GraphNodes\GraphEdge; $fb = new Facebook([ 'app_id' => '你的APP_ID', 'app_secret' => '你的APP_SECRET', 'default_graph_version' => 'v18.0', ]); // 替换为包含pages_read_engagement权限的页面访问令牌 $pageAccessToken = '你的页面访问令牌'; try { $response = $fb->get( '/me/posts?fields=message,comments.summary(true){message,from{id,name},likes.summary(true)},likes.summary(true),created_time', $pageAccessToken ); $posts = $response->getGraphEdge(); } catch(\Facebook\Exceptions\FacebookResponseException $e) { die('Graph API错误: ' . $e->getMessage()); } catch(\Facebook\Exceptions\FacebookSDKException $e) { die('SDK错误: ' . $e->getMessage()); } foreach ($posts as $post) { echo "帖子内容: " . $post['message'] . "\n"; if ($post->hasProperty('comments')) { $comments = $post['comments']->getGraphEdge(); foreach ($comments as $comment) { echo "评论内容: " . $comment['message'] . "\n"; // 检查是否存在评论者信息 if ($comment->hasProperty('from')) { $commenter = $comment['from']; echo "评论者ID: " . $commenter['id'] . ", 名称: " . $commenter['name'] . "\n"; } else { echo "无法获取评论者信息(可能是用户隐私设置或权限不足)\n"; } } } }
额外注意点
- 少数情况下,如果评论者设置了严格的隐私选项(禁止页面获取其个人信息),即使有权限也拿不到
from字段,但这种情况比较少见; - 定期验证页面访问令牌的有效性和过期时间,避免因令牌过期导致的权限问题。
内容的提问来源于stack exchange,提问作者Nicola Scionti
相关产品推荐
相关产品推荐

