如何通过API自动生成并延长Facebook政治广告库长期Access Token?
如何程序化自动生成并延长Facebook政治广告库API的访问令牌?
我按照指定步骤手动生成的访问令牌可以正常拉取政治广告数据,也能延长有效期,但现在想实现程序化自动生成,替代每60天手动操作的流程。手里有App ID和App Secret,但尝试用客户端凭证模式获取令牌后,既不能拉取数据,也无法延长,还报错。
当前尝试的代码:
response = requests.get(f"https://graph.facebook.com/oauth/access_token?client_id={app_id}&client_secret={app_secret}&grant_type=client_credentials")
用这个返回的app_token尝试延长时:
second_response = requests.get(f"https://graph.facebook.com/oauth/access_token?client_id={app_id}&client_secret={app_secret}&grant_type=fb_exchange_token&fb_exchange_token={app_token}")
得到的错误:
{'error': {'message': 'Application does not have permission for this action', 'type': 'OAuthException', 'code': 10, 'error_subcode': 2332004, 'is_transient': False, 'error_user_title': 'App role required', 'error_user_msg': 'You need to be assigned a role by the app owner to continue. Learn more at https://developers.facebook.com/docs/development/build-and-test/app-roles', 'fbtrace_id': '*******'}}
注:我已经完成政治广告库的身份验证,手动生成的令牌完全正常使用。
核心问题分析
你用client_credentials获取的是应用级令牌,但政治广告库API要求的是用户级令牌——该API需要绑定已完成身份验证的用户权限,应用级令牌没有关联用户的政治广告访问权限,因此触发权限错误。
程序化生成&延长令牌的正确流程
1. 先获取短期用户令牌(仅需一次手动授权)
需要先通过OAuth授权流程获取短期用户令牌(有效期2小时),这一步需要用户手动授权一次(之后可基于此生成长期令牌并程序化刷新):
# 构造授权URL,用户访问后会得到授权码 auth_url = f"https://www.facebook.com/v18.0/dialog/oauth?client_id={app_id}&redirect_uri={你的回调地址}&scope=ads_read&response_type=code" # 用户访问该URL并授权后,回调地址会得到code参数,用code兑换短期令牌 token_response = requests.get(f"https://graph.facebook.com/v18.0/oauth/access_token?client_id={app_id}&client_secret={app_secret}&redirect_uri={你的回调地址}&code={授权code}") short_lived_token = token_response.json()['access_token']
2. 转换为长期用户令牌(有效期60天)
用短期令牌兑换长期令牌,这一步可程序化执行:
long_lived_response = requests.get(f"https://graph.facebook.com/v18.0/oauth/access_token?client_id={app_id}&client_secret={app_secret}&grant_type=fb_exchange_token&fb_exchange_token={short_lived_token}") long_lived_token = long_lived_response.json()['access_token']
3. 程序化刷新长期令牌(有效期延长60天)
长期令牌到期前,可直接用它兑换新的长期令牌,无需用户手动授权:
refresh_response = requests.get(f"https://graph.facebook.com/v18.0/oauth/access_token?client_id={app_id}&client_secret={app_secret}&grant_type=fb_exchange_token&fb_exchange_token={long_lived_token}") new_long_lived_token = refresh_response.json()['access_token']
关键注意事项
- 确保你的Facebook账号已被添加为应用的管理员/开发者/测试员角色,解决报错中的"App role required"问题,可在应用后台「角色」页面操作。
- 授权时必须包含
ads_read权限,这是访问政治广告库API的必要条件。 - 回调地址需与应用后台配置的「有效OAuth重定向URI」完全一致。
内容的提问来源于stack exchange,提问作者jackstruck
相关产品推荐
相关产品推荐

