Python调用Facebook Marketing API出现Invalid OAuth access token错误求助
解决Facebook Marketing API的"Invalid OAuth access token"错误
你遇到的问题主要有两个核心原因,我来逐个帮你拆解并解决:
1. 错误拆分了应用访问令牌(App Access Token)
Facebook返回的应用访问令牌格式是xxxxxx|yyyyyy,这个完整字符串就是有效的令牌,但你代码里把它拆成了后半段yyyyyy,这直接导致传入了无效的令牌值。
先修正你的get_app_access_token函数,直接返回完整的access_token即可:
def get_app_access_token(app_id, app_secret): args = {'grant_type': 'client_credentials', 'client_id': app_id, 'client_secret': app_secret} f = urllib2.urlopen("https://graph.facebook.com/oauth/access_token?" + urllib.urlencode(args)) resp = json.loads(f.read()) # 直接返回完整的access_token,不要做拆分操作 return resp["access_token"]
2. 应用访问令牌无权访问广告账户数据
就算你修正了令牌格式,应用访问令牌(App Access Token)本身也没有权限读取广告账户的具体数据——广告账户属于用户私有资源,必须使用用户访问令牌(User Access Token),且该令牌需要用户授权你的应用获得以下核心权限:
ads_management:用于读写广告相关数据business_management:(可选)如果你的广告账户归属商务管理平台(BM)
获取用户访问令牌的具体步骤:
- 先在Facebook开发者后台,给你的应用添加
Facebook Login产品,配置有效的重定向URI(本地测试可以用http://localhost:8000/callback这类地址)。 - 构造授权URL引导用户授权(替换
{APP_ID}和{REDIRECT_URI}为你的实际信息):
https://www.facebook.com/v18.0/dialog/oauth?client_id={APP_ID}&redirect_uri={REDIRECT_URI}&scope=ads_management,business_management&response_type=token
- 用户授权后,会在重定向URI的哈希参数中得到短期用户访问令牌;如果需要长期令牌(有效期60天),可以调用API交换:
# 用短期令牌交换长期令牌 args = {'grant_type': 'fb_exchange_token', 'client_id': APP_ID, 'client_secret': SECRET_KEY, 'fb_exchange_token': 'SHORT_LIVED_TOKEN'} f = urllib2.urlopen("https://graph.facebook.com/oauth/access_token?" + urllib.urlencode(args)) resp = json.loads(f.read()) long_lived_token = resp["access_token"]
- 最后用用户访问令牌初始化API:
api = FacebookAdsApi.init(APP_ID, SECRET_KEY, long_lived_token)
额外注意事项:
- 确保你的Facebook账号是目标广告账户的管理员、编辑或分析师角色,否则即使令牌正确也会被拒绝访问。
- 测试阶段可以用Facebook的访问令牌调试器来验证令牌的权限和有效期。
内容的提问来源于stack exchange,提问作者Marion




