关于 pp-airbnb
pp-airbnb 是驱动 airbnb-pp-cli 的技能,面向需要检索和分析 Airbnb、VRBO 房源的 Agent。它提供跨平台比价、直订价格发现及本地价格追踪,命令仅用于只读操作。
主要功能
- 01比较平台价格与直订费用
- 02跨 Airbnb 和 VRBO 规划行程
- 03查找同一房源的其他平台版本
- 04监控房源价格变化
- 05搜索房东名下房源
适用场景
- 01寻找房东直订的较低价格
- 02按日期、人数和预算规划住宿
- 03跟踪关注房源的降价
- 04比较 Airbnb 与 VRBO 上的同一房源
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mvanhorn/ printing-press-library --skill pp-airbnb安装后在 Claude Code 中输入/pp-airbnb确认已加载。
详细介绍
Airbnb — Printing Press CLI
前提条件:安装 CLI
此技能依赖 airbnb-pp-cli 二进制文件。**调用此技能中的任何命令前,必须确认 CLI 已安装。**如果尚未安装,请先安装:
- 通过 Printing Press 安装程序安装。在 macOS/Linux 上,默认将二进制文件安装到
$HOME/.local/bin;在 Windows 上,默认安装到%LOCALAPPDATA%\Programs\PrintingPress\bin:npx -y @mvanhorn/printing-press-library install airbnb --cli-only - 验证:
airbnb-pp-cli --version - 确保报告的安装目录位于将调用此技能的 Agent/运行时的
$PATH中。
如果 npx 安装失败(没有 Node、处于离线状态等),请改用 Go 直接安装(需要 Go 1.26.6 或更高版本):
go install github.com/mvanhorn/printing-press-library/library/travel/airbnb/cmd/airbnb-pp-cli@latest
如果安装后 --version 报告“command not found”,说明运行时无法在 $PATH 中找到二进制文件目录。验证成功前,请勿执行此技能中的命令。
何时使用此 CLI
当 Agent 或用户提供 Airbnb 房源 URL、询问 Airbnb 费用或直接预订能省多少钱、提到“直接预订”,或想规划多个房源之间的行程时,请使用此 CLI。最便宜的选项是核心功能;规划和比较功能则可在此基础上扩展。本地存储会在多个会话中累积房源、房东和价格历史记录,因此重复查询会越来越快,结果也会越来越丰富。
何时不使用此 CLI
对于需要创建、更新、删除、发布、评论、点赞、邀请、下单、发送消息、预订、购买或更改远程状态的请求,请勿启用此 CLI。此 CLI 仅提供用于检查、导出、同步和分析的只读命令。
独特功能
其他任何用于此 API 的工具都不具备这些功能。
房东直订套利
-
cheapest— 给定 Airbnb 或 VRBO 房源 URL,查找房东的直接预订网站,并报告三个来源中最便宜的选项。用户提到 Airbnb/VRBO 房源时,应使用此工具。它会返回 OTA 费用与直接预订的结构化比较,并提供可直接使用的 URL。
airbnb-pp-cli cheapest 'https://www.airbnb.com/rooms/37124493?check_in=2026-05-16&check_out=2026-05-19' --agent -
plan— 并行搜索指定城市、日期和预算内的 Airbnb 与 VRBO 房源,然后对排名靠前的结果运行 cheapest,并返回按节省金额排序的列表。适合 Agent 使用的旅行规划工具。一次调用即可返回两个平台上按排名排列的结果,以及直接预订 URL 和节省金额。
airbnb-pp-cli plan 'Lake Tahoe' --checkin 2026-05-16 --checkout 2026-05-19 --guests 4 --budget 1500 --agent -
compare— 并排比较:OTA 总价(含清洁费、服务费和税费)与直接预订总价,并显示节省的金额和百分比。当 Agent 需要用具体的节省金额来证明预订建议合理时,请使用此工具。
airbnb-pp-cli compare 'https://www.airbnb.com/rooms/37124493' --checkin 2026-05-16 --checkout 2026-05-19 --json -
find-twin— 对房源照片进行反向图片搜索,以查找同一房源在直接预订网站或其他平台上的页面。当无法提取房东信息(房东名称含糊不清)时,反向图片搜索是最可靠的判断依据。
airbnb-pp-cli find-twin 'https://www.airbnb.com/rooms/37124493' --json
跨平台
-
match— 给定 Airbnb(或 VRBO)上的房源,通过地理编码、设施和照片信号,在另一个平台上查找同一房源。跨平台价格差异确实存在;同一套公寓在 VRBO 上可能便宜 15%。此工具可帮你找到它。
airbnb-pp-cli match 'https://www.airbnb.com/rooms/37124493' --json
持续积累的本地状态
-
watch— 将已保存的房源添加到监控列表并设置目标价格;watch check会重新抓取每个房源,在获取到真实价格时记录带日期的价格快照,若价格确实下降则以状态码 7 退出。子命令:add、list、remove、check。适用于用户正在关注特定房源并等待降价的情况。每日安排运行
watch check;根据退出码 7 采取行动。若对应日期没有可用价格,房源会列在no_price下,绝不会被视为命中(不会误报退出码 7)。使用watch remove <listing-url-or-id>移除房源。airbnb-pp-cli watch add 'https://www.airbnb.com/rooms/37124493' --max-price 350 --checkin 2026-05-16 --checkout 2026-05-19 airbnb-pp-cli watch remove 37124493 -
host portfolio— 给定房东或物业管理公司的名称,列出其在 Airbnb 和 VRBO 上所有已知的房源。发现批量运营模式:哪些 PMC 在这座城市开展业务、哪些有自营网站,以及应重点关注哪些对象以寻找套利机会。
airbnb-pp-cli host portfolio 'Vacasa' --json --select listings.title,listings.location -
wishlist diff— 持续跟踪 Airbnb 愿望清单上的价格变化;报告哪些已保存房源降价、降了多少,以及变动时间范围。用户几个月前保存了某个房源,却忘了这回事。此功能会揭示价格变化,让用户能在预订前采取行动。
airbnb-pp-cli wishlist diff --since 2026-04-01 --json -
fingerprint— 根据照片、便利设施、房东和城市生成稳定哈希;供 match 去重使用,也支持高级用户导出工作流。在房源上构建自定义外部关联;哈希在不同会话间保持稳定。
airbnb-pp-cli fingerprint 'https://www.airbnb.com/rooms/37124493'
发现信号
此 CLI 根据浏览器观察到的流量上下文生成。
- 捕获覆盖范围:共 299 条网络记录,其中 66 条 API 记录
- 协议:rpc_envelope(置信度 80%)、rest_json(置信度 75%)
- 认证信号:api_key — 请求头:X-Airbnb-API-Key、X-Goog-Api-Key
- 生成提示:has_rpc_envelope、weak_schema_confidence
- 候选命令建议:create_GetViewportInfo — 根据观察到的 POST /$rpc/google.internal.maps.mapsjs.v1.MapsJsInternalService/GetViewportInfo 流量推导。;create_StaysPdpSections — 根据观察到的 POST /api/v3/StaysPdpSections/{hash} 流量推导。;create_get_data_layer_variables — 根据观察到的 POST /api/v2/get-data-layer-variables 流量推导。;create_js — 根据观察到的 POST /js/ 流量推导。;create_marketing_event_tracking — 根据观察到的 POST /api/v2/marketing_event_tracking 流量推导。;create_messages — 根据观察到的 POST /tracking/jitney/logging/messages 流量推导。;create_realtimeconversion — 根据观察到的 POST /track/realtimeconversion 流量推导。;get_GetConsentFlagsQuery — 根据观察到的 GET /api/v3/GetConsentFlagsQuery/{hash} 流量推导。
- 注意事项:empty_payload:看起来像 API 的请求返回了空或 null 负载;架构置信度较低。;empty_payload:看起来像 API 的请求返回了空或 null 负载;架构置信度较低。;empty_payload:看起来像 API 的请求返回了空或 null 负载;架构置信度较低。;empty_payload:看起来像 API 的请求返回了空或 null 负载;架构置信度较低。;empty_payload:看起来像 API 的请求返回了空或 null 负载;架构置信度较低。;empty_payload:看起来像 API 的请求返回了空或 null 负载;架构置信度较低。;empty_payload:看起来像 API 的请求返回了空或 null 负载;架构置信度较低。;empty_payload:看起来像 API 的请求返回了空或 null 负载;架构置信度较低。;empty_payload:看起来像 API 的请求返回了空或 null 负载;架构置信度较低。;empty_payload:看起来像 API 的请求返回了空或 null 负载;架构置信度较低。
命令参考
airbnb_listing — 通过 SSR HTML 抓取搜索 Airbnb 房源并查看详情(openbnb 模式,无需身份验证)。
airbnb-pp-cli airbnb_listing get— 通过 SSR... 获取 Airbnb 房源的完整详情(便利设施、房屋规则、位置、亮点、描述、政策、房东)。airbnb-pp-cli airbnb_listing search— 通过公开的 SSR HTML 页面(openbnb 模式),按地点、日期和入住人数搜索 Airbnb 房源。会遍历...
airbnb_wishlist — Airbnb 心愿单(读取用户收藏的房源;需要通过 --chrome 登录)。
airbnb-pp-cli airbnb_wishlist items— 按房源 ID 获取指定心愿单中的条目。airbnb-pp-cli airbnb_wishlist list— 通过 Airbnb 的 GraphQL 持久化查询列出用户的心愿单。
host — 提取房东身份(房东直订套利的关键)。
airbnb-pp-cli host extract— 从两个平台的房源 URL 中提取房东的品牌名称或显示名称。使用 propertyManagement.name...airbnb-pp-cli host portfolio— 从本地存储中列出 Airbnb 和 VRBO 上某个房东或 PMC 名下的所有已知房源。
vrbo_listing — 通过 /graphql 使用 Akamai 预热模式搜索 VRBO 房源并查看详情。
airbnb-pp-cli vrbo_listing get— 通过 propertyDetail GraphQL 操作获取 VRBO 房源的完整详情(操作名称在运行时发现)。支持...airbnb-pp-cli vrbo_listing search— 通过 propertySearch GraphQL 操作搜索 VRBO 房源。使用 Akamai 预热(先 GET /,等待 1.5s,然后 POST)。
数据新鲜度约定
此打印版 CLI 仅为已注册的、由存储支持的读取命令路径提供有限的新鲜度保障。在 --data-source auto 模式下,这些路径会检查 sync_state,并可能在读取本地数据前执行有限刷新。--data-source local 永不刷新。--data-source live 从 API 读取数据,且不会修改本地存储。设置 AIRBNB_PP_NO_AUTO_REFRESH=1 可跳过新鲜度钩子,而不改变数据源选择。
覆盖的路径:
airbnb-pp-cli airbnb_wishlistairbnb-pp-cli airbnb_wishlist itemsairbnb-pp-cli airbnb_wishlist list
当 JSON 输出使用生成的来源信息封套时,新鲜度元数据会显示在 meta.freshness。应将其视为相应命令路径的当前缓存新鲜度,而非完整历史回填或特定 API 数据增强的保证。
查找合适的命令
如果你知道要做什么,但不知道该用哪个命令,可以直接询问 CLI:
airbnb-pp-cli which "<capability in your own words>"
which 会根据自然语言能力查询,从此 CLI 精选的功能索引中匹配最合适的命令。退出代码 0 表示至少有一个匹配项;退出代码 2 表示无法确定匹配项,此时请改用 --help 或尝试更具体的查询。
操作示例
找到预订已保存 Airbnb 房源的最省钱方式
airbnb-pp-cli cheapest 'https://www.airbnb.com/rooms/37124493' --checkin 2026-05-16 --checkout 2026-05-19 --json --select savings,direct.url,direct.total,airbnb.total
仅返回节省金额和价格对比字段,不返回完整的房东提取过程记录。
规划一次横跨两个平台、4 位客人参加的 Tahoe 旅行
airbnb-pp-cli plan 'Lake Tahoe' --checkin 2026-05-16 --checkout 2026-05-19 --guests 4 --budget 1500 --agent
并行搜索 Airbnb、VRBO 和直订选项,并按总节省金额排序。
监控已保存房源的降价情况
airbnb-pp-cli watch add 'https://www.airbnb.com/rooms/37124493' --max-price 350 && airbnb-pp-cli watch check
airbnb-pp-cli watch remove 'https://www.airbnb.com/rooms/37124493'
添加到监控列表,然后通过 cron 检查——仅当实际抓取到的价格不高于阈值时才以退出代码 7 结束。若指定日期没有可用价格,房源会列在 no_price 下(永远不会命中,也不会以退出代码 7 结束)。watch remove 接受房源 URL 或 watch list 显示的不带前缀的 ID。
保持价格历史最新
airbnb-pp-cli sync # re-scrapes watchlist + known listings, persists fresh snapshots
airbnb-pp-cli sync --resources airbnb_wishlist # auth-gated wishlist sync (needs auth login --chrome)
sync 会重新抓取存储中已有记录的内容(监控列表条目和先前抓取过的房源),并写入新的价格快照;如果存储为空,则会报告 empty_store,且不会发起网络请求。经过身份验证的心愿单同步需通过 --resources airbnb_wishlist 主动启用。
在 Austin 查找 Vacasa 房源并直接预订
airbnb-pp-cli host portfolio 'Vacasa' --city Austin --agent --select listings.title,listings.direct_url
批量发现某个 PMC 的房源组合,并解析好直订 URL。
深入比较嵌套响应
airbnb-pp-cli airbnb get 37124493 --agent --select listing.title,listing.coordinate.latitude,listing.coordinate.longitude,pricingQuote.structuredStayDisplayPrice.primaryLine.price,pricingQuote.structuredStayDisplayPrice.secondaryLine.price
使用带点号路径的 --select,将 Airbnb 深层嵌套的 SSR Apollo 缓存缩减为仅包含高价值字段。
身份验证设置
公开搜索和房源详情无需身份验证。需要身份验证的功能(Airbnb 愿望清单、旅行记录)通过 auth login --chrome 导入 Cookie。网页搜索后端可插拔:Parallel.ai(付费,效果最佳)、DuckDuckGo HTML(默认免费)、Brave Search API(免费套餐)或 Tavily(免费套餐)。
运行 airbnb-pp-cli doctor 验证设置。
Agent 模式
在任何命令后添加 --agent。它会展开为:--json --compact --no-input --no-color --yes。
-
可通过管道传递 — JSON 写入 stdout,错误写入 stderr
-
可筛选 —
--select保留部分字段。点号路径可深入嵌套结构;数组会逐元素遍历。对于内容冗长的 API,这是控制上下文大小的关键:airbnb-pp-cli airbnb_listing get --agent --select id,name,status -
可预览 —
--dry-run显示请求,但不发送 -
适合离线使用 — 可用时,sync/search 命令可以使用本地 SQLite 存储
-
非交互式 — 从不显示提示,每项输入都是一个标志
-
只读 — 不要使用此 CLI 执行创建、更新、删除、发布、评论、点赞、邀请、下单、发送或其他会修改数据的请求
响应封装
从本地存储或 API 读取数据的命令会将输出封装在来源信息中:
{
"meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."},
"results": <data>
}
解析 .results 获取数据,并查看 .meta.source 判断数据来自实时来源还是本地。只有当 stdout 是终端时,才会向 stderr 输出人类可读的 N results (live) 摘要;通过管道接收的内容或 Agent 消费者会在 stdout 获得纯 JSON。
Agent 反馈
当你(或 Agent)发现此 CLI 有任何不妥之处时,请记录下来:
airbnb-pp-cli feedback "the --since flag is inclusive but docs say exclusive"
airbnb-pp-cli feedback --stdin < notes.txt
airbnb-pp-cli feedback list --json --limit 10
条目会本地存储在 ~/.airbnb-pp-cli/feedback.jsonl。除非设置了 AIRBNB_PP_FEEDBACK_ENDPOINT,并且传入了 --send 或设置了 AIRBNB_PP_FEEDBACK_AUTO_SEND=true,否则绝不会通过 POST 发送。默认行为仅限本地存储。
写下让你感到意外的地方,而不是提交 Bug 报告。简短、具体,写成一行:这才是能够逐步积累价值的部分。
输出交付
每个命令都接受 --deliver <sink>。输出会写入指定的 sink,同时也会写入 stdout,或取代 stdout,因此 Agent 无需手动通过管道传递,就能路由命令结果。支持三种 sink:
| Sink | 效果 |
|---|---|
stdout | 默认;仅写入 stdout |
file:<path> | 以原子方式将输出写入 <path>(tmp + rename) |
webhook:<url> | 将输出正文 POST 到该 URL(使用 --compact 时为 application/json 或 application/x-ndjson) |
不支持的方案会被拒绝,并返回一条结构化错误,列出支持的方案。Webhook 失败时会返回非零状态码,并在 stderr 中记录 URL 和 HTTP 状态。
命名配置
配置是保存的一组标志值,可在多次调用中重复使用。如果定时运行的 Agent 每次都以相同配置调用同一命令,可以使用配置——这是 HeyGen 的 “Beacon” 模式。
airbnb-pp-cli profile save briefing --json
airbnb-pp-cli --profile briefing airbnb_listing get
airbnb-pp-cli profile list --json
airbnb-pp-cli profile show briefing
airbnb-pp-cli profile delete briefing --yes
显式标志始终优先于配置值;配置值优先于默认值。agent-context 会在 available_profiles 下列出所有可用配置,供执行运行时自省的 Agent 发现。
退出代码
| 代码 | 含义 |
|---|---|
| 0 | 成功 |
| 2 | 用法错误(参数错误) |
| 3 | 未找到资源 |
| 4 | 需要身份验证 |
| 5 | API 错误(上游问题) |
| 7 | 请求过于频繁(等待后重试) |
| 8 | 机器人验证(datadome/Akamai)。请等待,或通过 airbnb-pp-cli auth login --chrome 刷新 Cookie |
| 10 | 配置错误 |
速率限制
--rate-limit N(全局标志)将请求速率限制为每秒 N 次。适用于抓取路径(search、get、cheapest、plan、compare)和 GraphQL 路径(用于定价的 BookingPrice、wishlist list、wishlist items)。
- 默认值(未设置标志):基线速率为 0.5 rps,不会回退。
--rate-limit N且 N > 0:将其设为新的上限。--rate-limit 0:禁用速率限制。
限速器会自适应调整:遇到 429 或检测到 datadome/Akamai 挑战时,会将当前速率减半并记录上限。连续成功 10 次后,速率会提升 25%,但不会超过已发现上限的 90%。重试等待时间会加入 25% 的随机抖动,以防一组客户端同步发起请求。
持续触发挑战时,CLI 会返回带有补救提示的类型化 BotChallengeError(datadome 挑战时刷新 cookie;Akamai 挑战时等待传感器冷却)。CLI 不会在失败时编造数据。
参数解析
解析 $ARGUMENTS:
- 为空、
help或--help→ 显示airbnb-pp-cli --help输出 - 以
install开头 → 以mcp结尾 → 安装 MCP;否则 → 参见上文的先决条件 - 其他任何内容 → 直接使用(作为带有
--agent的 CLI 命令执行)
安装 MCP 服务
- 安装 MCP 服务:
go install github.com/mvanhorn/printing-press-library/library/travel/airbnb/cmd/airbnb-pp-mcp@latest - 在 Claude Code 中注册:
claude mcp add airbnb-pp-mcp -- airbnb-pp-mcp - 验证:
claude mcp list
直接使用
- 检查是否已安装:
which airbnb-pp-cli如果未找到,则提供安装选项(参见本技能开头的先决条件)。 - 根据用户查询,从上文的独特功能和命令参考中选择最合适的命令。
- 使用
--agent标志执行:airbnb-pp-cli <command> [subcommand] [args] --agent - 如果存在歧义,请查看子命令帮助:
airbnb-pp-cli <command> --help。