Facebook Graph API无法获取2019年后活动及upcoming活动问题
Facebook Graph API无法获取2019年后活动的问题解决
问题详情
自2018年起通过Facebook Graph API加载活动,脚本逻辑简洁,但查询仅能返回2019年及之前的活动;使用time_filter=upcoming参数时无任何结果返回。已确认访问令牌有效,且在Graph Explorer中测试结果一致,当前使用的脚本代码如下:
/* Facebook SDK Facebook SDK Facebook SDK Facebook SDK */ $nowdate = strtotime(date('Y-m-d')); $fb = new \Facebook\Facebook([ 'app_id' => '****', 'app_secret' => '****', 'default_graph_version' => 'v17.0', 'default_access_token' => '****', ]); try { $response = $fb->get( '/milesamersfoort/events?fields=id,start_time,name,description,cover,date&limit=200&since='.$nowdate, _FB_TOKEN ); } catch(FacebookExceptionsFacebookResponseException $e) { echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch(FacebookExceptionsFacebookSDKException $e) { echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; } $results = $response->getGraphEdge();
可能原因
- 权限收紧:Facebook在2020年后调整了页面活动的API访问权限,普通令牌无法获取2019年后的公开活动,需申请
pages_read_engagement或pages_events权限(需通过应用审核)。 - 时间参数格式错误:
since参数使用Unix时间戳不符合Graph API v17.0的要求,需使用ISO 8601格式的日期字符串。 - 参数逻辑冲突:
since参数与time_filter=upcoming的结合使用可能存在逻辑冲突,导致过滤结果异常。 - 活动隐私设置:目标页面的近期活动可能设置为非公开状态,无法通过API获取。
解决方案
- 确认并申请权限
- 在Graph Explorer中查看访问令牌的权限列表,确保已包含
pages_read_engagement或pages_events权限;若未包含,需通过Facebook应用审核流程申请对应权限。
- 在Graph Explorer中查看访问令牌的权限列表,确保已包含
- 修正时间参数格式
- 将
since参数的Unix时间戳替换为ISO 8601格式字符串,例如用date('c')生成符合要求的格式。
- 将
- 调整查询参数
- 直接使用
time_filter=upcoming参数替代since,或确保参数组合逻辑正确;同时移除无效的date字段(Graph API活动字段中无date,应使用start_time)。
- 直接使用
- 验证活动状态
- 登录Facebook页面后台,确认近期活动设置为公开可见,无隐私限制。
修改后的代码示例
/* Facebook SDK */ // 生成ISO 8601格式的当前时间 $nowDate = date('c'); $fb = new \Facebook\Facebook([ 'app_id' => '****', 'app_secret' => '****', 'default_graph_version' => 'v17.0', 'default_access_token' => '****', ]); try { // 使用time_filter=upcoming参数,移除无效的date字段 $response = $fb->get( '/milesamersfoort/events?fields=id,start_time,name,description,cover&limit=200&time_filter=upcoming', _FB_TOKEN ); } catch(\Facebook\Exceptions\FacebookResponseException $e) { echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch(\Facebook\Exceptions\FacebookSDKException $e) { echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; } $results = $response->getGraphEdge();
内容的提问来源于stack exchange,提问作者Aleks
相关产品推荐
相关产品推荐

