news 2026/10/30 4:40:43

没有公开API也能自动操作网站?travel-hacking-toolkit的Docker+Patchright浏览器自动化揭秘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
没有公开API也能自动操作网站?travel-hacking-toolkit的Docker+Patchright浏览器自动化揭秘

【免费下载链接】travel-hacking-toolkit

AI-powered travel hacking and search with cash, points, miles, and award flights. Drop-in skills and MCP servers for Claude, Codex, and OpenCode.

项目地址:https://gitcode.com/gh_mirrors/tr/travel-hacking-toolkit
点击查看免费下载

travel-hacking-toolkit是一个面向旅行套利(points/miles/award flights)的 AI 工具集,其中最硬核的设计之一是:用 Docker 容器 + Patchright 反检测浏览器自动化,让 AI 自动操作那些没有公开 API 的旅行网站——Southwest 航空、Chase Travel、Amex Travel、VRBO、美国航空里程账户等,全程无需人工点击,结果直接以 JSON 返回给 AI 分析。

本文带你看懂这套方案的三层设计:为什么普通爬虫不行、Docker 里的"隐形浏览器"是怎么跑起来的、以及登录态和安全边界如何处理。


没有公开 API 的网站,AI 拿什么查价?

旅行搜索生态里有一批"盲区"网站,它们要么根本不提供 API,要么 API 仅限企业内部使用:

网站为什么没有 APItravel-hacking-toolkit 的解法
Southwest 航空美国唯一不在任何 GDS/航班 API 中的大航司sw-faresDocker 镜像
Chase Travel仅限 Sapphire 持卡人的积分门户chase-travelDocker 镜像
Amex Travel仅限 Platinum 持卡人的积分门户amex-travelDocker 镜像
VRBO被 Akamai Bot Manager 挡在 429 后面vrboDocker 镜像
美国航空里程账户AwardWallet 等聚合服务不支持 AAaa-miles-checkDocker 镜像

对这类网站,直接发 HTTP 请求或用标准 Playwright 脚本,结局都一样:指纹暴露、headless 被识别、Bot Manager 返回429 Too Many Requests。以 VRBO 为例,官方说明写得很直白:plain HTTP、标准 Playwright、@playwright/mcp全部撞墙,只有 Patchright 能拿到 Akamai 的_abck风控 cookie(见 skills/vrbo/SKILL.md)。

第一层:Patchright,一个"反检测"的 Playwright 分叉

这些旅行网站都有反自动化检测,普通 Playwright 暴露的指纹特征(如navigator.webdriver标记)会被直接拦截。

Patchright是 Playwright 的一个无检测(undetected)分叉,核心作用是修补浏览器指纹,让自动化浏览器在风控系统眼里看起来和真人操作一样。

但它只解决了一半问题——这也是很多人照搬 Playwright 方案失败的原因:

⚠️这些网站同样识别 headless(无头)模式。即使用了 Patchright,如果headless=True,Southwest 依然会拦截。所以这些脚本必须以 headed 模式(headless=False)运行。

本地运行时这倒不是问题——屏幕上会短暂弹出一个 Chrome 窗口然后关闭。但如果你想在后台无人值守地跑(比如定时监控票价下跌),或者跑在没有图形界面的服务器上,窗口弹不出来,headless 又必死。

于是有了第二层设计。

第二层:Docker + Xvfb,一个"看不见的 headed 浏览器"

这是整套方案最精巧的一点:在容器里给浏览器配一块"虚拟显示器",让它以 headed 模式运行,但你的屏幕上什么都看不到。

每个 Docker 技能镜像都基于同一个基础镜像ghcr.io/borski/patchright-docker(Patchright + Chromium + Xvfb 预装层),容器启动时由 entrypoint 脚本做两件事(以 Southwest 为例,见 skills/southwest/scripts/entrypoint.sh):

Xvfb :99 -screen 0 1440x900x24 -nolisten tcp & export DISPLAY=:99
  • Xvfb(X virtual framebuffer)在容器内创建一个 1440x900 的虚拟显示;
  • Patchright 以headed 模式连接这块虚拟屏,网站看到的是"真实有人在看"的浏览器,反检测全部通过;
  • 你的机器上没有任何窗口弹出,完全后台化。

每个技能目录里的 Dockerfile 都只有几行,内容透明可查。例如 skills/southwest/Dockerfile 就是把 4 个脚本拷进基础镜像、指定entrypoint.sh作为入口,仅此而已——镜像里装了什么,打开 Dockerfile 一目了然。

第三层:脚本里"踩坑踩出来"的自动化细节

Docker 只解决了运行环境,真正让自动化稳定工作的是脚本里的实战技巧。以 Southwest 查价脚本 skills/southwest/scripts/search_fares.py 为例,官方 SKILL.md(skills/southwest/SKILL.md)总结了这些"血泪教训":

  1. 先访问首页再跳转结果页——直接拼结果 URL 会被拦,首页"预热"能建立正常浏览会话;
  2. 用 URL 参数fareType=POINTS切积分价,而不是去点页面上的 Points 开关(跨 iframe 点击不可靠);
  3. 每次运行用全新的浏览器 profile,避免指纹累积触发风控;
  4. 从[role='main']提取结果,而不是<main>——Southwest 页面里<main>是订票表单,选错容器会返回 0 条航班;
  5. 先关掉 cookie 横幅,否则会挡住后续交互。

每次搜索大约 20 秒(首页预热 + React 渲染等待),换取的是全舱等票价表 + 积分价,输出为 Markdown 表格或 JSON,AI 拿到后直接算 CPP(每积分价值)和 Companion Pass 是否划算。

开箱即用:6 个公开 Docker 镜像一览

所有镜像都是公开的,docker pull即可,无需任何认证。完整清单见 README.md 的 Docker Images 一节:

镜像对应技能能力
patchright-docker(基础层)Patchright + Chromium + Xvfb,其余镜像都基于它
sw-faressouthwest票价/积分价查询、降价监控
aa-miles-checkamerican-airlinesAAdvantage 余额 + 精英会籍
chase-travelchase-travelUR 积分门户查机票/酒店、Points Boost
amex-travelamex-travelMR 积分门户、IAP 折扣、FHR/THC
ticketsatworkticketsatwork企业福利门户,常比积分门户便宜 10-30%
sutochno/vrbovrbo俄语公寓搜索 / 整屋度假租赁

安装工具包时,scripts/setup.sh 会根据你选择的工具自动docker pull对应镜像,首次使用自动拉取,基本无感。

实战:3 条命令查到 Southwest 积分票价

# 1. 拉取镜像 docker pull ghcr.io/borski/sw-fares:latest # 2. 查现金价(无需登录) docker run --rm ghcr.io/borski/sw-fares \ --origin SJC --dest DEN --depart 2026-05-15 # 3. 加 --points 查积分价,加 --json 输出给 AI docker run --rm ghcr.io/borski/sw-fares \ --origin SJC --dest DEN --depart 2026-05-15 \ --return 2026-05-18 --points --json

--json参数是这套设计与 AI Agent 集成的关键:容器 stdout 吐出的 JSON 被 AI 直接解析,再结合 skills/trip-calculator/SKILL.md 里的 CPP 公式,一句话就能回答"这趟用积分划不划算"。

登录态如何持久化:profile 挂载 + 一次人工登录

查价可以免登录,但查里程余额、查已订行程的降价就需要登录账号。这里有两个工程问题:2FA 怎么办?Cookie 过期怎么办?

方案:把浏览器 profile 目录挂载到容器外,登录一次,长期复用。

以 Chase Travel 为例,运行命令里多一个卷挂载(见 skills/chase-travel/SKILL.md):

docker run --rm -v ~/.chase-travel-profiles:/profiles \ -e CHASE_USERNAME -e CHASE_PASSWORD \ ghcr.io/borski/chase-travel ...
  • 首次运行需要人工完成一次 2FA(SMS 或 App 推送,脚本会自动检测账号支持哪种方式并走对应路径);
  • 之后设备信任关系保存在宿主机 profile 目录里,后续运行自动跳过 2FA,容器里全自动。

Amex Travel 的登录门带验证码,完全自动化不可能,所以项目提供了一个"人机协作"脚本:在本地机器(不能是 Docker,没有可见窗口)上运行 skills/amex-travel/scripts/refresh_login.py,它会打开真实 Chrome 窗口,你手动完成密码 + 验证码 + "信任此设备",脚本检测到登录成功后把 session cookie 存盘——之后 Docker 里的所有运行都直接复用这份 cookie。

🔒 注意:Amex 脚本会明确拒绝在容器内运行refresh_login.py(检测到/.dockerenv直接报错退出),因为无人交互的容器里你没法完成验证码。

安全边界:只读、绝不代你订票

自动登录账号操作,最担心的就是"AI 手滑点了购买"。这套技能在源码层面做了硬性防护,以 Southwest 的查降价脚本为例(skills/southwest/SKILL.md):

  • 只读原则:脚本只登录、查订单位置、读改签差价页面,零点击于任何改签/取消/确认按钮;
  • 危险按钮黑名单:DANGEROUS_LABELS拦截 "change this flight"、"confirm"、"cancel"、"book"、"purchase" 等文案,每次点击前都过一遍is_dangerous_click()检查;
  • 全工具统一约束:所有浏览器技能只"找结果、给链接",不完成任何购买。

配套地,纯逻辑部分(URL 构造、2FA 方式选择、429 拦截检测等)都有离线单元测试,不需要真实浏览器即可运行,例如 skills/chase-travel/tests/test_2fa_method.py 和 skills/vrbo/tests/test_search_vrbo.py。

本地运行 vs Docker 运行,怎么选?

维度本地(Python 直跑)Docker(推荐)
依赖需pip install patchright并下载 Chromium一条docker pull搞定
窗口短暂弹出 Chrome 窗口无窗口,Xvfb 虚拟屏后台运行
服务器/定时任务❌ 需要图形界面✅ 完全无人值守
调试加--debug看现场看 stdout / JSON
网络指纹宿主机网络容器网络栈(被标记时可换道重试)

结论:调试用本地,生产用 Docker。

小结

travel-hacking-toolkit 给"无公开 API 网站自动化"提供了一个可以直接抄的参考架构:

  1. Patchright解决指纹识别——反检测的 Playwright 分叉;
  2. Docker + Xvfb解决 headless 识别——虚拟显示器让浏览器以 headed 模式隐形运行;
  3. profile 卷挂载 + 一次性人工登录解决登录态——2FA 做一次,信任长期有效;
  4. 黑名单 + 只读设计划清安全边界——AI 查价监控,人做最终决定。

四层叠加,AI 就能稳定地替你在没有 API 的世界里查价、盯降价、算积分价值,而这正是旅行套利里最值钱、也最容易被风控拦下的那部分数据。

【免费下载链接】travel-hacking-toolkit

AI-powered travel hacking and search with cash, points, miles, and award flights. Drop-in skills and MCP servers for Claude, Codex, and OpenCode.

项目地址:https://gitcode.com/gh_mirrors/tr/travel-hacking-toolkit
点击查看免费下载

相关推荐

上一篇:Skill 生态大爆发:no-ai-slop 登顶背后,Claude Code 技能市场正在复刻 App Store
下一篇:剪映一更新,自动化脚本就罢工?无头工具的“脆弱时刻”与我的救场方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/30 4:29:58

AI智能体运行状态异常监控告警实现方案

AI智能体运行状态异常监控告警实现方案# AI智能体运行状态异常监控告警实现方案 一、文档概述 1.1 业务背景 随着大模型驱动的AI智能体在自动化任务调度、智能问答、数据处理、流程执行等场景规模化落地&#xff0c;智能体离线卡死、推理超时、接口调用失败、资源占用过载、任务…

作者头像 李华
网站建设 2026/10/30 4:29:41

CSV 游标流式导出

推荐&#xff1a;方案 A — CSV 游标流式导出核心思路&#xff1a;不一次性加载&#xff0c;MySQL 游标分批取 → 写一行 → flush → 释放 → 下一批。while (true) {SELECT ... WHERE id > $lastId LIMIT 5000; ← 只取 5000 行│foreach → fputcsv($fp) …

作者头像 李华
网站建设 2026/10/30 4:25:04

Unitto时区换算工具使用指南:跨时区开会再也不算错时间

【免费下载链接】unitto &#x1f60e; Superior Calculator and Converter 项目地址&#xff1a; https://gitcode.com/gh_mirrors/un/unitto 点击查看 免费下载 Unitto 是一款开源的计算器与单位换算应用&#xff0c;它内置的时区换算功能能实时对比全球任意时区的时间&…

作者头像 李华
网站建设 2026/10/30 4:23:17

Android Studio_逆向

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华