Flutter调用Facebook API拉取非默认用户数据报错及合规获取咨询
Facebook Graph API从v2.0版本启动的平台隐私收紧调整是真实存在的,这套规则从2018年落地后持续迭代,已经完全取消了“只要在接口请求的fields参数里加上字段名就能拉取数据”的旧逻辑。你当前遇到的全字段请求报错,核心原因是权限不匹配。
你现在的测试代码里,登录环节只申请了email单权限,但接口请求里要拉取的生日、家乡、好友列表、帖子等数据,全部需要单独申请对应权限,且要满足「权限已在登录申请列表中声明、用户已手动授权该权限、应用已通过Facebook官方的权限合规审核」三个前提,任意条件不满足都会返回接口报错,常见的报错码就是权限缺失类的#10、#200错误,和截图里的报错表现完全一致。
不同数据类型的可获取性与权限要求
所有你计划拉取的用户数据,并不是全部都能合法拿到,具体规则如下:
- 用户基础信息类
- 无需额外权限、用户登录即可默认获取的字段:
id、name、头像地址、名、姓,这些字段不需要走审核流程 email字段:需要申请email权限,无审核要求,用户同意授权即可获取birthday、hometown字段:需要分别申请user_birthday、user_location权限,这两类属于受限权限,必须提交应用到Facebook完成合规审核,普通未审核应用仅能通过后台添加的测试账号拿到这部分数据,对普通用户返回空值或报错- 好友数量、粉丝数:好友数量需要申请
user_friends权限,且该权限返回的好友数据仅包含同样主动授权了你的应用的好友,无法拿到用户的全量好友总数;粉丝数需要申请user_page_follows权限,同样属于需要审核的受限权限
- 无需额外权限、用户登录即可默认获取的字段:
- 好友名称列表类
自Facebook v2.0接口上线后,全量好友列表拉取接口已经被永久封禁,不存在合法获取路径。就算通过user_friends权限审核,也只能拿到和用户共同授权了你应用的那部分好友的基础信息,无法拿到所有好友的名称、ID等全量数据 - 用户发布的帖子内容类
需要申请user_posts权限,该权限的审核标准极其严格,Facebook会要求应用明确说明获取用户帖子的实际业务用途,绝大多数普通应用都无法通过该审核,未审核的应用就算在权限列表里加了user_posts,也拉不到任何用户帖子内容
适配最新规则的落地调整方案
- 先修正登录环节的权限申请逻辑
不要只申请['email']权限,要把你已经完成审核、可以合法使用的权限全部加到登录申请列表里,比如你已经通过了生日、家乡的权限审核,就需要写成:
final result = await facebookLogin.logIn([ 'email', 'user_birthday', 'user_location', ]);
这里要特别注意:如果还没完成权限审核,不要提前把这些受限权限加到申请列表里,否则普通用户登录时根本看不到对应的授权弹窗,接口依然会返回权限报错。你可以先在Facebook应用后台把测试账号添加到测试人员列表里,用测试账号调试所有接口逻辑,等权限通过审核后再开放给普通用户。
2. 替换停止维护的旧依赖
你代码里用的flutter_facebook_login已经停止维护多年,对新版Graph API的权限适配存在很多已知问题,官方目前推荐使用维护中的facebook_auth插件,能避免很多因为SDK版本过旧导致的token校验报错、权限丢失问题。
3. 调整接口版本
你当前代码里用的v10.0版本Graph API已经被Facebook停服,请求时容易出现接口废弃类报错,建议换成目前官方长期支持的稳定版本,比如v18.0,保证接口兼容性。
常见踩坑提醒
- 不要误以为只要在接口的
fields参数里声明字段就能拿到数据,字段对应的权限必须先在登录申请列表里声明,否则就算用户登录了应用,也没有对应数据的获取权限 - 受限权限没通过官方审核前,不要尝试用普通账号调试,Facebook会直接拦截请求,只有应用后台配置的测试账号能拿到测试数据
- 网上流传的“绕过权限限制拉取全量好友、用户帖子”的方法,本质都是违反平台规则的,很容易导致应用被永久封禁,不建议尝试
内容的提问来源于stack exchange,提问作者Mahmoud Al-Haroon

