mcpField
P
pp-airbnb

pp-airbnb

github.com/mvanhorn其他2.1k582 次安装今天更新
代码仓库

关于 pp-airbnb

pp-airbnb 是驱动 airbnb-pp-cli 的技能,面向需要检索和分析 Airbnb、VRBO 房源的 Agent。它提供跨平台比价、直订价格发现及本地价格追踪,命令仅用于只读操作。

主要功能

  1. 01比较平台价格与直订费用
  2. 02跨 Airbnb 和 VRBO 规划行程
  3. 03查找同一房源的其他平台版本
  4. 04监控房源价格变化
  5. 05搜索房东名下房源

适用场景

  1. 01寻找房东直订的较低价格
  2. 02按日期、人数和预算规划住宿
  3. 03跟踪关注房源的降价
  4. 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 已安装。**如果尚未安装,请先安装:

  1. 通过 Printing Press 安装程序安装。在 macOS/Linux 上,默认将二进制文件安装到 $HOME/.local/bin;在 Windows 上,默认安装到 %LOCALAPPDATA%\Programs\PrintingPress\bin:
    npx -y @mvanhorn/printing-press-library install airbnb --cli-only
    
  2. 验证:airbnb-pp-cli --version
  3. 确保报告的安装目录位于将调用此技能的 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_wishlist
  • airbnb-pp-cli airbnb_wishlist items
  • airbnb-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需要身份验证
5API 错误(上游问题)
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:

  1. 为空、help 或 --help → 显示 airbnb-pp-cli --help 输出
  2. 以 install 开头 → 以 mcp 结尾 → 安装 MCP;否则 → 参见上文的先决条件
  3. 其他任何内容 → 直接使用(作为带有 --agent 的 CLI 命令执行)

安装 MCP 服务

  1. 安装 MCP 服务:
    go install github.com/mvanhorn/printing-press-library/library/travel/airbnb/cmd/airbnb-pp-mcp@latest
    
  2. 在 Claude Code 中注册:
    claude mcp add airbnb-pp-mcp -- airbnb-pp-mcp
    
  3. 验证:claude mcp list

直接使用

  1. 检查是否已安装:which airbnb-pp-cli 如果未找到,则提供安装选项(参见本技能开头的先决条件)。
  2. 根据用户查询,从上文的独特功能和命令参考中选择最合适的命令。
  3. 使用 --agent 标志执行:
    airbnb-pp-cli <command> [subcommand] [args] --agent
    
  4. 如果存在歧义,请查看子命令帮助:airbnb-pp-cli <command> --help。

评论

支持 Markdown