上周把腾讯开源的 BrowserSkill 接进日常发布流水线,第一个撞上的问题不是扩展装不上,也不是bsk找不到标签页,而是:登录态复用这条路跑通了,模型侧的 Key 还散在 Claude Code、Codex、WorkBuddy 三个地方的配置文件里,谁在烧 token、烧了多少,完全没有账。BrowserSkill 解决的是「AI 怎么用你已经登录的浏览器」,但它不解决「模型入口怎么统一、用量怎么归集」——这部分我是直接甩给 TaoToken 的,官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=browser_login_reuse ,拿一个 Key、一个 Base URL,把几个 Agent 的模型入口全部收口到 https://taotoken.net/api ,后面再看用量就清爽多了。这篇把两条链路拆开写:上半段是登录态复用的完整流程,下半段是模型入口切换和 Token 用量视图,都是可以直接照着做的步骤。
1. 先让 Agent「看见」你已登录的浏览器:BrowserSkill 的安装与自检
BrowserSkill 的设计目标很明确:不去新建一个从零开始、风控眼里全是可疑特征的浏览器实例,而是借用你本机那个已经登录、已经被平台信任的浏览器会话。它的落地方式是两个本地组件搭档——一个bskCLI(同时承担命令行入口和本地守护进程的角色),以及一个浏览器扩展。扩展负责和你真实的 Chrome / Edge 建立受控通道,CLI 负责把「借标签页」这件事暴露成 Agent 能调用的命令。
安装顺序别搞反。先把 CLI 装到本机并确认环境变量生效,再去浏览器里加载扩展,最后让两者握手。装完新的 shell 会话,先做版本确认:
# 确认 bsk 已进入 PATH(装完记得重开终端或 source 一下配置文件) bsk --version # 查看本地守护进程状态,正常会输出 pid 和监听地址 bsk status # 一键自检:CLI、守护进程、扩展通道、浏览器版本逐项体检 bsk doctorbsk doctor是这套东西里最有价值的一个命令。它会告诉你三件事:CLI 有没有装对、守护进程有没有起来、扩展有没有和守护进程连上。实测中最常见的失败形态就是「CLI 装好了,扩展也装了,但 doctor 里扩展那一项是红的」——原因通常是扩展加载后没刷新,或者浏览器不是它当前支持的 Chromium 系版本。官方支持面里的操作系统是 macOS(Apple Silicon 与 Intel 双架构)、Linux(x64 / ARM64)、Windows x64;浏览器明确覆盖 Chrome 和 Edge,其余 Chromium 内核的浏览器大多能用但不保证,Firefox 还在计划中。如果你的机器是国产 Linux 发行版,装之前先确认 glibc 版本别太老,否则 CLI 二进制会直接跑不起来。
扩展加载完之后,可以看一下当前可借用的上下文列表,这一步相当于握手的最终验证:
# 列出当前浏览器里可被借用的窗口与标签页 bsk tabs list # 输出通常包含 tab-id、标题、URL 域名和是否处于登录态可识别状态 # 如果这里为空,先回去跑 bsk doctor,不要往下硬走Agent 侧的接入其实不需要什么专门的插件。Cursor、Claude Code、Codex、WorkBuddy 这些工具只要能执行 shell 命令,就能调bsk。也就是说,你在 Claude Code 里说一句「用 bsk 把我 Chrome 里那个已经登录的 CSDN 后台标签页打开,导出最近七天的数据」,它会走 shell 调你的 CLI,剩下的交给守护进程和扩展。
2. 登录态复用流程拆解:借用、干活、归还、人工接管
把 BrowserSkill 的运行时拆成四个动作,理解成本会低很多。
借用:Agent 通过bsk显式指定要操作哪个标签页。它不是接管你整个浏览器,而是拿到某一个上下文的操作权。这一步是显式的,必须给目标,不存在「AI 偷偷在你浏览器里点来点去」这种情况。
干活:AI 在浏览器里执行的是真实的页面操作。因为底层是你已经登录、已经有正常使用痕迹的会话,遇到风控的概率显著低于任何新建环境。这一点在内容平台后台、企业 SaaS 后台这类场景里体现得特別明显——它们对新设备、新 IP、新 Cookie 的敏感度远高于对操作行为的敏感度。
归还:任务结束显式释放标签页。这个动作建议写进你的流程脚本里,别指望 Agent 每次都记得。
人工接管:撞上验证码、扫码登录、二次确认弹窗这类只有人能过的关卡时,任务会停在那个节点等你。你处理完,它继续往下跑,而不是整个任务原地失败重来。
把这四个动作落成命令,大概是这样的形态:
# 1) 借用目标标签页并执行一个具体任务 bsk run --tab <tab-id> --task "进入后台订单页,导出最近 7 天数据到本地 CSV" # 2) 需要人工介入时,CLI 会把控制权交回,处理完执行恢复 bsk resume --task <task-id> # 3) 无论成功失败,收尾都要归还 bsk tabs release <tab-id> # 4) 查看当前所有被借用的标签页,防止残留占用 bsk tabs list --borrowed如果你做的是内容发布流水线,这个流程的价值会立刻显出来。以前 AI 干到登录那一步就得等人扫码,流程被迫切成「AI 跑一半 — 人工接管 — 再交回 AI」三段,中间上下文重建的成本极高。现在变成 AI 一路往下走,只在真正必须人工介入的节点停下来喊你一次。省下来的不是扫码那几十秒,而是整个流程被打断又重建的隐性开销。
和无头浏览器方案的区别也值得说清楚。Playwright、Puppeteer 那一套是新建浏览器实例,指纹、Cookie、登录态全是新的;BrowserSkill 是借用你现有的实例,指纹、Cookie、登录态全是旧的、被平台信任过的。前者适合抓公开数据、跑回归测试这类不需要登录态的场景;后者专攻「必须登录、但登录态很难伪造」的场景。两者并行不冲突——公开数据用无头快速抓,登录态环节交给 BrowserSkill 借真实会话。
3. 模型入口统一:Claude Code、Codex、CC Switch 三件套怎么落到 TaoToken
BrowserSkill 只负责浏览器执行层,真正消耗 token 的是旁边那个做推理的 Agent。链路一旦跑通,你很快就会遇到第二个问题:Claude Code 用的是 A 家的 Key,Codex 用的是 B 家的,WorkBuddy 里还塞了第三份,月底想算清楚「跑一次自动发布烧了多少 token」根本算不出来。
收口的方式是把所有 Agent 的模型入口指向同一个网关。先去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=model_entry 拿到 Key,Base URL 统一填https://taotoken.net/api,然后按工具各自的配置方式分别写。
Claude Code:走~/.claude/settings.json的 env 段。Claude Code 读的是ANTHROPIC_*这一套变量,配置长这样:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }如果你不想改全局配置,也可以在项目目录下放一份.claude/settings.local.json,只对当前项目生效。改完之后重开一个终端会话,让环境变量重新加载,然后随便跑一句对话验证链路通不通。注意ANTHROPIC_AUTH_TOKEN和ANTHROPIC_API_KEY在不同版本里读的变量名略有差异,哪个生效以你本地版本的文档为准,两个都写上不会冲突。
Codex:走~/.codex/config.toml,千万不要套ANTHROPIC_*。这是最容易踩的坑——Codex 用的是自己的 provider 机制,配置结构完全不同:
model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "responses"然后在你自己的 shell 配置里把 Key 导进去:
# ~/.zshrc 或 ~/.bashrc export TAOTOKEN_API_KEY=YOUR_API_KEYenv_key填的是「环境变量的名字」,不是 Key 本身,这一点经常有人写错。把环境变量重新加载之后,用一次最简单的推理请求验证 Codex 能不能通。
CC Switch:记住三件套就够了。如果你用 CC Switch 这类工具在多个供应商之间切换,本质上它改的就是三样东西——Base URL、API Key、模型名。对应到 TaoToken 就是:
Base URL : https://taotoken.net/api API Key : YOUR_API_KEY 模型名 : 按各工具实际支持的模型标识填写三件套对齐之后,无论你在 Claude Code、Codex 还是别的兼容客户端之间怎么切,走的都是同一个出口,用量天然归集到同一个账本里。这也是为什么建议先统一网关、再跑 BrowserSkill 的批量任务——顺序反过来的话,你的第一次自动化压测数据就是一笔糊涂账。
如果你是多 Agent 并行跑浏览器任务的重度用户,可以直接看 Coding Plan 那一档:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=model_entry ,它在按量之外给了更稳定的额度口径,适合长时间挂着的自动化流水线。
4. Token 用量视图:BrowserSkill 跑一轮到底烧了多少
统一网关之后,「用量视图」这件事才真正可做。思路是三层归因。
第一层,按 Key 归因。不要所有 Agent 共用一把 Key。给 Claude Code、Codex、WorkBuddy 各建一把,命名清晰:
browser-skill-claude-code browser-skill-codex browser-skill-workbuddy在 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=usage_view 建 Key 的时候顺手把名字写清楚,后面看用量就不用猜了。每把 Key 还能独立吊销,某个 Agent 出问题的时候不至于把其他链路一起停掉。
第二层,按任务归因。如果你的一条流水线里既有「抓取页面」又有「生成文案」还有「发布动作」,这些环节消耗的 token 量差异极大。做法是每个环节用不同的 Key,或者在调用层记录开始时间戳,把这批请求和任务 ID 关联起来。BrowserSkill 的 CLI 输出里带上任务 ID,配合网关侧的时间窗口,就能粗粒度地切出「导出数据」这类纯浏览器操作花了多少推理成本。
第三层,按时间窗口看趋势。设定一个固定周期,比如每天固定时间拉一次当日用量,观察的是斜率而不是绝对值。如果某天 BrowserSkill 的任务没变多,但 token 消耗突然翻倍,八成是 Agent 在某个页面上陷入了重试循环——比如页面结构变了,它反复尝试定位元素,每次失败都要发起一轮推理。这种问题从浏览器侧看不出来,从用量曲线上看一目了然。
本地也可以做一个轻量的记录脚本,把关键指标落盘:
#!/usr/bin/env bash # 每天记录一次当日模型用量快照,便于对比异常波动 SNAPSHOT_DIR="$HOME/.taotoken-snapshots" mkdir -p "$SNAPSHOT_DIR" STAMP=$(date +%Y%m%d) echo "date=$STAMP" >> "$SNAPSHOT_DIR/$STAMP.log" echo "claude_code_key=browser-skill-claude-code" >> "$SNAPSHOT_DIR/$STAMP.log" echo "codex_key=browser-skill-codex" >> "$SNAPSHOT_DIR/$STAMP.log" # 具体用量数值从控制台导出后追加到本文件,做长期对比脚本本身不复杂,关键是把「按 Key 分账」这个习惯固化下来。跑上两周,你就知道自己的浏览器自动化流水线大概是什么成本量级,值不值得继续扩大规模。
5. 四类高频报错与定位路径
把实际踩过的坑按症状整理一遍,遇到问题先对号入座。
症状一:bsk: command not found。安装脚本跑完了但当前 shell 找不到命令。原因通常是 PATH 没刷新,安装脚本改动的是你的 shell 配置文件,当前会话不会自动生效。
# 重新加载配置,或者干脆重开一个终端 source ~/.zshrc which bsk如果which还是空的,去安装输出里找它实际落盘的目录,手动加进 PATH。
症状二:扩展显示已连接,但bsk tabs list是空的。这是最高频的一类。三个排查方向:扩展在当前浏览器配置文件下有没有真正启用、扩展有没有拿到目标站点的访问权限、以及浏览器窗口是不是被最小化或被系统挂起了。Chromium 系浏览器在窗口完全不可见时,标签页枚举行为会变得不稳定,先把窗口还原再试。
症状三:Agent 调bsk超时。守护进程睡了,或者上一次任务的标签页没归还导致锁没释放。
bsk status bsk tabs list --borrowed bsk tabs release <tab-id> # 把残留的借用清掉 bsk doctor养成在流程脚本末尾加release的习惯,能省掉一大半这类问题。
症状四:模型侧返回401/invalid api key。从网关侧看,99% 是这三件事:Key 复制的时候尾部带了空格或换行;环境变量在子进程里没继承到,尤其是从 IDE 里起的终端;Codex 的env_key填成了 Key 本身而不是环境变量名。
# 确认环境变量在当前 shell 里确实存在,且没有多余空白 echo -n "$TAOTOKEN_API_KEY" | wc -c # 确认 Claude Code 走的是它自己那套变量 echo -n "$ANTHROPIC_AUTH_TOKEN" | wc -c顺便说一个容易被忽略的点:Claude Code 和 Codex 的变量体系是分开的,把ANTHROPIC_*塞进 Codex 的配置里,或者反过来,结果都是连不通,但报错信息往往指向别处,排查起来很绕。配之前先确认工具,再确认变量名。
6. 把边界写进脚本:哪些环节必须留给人
复用真实登录态意味着 AI 拿到的权限就是你自己账号的权限。它的设计是克制的——必须显式借用、用完归还、敏感步骤请求接管——但这不等于可以无脑托管。
几个建议写进流程约束的点:涉及资金操作的页面,脚本里加一道显式确认,不要让它自动提交;涉及对外发布的内容,发布前保留一次人工预览;给不同的账号体系用不同的浏览器配置文件,工作账号和个人账号不要共用同一个登录态,避免误操作跨域。BrowserSkill 给的是「可见 + 可接管」,不是「完全托管」,这个定位要摆正。
另外一个实际建议:先用一个低风险的账号跑通整条链路,确认借用、干活、归还、人工接管四个动作都符合预期,再逐步扩到主力账号。链路本身不难,难的是对边界保持清醒。
7. 收尾:两条链路,一个账本
BrowserSkill 补上的是浏览器自动化里最缺的那块拼图——不是「怎么点按钮」,而是「怎么让 AI 用上一个被平台信任的会话」。而模型入口统一补上的是另一半:不管你旁边挂的是 Claude Code、Codex 还是别的 Agent,出口只有一个,用量只有一本账。
按这个顺序落地会比较顺:先去 https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=browser_skill_chat 用模型对话把 Base URL 和 Key 的连通性验一遍,确认最基础的推理请求能通;接着按你的调用量选 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=browser_skill_plan 里的额度档位;然后到 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=browser_skill_key 按 Agent 分别建 Key,把名字写清楚;最后照着 https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=browser_skill_doc 把 Claude Code 那套settings.json配到位,Codex 那边用config.toml单独写一份。
配置全部落盘之后,再回到bsk doctor跑一次自检。两边都绿,你的浏览器自动化流水线才算真正闭环——AI 借你的登录态干活,你借用量视图看住成本。