You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Facebook API (#100)权限缺失问题及程序化Token生成咨询

解答:Facebook Graph API 权限问题与Token生成方案

问题分析

你遇到的(#100) Missing permissions错误,核心原因是当前生成的Token权限不足:

错误信息:

{
      "error": {
        "message": "(#100) Missing permissions",
        "type": "OAuthException",
        "code": 100,
        "fbtrace_id": "A4vPClDlI__dFmxxhiVVGRG"
      }
    }

你之前用client_credentials模式生成的是应用级Access Token,这种Token仅拥有应用自身的基础权限,无法获取需要用户/系统授权的ads_read、insights_read权限——该模式本身不支持scope参数,所以传了也无效。


1. 如何在Python中生成带指定权限的Access Token

要获取带ads_read、insights_read权限的Token,必须走OAuth 2.0授权码流程(针对用户账户),或者使用系统用户Token(针对应用托管的广告账户),以下是两种方案的实现:

方案1:用户授权流程(适合访问个人广告账户)

该流程需要用户手动登录Facebook授权应用,步骤如下:

  1. 生成授权URL,引导用户授权
  2. 获取授权码,兑换短期Access Token(含权限)
  3. 可选:用短期Token兑换长期Refresh Token,用于后续刷新
import requests

# 1. 生成授权URL
def generate_auth_url(app_id, redirect_uri):
    scope = "ads_read,insights_read"
    auth_url = f"https://www.facebook.com/v18.0/dialog/oauth?client_id={app_id}&redirect_uri={redirect_uri}&scope={scope}&response_type=code"
    return auth_url

# 2. 用授权码兑换Access Token
def exchange_code_for_token(app_id, app_secret, redirect_uri, auth_code):
    url = "https://graph.facebook.com/v18.0/oauth/access_token"
    payload = {
        "client_id": app_id,
        "client_secret": app_secret,
        "redirect_uri": redirect_uri,
        "code": auth_code,
        "grant_type": "authorization_code"
    }
    response = requests.get(url, params=payload)
    return response.json()

# 3. 用短期Token刷新获取长期有效Token(可选)
def refresh_access_token(app_id, app_secret, refresh_token):
    url = "https://graph.facebook.com/v18.0/oauth/access_token"
    payload = {
        "client_id": app_id,
        "client_secret": app_secret,
        "refresh_token": refresh_token,
        "grant_type": "refresh_token"
    }
    response = requests.get(url, params=payload)
    return response.json()

# 使用示例
app_id = "XXXXXXXXXXXXXXX"
app_secret = "XXXXXXXXXXXXXXXXX"
redirect_uri = "https://your-redirect-uri.com/callback"  # 需在Facebook应用后台提前配置

# 第一步:打印授权URL,让用户访问并获取授权码
print("请访问以下URL完成授权:", generate_auth_url(app_id, redirect_uri))
# 用户授权后,从回调URL的query参数中提取code,传入第二步
auth_code = "用户授权后得到的code值"
token_data = exchange_code_for_token(app_id, app_secret, redirect_uri, auth_code)
print("短期Token信息:", token_data)
# 可选:刷新获取长期Token,避免频繁授权
if "refresh_token" in token_data:
    refreshed_token = refresh_access_token(app_id, app_secret, token_data["refresh_token"])
    print("刷新后的长期Token:", refreshed_token)

方案2:系统用户Token(适合后台批量管理广告账户)

如果你的应用需要管理多个广告账户,且不需要用户交互,建议创建系统用户(在Facebook商务管理平台中操作):

  1. 登录商务管理平台,创建属于应用的系统用户
  2. 为系统用户分配目标广告账户的ads_read、insights_read权限
  3. 直接生成系统用户的长期Access Token(有效期60天,可手动在平台刷新)

Python中直接使用该Token即可,无需额外生成代码,只需确保Token已配置好对应权限。


2. 提取广告账户Insights数据推荐使用的Token

根据场景不同,推荐两种Token:

  • 系统用户Access Token:优先推荐用于后台自动化任务,无需用户交互,权限稳定,适合应用管理多个广告账户的场景。
  • 用户长期Access Token:适合需要访问个人广告账户数据的场景,需配合Refresh Token定期刷新,确保权限有效。

注意:应用级Token(client_credentials生成)完全不适合提取Insights数据,因为它无法获取用户/广告账户的专属权限。


内容的提问来源于stack exchange,提问作者Kowshik Saravanan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:20:40