无法访问AdSense API技术求助:已尝试服务账号及OAuth认证
我之前搭建AdSense营收追踪机器人的时候,也踩过这些认证的坑,给你整理了几个关键的排查点和正确配置步骤,应该能帮你解决问题:
一、优先排查服务账号认证的核心遗漏点
服务器到服务器场景下,服务账号其实是更适配的方案,很多人失败都是因为漏了关键步骤:
- 必须关联AdSense账号授权:服务账号本身没有AdSense权限,你得登录AdSense后台,把服务账号的邮箱(格式一般是
xxx@xxx.iam.gserviceaccount.com)添加到AdSense的访问权限里,角色至少设为“查看者”。这一步是最容易被忽略的,直接导致认证通过但权限不足。 - 确认API启用正确:去Google Cloud控制台,务必确认「AdSense Management API」已经被启用(注意别和其他类似名称的API搞混)。
- 密钥文件与Scope配置:使用服务账号的JSON密钥文件时,代码里要指定正确的只读Scope:
https://www.googleapis.com/auth/adsense.readonly,避免请求不必要的权限引发错误。
二、OAuth服务器到服务器的正确配置(如果坚持用OAuth)
如果一定要用OAuth实现无交互的服务器到服务器调用,核心是持久化刷新令牌:
- 获取离线访问权限:在首次授权请求里必须加上
access_type=offline和prompt=consent参数,这样才能拿到长期有效的刷新令牌。很多人没加这个,导致只能拿到短期访问令牌,过期后直接失效。 - 安全存储刷新令牌:把首次授权得到的刷新令牌加密存储到你的内部数据库或配置文件里,之后每次调用API前,用刷新令牌换取新的访问令牌,无需重复走授权流程。
- 选对OAuth客户端类型:创建OAuth客户端ID时,选择「桌面应用」或「其他」类型,不要用Web应用——服务器到服务器场景不需要前端回调。
三、常见错误快速排查
- 403权限错误:先检查服务账号是否在AdSense后台被授权,或者OAuth令牌的Scope是否包含
adsense.readonly。 - 401未授权:服务账号密钥文件路径是否正确?OAuth的刷新令牌是否超过6个月未使用(Google会自动回收长期未用的刷新令牌,需要重新授权一次)。
- 调用失败无明确提示:去Google Cloud控制台的API配额页面,确认你的项目没有超过AdSense API的调用限额。
四、Python示例代码(服务账号版)
from google.oauth2 import service_account from googleapiclient.discovery import build # 配置参数 SCOPES = ['https://www.googleapis.com/auth/adsense.readonly'] SERVICE_ACCOUNT_KEY_PATH = '/path/to/your/service-account-key.json' ADSENSE_ACCOUNT_ID = 'pub-XXXXXXXXXXXXXXXX' # 初始化认证 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_KEY_PATH, scopes=SCOPES ) # 构建API客户端 adsense_service = build('adsense', 'v2', credentials=credentials) # 调用API获取营收报表示例 report_response = adsense_service.accounts().reports().generate( accountId=ADSENSE_ACCOUNT_ID, startDate='2024-01-01', endDate='2024-01-31', metrics=['EARNINGS'], dimensions=['DATE'] ).execute() # 处理并存储数据到你的内部数据库 # 这里替换成你自己的数据库写入逻辑 print(report_response)
内容的提问来源于stack exchange,提问作者tmarois
相关产品推荐
相关产品推荐

