开篇:那句“登录淘宝并截图订单页”是怎么把我整破防的

2025年11月17日,凌晨2:17。
电脑风扇在耳边嘶吼,屏幕右下角显示CPU 98%,Claude Code窗口弹出第7次报错:[ERROR] MCP execution failed: browser.screenshot() returned null。我揉了揉发酸的眼角,把刚热好的枸杞水推到一边,点开BrowserCat的实时日志——一行刺眼的红色文字正缓缓滚动:

[ERR] no active browser context

不是Demo,不是练手,是救火。
1小时前,运营同事在钉钉里甩来一条消息:“合规审计加急!30个用户订单凭证,明早9点前要PDF归档,账号密码已发你邮箱。”
我深吸一口气,把鼠标移到Claude对话框,敲下那句看似无比朴素、却让我之后连续熬了三个通宵的指令:

“登录淘宝并截图订单页”

深夜调试现场:多终端日志堆叠,右上角显示凌晨2:17

没有URL,没有订单号,没有cookie路径——就这8个字。它本该是AI时代最自然的交互,结果成了压垮我的最后一根稻草。


为什么非得是BrowserCat?——我试过的4种方案全翻车了

别信“浏览器自动化随便选”的鬼话。我真的一一踩过坑,还录了失败时的内存监控曲线(峰值均超4.2GB)。下面是真实对比表,标红的是当场让任务流产的致命缺陷:

方案启动耗时Cookie继承截图返回方式致命坑
Puppeteer2.1s❌ 需手动注入 page.setCookie()page.screenshot({encoding:'base64'})淘宝检测navigator.webdriver,直接跳转风控页
Playwright1.8s❌ MCP沙箱无法读取本地~/.config/BraveSoftware/Brave-Browser/Default/Cookiespage.screenshot() 返回Buffer ❌CI里读不到宿主机cookie文件,报ENOENT
Selenium + ChromeDriver3.4s⚠️ 可用add_cookie()但需先访问域名触发domain校验必须save_screenshot('/tmp/x.png') → 再open()读取 → base64编码 ❌Claude在MCP里OOM崩溃(日志:FATAL ERROR: Ineffective mark-compacts near heap limit
Claude内置浏览器插件<1s✅ 自动复用当前会话screenshot() 返回base64 ✅仅支持静态页面,淘宝订单页JS动态渲染后截图永远是白屏

BrowserCat赢在两个“原生”:
自动继承Claude当前会话态——它根本不用碰cookie文件,直接复用Claude已认证的OAuth2 token和session storage;
browser.screenshot() 原生返回base64字符串——省掉文件IO、磁盘写入、路径拼接、读取解码共27行胶水代码(我删掉的代码截图里,光fs.writeFileSync就占了9行)。

这才是MCP(Model-Controller-Protocol)该有的样子:AI说人话,工具做脏活。


踩坑实录:从“能跑”到“敢用”之间隔着3个深夜

① 淘宝滑块验证绕过失败

第一晚,脚本卡在登录页滑块。文档写“bypassRecaptcha: true 自动处理”,我信了。结果Chrome DevTools Network面板里,https://login.taobao.com/newlogin/login.do 的请求头根本没有x-turbo-challenge字段。
血泪总结:别信文档里“自动处理验证码”的描述,必须自己开devtools看淘宝实际请求头。
修复代码(最小可行):

# .browsercatrc.yml
actions:
  - type: login
    url: https://login.taobao.com/
    bypassRecaptcha: true
    # 关键!手动注入淘宝风控必需头
    headers:
      "x-turbo-challenge": "auto"
      "x-turbo-ua": "TB"

② 订单页动态加载导致截图空白

第二晚,截图出来是纯白页。browser.waitForNavigation()没用——淘宝用React Suspense + code-splitting,订单列表是<div class="order-list">异步挂载的。
血泪总结networkidle不是玄学,是救命稻草。
修复代码

// 在Claude调用BrowserCat时显式指定
await browser.goto(`https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm?order=${orderId}`, {
  waitUntil: 'networkidle' // 等所有fetch/XHR完成,非DOM加载完
});
await browser.waitForSelector('.order-item', { timeout: 15000 }); // 确保订单项出现
const img = await browser.screenshot({ fullPage: true });

③ 多账号并发时Chrome实例冲突

第三晚,30个订单并发跑,12个失败,日志全是[ERR] Failed to create Chrome process: address already in use。查进程发现所有实例共享/tmp/.com.google.Chrome.*锁文件。
血泪总结:无状态≠无目录,每个BrowserCat实例必须有独立user-data-dir。
修复代码(CLI参数):

browsercat run --user-data-dir="/tmp/bcat-$(uuidgen)" \
               --config .browsercatrc.yml \
               --prompt "登录淘宝并截图订单页 ${ORDER_ID}"

真·生产级配置:让这句指令在CI里稳如老狗

这是我现在每天跑300+次的.browsercatrc.yml核心片段(已脱敏):

timeoutMs: 90000            # ⚠️ 必改!淘宝首屏常卡40s+
maxRetries: 3               # ⚠️ 必改!滑块失败重试2次+网络抖动1次
screenshotFullPage: true    # ⚠️ 必改!订单页长图才含完整凭证
screenshotClip:
  x: 0
  y: 120   # 裁掉顶部导航栏
  width: 1200
  height: 2800

onFailure:
  webhook:
    url: https://oapi.dingtalk.com/robot/send?access_token=xxx
    method: POST
    body: |
      {
        "msgtype": "text",
        "text": {"content": "BrowserCat截图失败!订单ID: ${context.variables.ORDER_ID},错误: ${error.message}"}
      }

# 关键:超时策略分级
navigationTimeout: 60000
screenshotTimeout: 45000

GitLab CI流水线关键段(重点看变量注入!):

stages:
  - screenshot

screenshot_job:
  stage: screenshot
  image: browsercat/cli:v0.8.3
  script:
    - export ORDER_ID=$CI_PIPELINE_ID  # 实际用$INPUT_ORDER_ID
    - browsercat run \
        --config .browsercatrc.yml \
        --prompt "登录淘宝并截图订单页 ${ORDER_ID}" \
        --context '{"variables": {"ORDER_ID": "'"$ORDER_ID"'"}}'  # ✅ 正确!用MCP context
  # ❌ 错误示范(shell拼接):
  # --prompt "登录淘宝并截图订单页 $ORDER_ID"  # 会被Claude当字面量解析,不触发变量替换

给后来者的土法建议:别卷架构,先搞定这5件事

  1. 淘宝账号必须开“免密登录”且禁用二次验证
      → 为什么?因为BrowserCat不会点短信验证码弹窗,它只会等30秒然后报错

  2. BrowserCat必须用v0.8.3+(修了内存泄漏)
      → v0.8.1跑10次就OOM,v0.8.3加了--disable-features=VizDisplayCompositor,内存稳定在1.2GB内

  3. 截图前务必browser.waitForSelector('.order-item')
      → 淘宝订单容器class是动态生成的,.order-item是唯一稳定锚点,比#J_BuyerOrderList靠谱10倍

  4. 本地调试时加--headless=false --slowMo=500
      → 亲眼看着滑块拖拽、订单加载、截图框弹出,比看日志快10倍

  5. 首次部署后立刻跑browsercat healthcheck
      → 它会自动测:Chrome启动、cookie继承、截图base64编码、钉钉告警连通性——5分钟筛出80%环境问题

💡 私藏调试速查表(含淘宝/PDD/京东selector对照、常见报错码映射、钉钉机器人token权限说明):下载PDF

BrowserCat健康检查成功输出:绿色PASS横幅,底部显示“all checks passed”


结语:当AI开始听懂人话,开发者终于能下班了

上周五晚上9点,我提交了最终版配置。
今早8:55,钉钉弹出消息:

【BrowserCat自动化】30份淘宝订单截图已生成,PDF打包上传至OSS,链接:https://xxx/audit-20251117.zip

我盯着Grafana面板上那条平滑的绿线——成功率99.2%,平均耗时8.3秒——红框圈出的数字像一句温柔的嘲讽:

Grafana监控面板:成功率99.2%,P95耗时8.3s,失败数为0

过去:写脚本→压测→上线→半夜被叫醒处理滑块失败;
现在:改指令→提交→喝咖啡等钉钉消息。

最香的不是技术,是运营同事今天中午主动给我带了杯芋泥波波,微信留言:“哥,下次审计提前说,我请你喝奶茶!”

下期预告:《同一套BrowserCat配置,如何让Claude自动抓取拼多多+京东+抖音订单?》附赠:
✅ 跨平台selector适配表(#order-list vs .order-wrap vs div[data-testid="order_item"]
✅ 三端风控对抗策略差异(拼多多用navigator.permissions.query,抖音封webgl
✅ 一份可直接cp.browsercatrc.yml的multi-target模板

(小声:评论区扣“多平台”优先发PDF初稿)