【免费下载链接】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.
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 仅限企业内部使用:
| 网站 | 为什么没有 API | travel-hacking-toolkit 的解法 |
|---|---|---|
| Southwest 航空 | 美国唯一不在任何 GDS/航班 API 中的大航司 | sw-faresDocker 镜像 |
| Chase Travel | 仅限 Sapphire 持卡人的积分门户 | chase-travelDocker 镜像 |
| Amex Travel | 仅限 Platinum 持卡人的积分门户 | amex-travelDocker 镜像 |
| VRBO | 被 Akamai Bot Manager 挡在 429 后面 | vrboDocker 镜像 |
| 美国航空里程账户 | AwardWallet 等聚合服务不支持 AA | aa-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)总结了这些"血泪教训":
- 先访问首页再跳转结果页——直接拼结果 URL 会被拦,首页"预热"能建立正常浏览会话;
- 用 URL 参数
fareType=POINTS切积分价,而不是去点页面上的 Points 开关(跨 iframe 点击不可靠); - 每次运行用全新的浏览器 profile,避免指纹累积触发风控;
- 从
[role='main']提取结果,而不是<main>——Southwest 页面里<main>是订票表单,选错容器会返回 0 条航班; - 先关掉 cookie 横幅,否则会挡住后续交互。
每次搜索大约 20 秒(首页预热 + React 渲染等待),换取的是全舱等票价表 + 积分价,输出为 Markdown 表格或 JSON,AI 拿到后直接算 CPP(每积分价值)和 Companion Pass 是否划算。
开箱即用:6 个公开 Docker 镜像一览
所有镜像都是公开的,docker pull即可,无需任何认证。完整清单见 README.md 的 Docker Images 一节:
| 镜像 | 对应技能 | 能力 |
|---|---|---|
patchright-docker | (基础层) | Patchright + Chromium + Xvfb,其余镜像都基于它 |
sw-fares | southwest | 票价/积分价查询、降价监控 |
aa-miles-check | american-airlines | AAdvantage 余额 + 精英会籍 |
chase-travel | chase-travel | UR 积分门户查机票/酒店、Points Boost |
amex-travel | amex-travel | MR 积分门户、IAP 折扣、FHR/THC |
ticketsatwork | ticketsatwork | 企业福利门户,常比积分门户便宜 10-30% |
sutochno/vrbo | vrbo | 俄语公寓搜索 / 整屋度假租赁 |
安装工具包时,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 网站自动化"提供了一个可以直接抄的参考架构:
- Patchright解决指纹识别——反检测的 Playwright 分叉;
- Docker + Xvfb解决 headless 识别——虚拟显示器让浏览器以 headed 模式隐形运行;
- profile 卷挂载 + 一次性人工登录解决登录态——2FA 做一次,信任长期有效;
- 黑名单 + 只读设计划清安全边界——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.
相关推荐
如何用 OpenHuman 的浏览器与计算机控制工具自动化没有 API 的网站操作
如何用 OpenHuman 的浏览器与计算机控制工具自动化没有 API 的网站操作 有些网站没有 API,也没有现成的集成可以对接——登录后台导出报表、在表单里
人工智能AI Agent多智能体Agent 编排工具调用桌面应用没有公开 API 也不怕:如何用 API Anything 从一句意图自动测绘整个网站
没有公开 API 也不怕:如何用 API Anything 从一句意图自动测绘整个网站 很多网站早就关闭了公开 API(比如 Goodreads 在 2020
浏览器自动化是如何被检测的?Patchright揭秘Runtime.enable与Console.enable两大泄露点
浏览器自动化是如何被检测的?Patchright揭秘Runtime.enable与Console.enable两大泄露点 Patchright 是一个 Play
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考