Chrome 扩展调 Google Ads API,我把令牌刷成了定时任务
先给上下文:一个跨境团队在伊斯坦布尔和布尔萨各有一间投放工作室,Chrome 扩展是内部工具,装了约 70 台机器,跑 Manifest V3,Chrome 版本在 126 到 128 之间。扩展只做一件事:把当天各账户的预算改动汇总成一张表,通过 Google Ads API 的 mutate 接口批量写回,单次请求大概 80 到 200 个 operation。上个月开始,每天早上 9 点前后有一半机器报 401 UNAUTHENTICATED,重开浏览器就好,过一天又犯。
做法上我没有动扩展的鉴权主流程,而是把「拿令牌」这件事从页面挪出去。原因是 MV3 的 service worker 会被浏览器随时挂起,我之前把 access_token 存在 chrome.storage.session 里,挂起后恢复时读到的还是旧值,续期逻辑根本没被触发。现在改成:service worker 每次写请求前调一个 Cloud Run 上的小函数,函数用服务账号加域级委派换取短期令牌,扩展只拿结果,不碰 refresh_token。
async function getAccessToken() {
const r = await fetch('https://ads-token-xxxx.run.app/token', {
method: 'POST',
headers: { 'Authorization': 'Bearer ' + (await chrome.identity.getAuthToken({ interactive: false })).token }
});
const { access_token, expires_in } = await r.json();
return { token: access_token, ttl: expires_in };
}
服务端缓存按客户 ID 分片,过期前 5 分钟主动重取,避免 70 台机器同时打同一个 endpoint。代价是引入了一个有状态的服务,Cloud Run 最小实例我设成 1,不然冷启动会让第一台机器的请求多等两秒多;另外令牌的权限边界从「用户授予」变成「服务账号持有」,审计上要单独留日志。
哪里会失效:一是开发者令牌的配额按操作数算,批量写回如果一次塞 200 个 operation,容易被限流,我现在按 50 一批切开并加 300ms 间隔;二是有两台机器还在 Chrome 121,chrome.identity 在非交互模式下拿不到 token,只能提示用户重新登录;三是夏令时切换那周,土耳其时间和服务端 UTC 对不上,汇总表会少一天的数据,这个跟令牌无关,但每次都一起出现,很容易误判。
你们那边批量写回是按操作数切批,还是按账户切?我按 50 切之后偶尔还会撞限流,想看看别人的阈值。
0 条评论
还没有评论,写下第一条。