mcpField
P
pricewin-deal-finder

pricewin-deal-finder

github.com/price-win生产力26.9k 次安装11 周前更新
代码仓库

关于 pricewin-deal-finder

pricewin-deal-finder 是用于比较多个来源酒店价格的 skill,可按城市、日期和人数返回排序结果及预订链接,适合处理住宿搜索的 Agent。

主要功能

  1. 01比较最多 4 个来源的价格
  2. 02排序推荐高性价比、低价和优质选项
  3. 03显示美元每晚价格
  4. 04提供直接预订链接
  5. 05搜索全球城市

适用场景

  1. 01比较行程期间的酒店价格
  2. 02查找指定日期的低价酒店
  3. 03寻找每晚预算以内的住宿

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/price-win/pricewin-skills-hub --skill pricewin-deal-finder

安装后在 Claude Code 中输入/pricewin-deal-finder确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

install.sh
package-lock.json
package.json
bin/
browse.js
daemon.js
search.js
lib/
browser-state.js
dom-extract.js
selector-cache.js
snapshot.js

详细介绍

PriceWin Deal Finder

通过一条命令比较 Booking.com、Agoda、Google Hotels 和 OpenTravel 的实时酒店价格——并返回按性价比、最低价和品质精选的排名结果及直接预订链接。

别再打开五个 OTA 标签页来寻找真正的最低价了。只需向你的 Agent 提问 “帮我找一家 8 月 12–15 日在东京的酒店,2 位客人”,此技能就会在约 30–60 秒内返回清晰的排名比较结果(已缓存的城市)。

在以下问题中调用此技能:

  • “<city> 在 <dates> 的最低价酒店是什么?”
  • “这家酒店在 Booking.com 还是 Agoda 上更便宜?”
  • “比较 <city> 的酒店价格,<N> 位客人。”
  • “帮我找一家 <city> 每晚低于 $<X> 的酒店。”
  • “在 <dates> 住在 <landmark> 附近,哪里性价比最高?”

以上问题都会返回下方所示的同一条命令结果——无需来回澄清。

一条命令即可获得:

  • 🥇 性价比最高 · 🥈 价格最低 · 🥉 品质精选——并列呈现
  • 来自最多 4 个来源的每晚实价,统一换算为 USD
  • 每家酒店均提供可点击的预订链接,直达价格最低的 OTA
  • 适用于全球任何城市——包括有严格反机器人措施的城市(上海、杭州、曼谷……),通过隐身 Patchright 守护进程访问
  • 无需 API 密钥,无需 MCP 服务——只需 node/npx

结果示例:

🏨 Tokyo • Aug 12–15 • 3 nights • 2 guests
━━━━━━━━━━━━━━━━━━━━
🥇 BEST VALUE
Shinjuku Granbell Hotel
  ✅ agoda      💰 $118/night
     booking    💰 $131/night
     → Save $13 vs Booking
🥈 CHEAPEST
APA Hotel Shinjuku
  ✅ google     💰 $94/night
📊 18 hotels | agoda, booking, google, opentravel • prices in USD

安装:

npx skills add https://github.com/Price-Win/pricewin-skills-hub --skill pricewin-deal-finder

🚨 重要——如何使用此技能

一条命令即可完成所有操作。请将其作为第一步运行——不要先询问澄清问题:

cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us

{baseDir} 是此技能的安装目录(由运行时自动解析)。如果你的运行时不会替换它,请 cd 到包含此 SKILL.md 的文件夹(即包含 bin/search.js 的文件夹)。不要硬编码 ~/.hermes/... 或 ~/.openclaw/... 路径——不同平台的路径各不相同。

示例:

cd {baseDir} && node bin/search.js "Hangzhou" 2026-06-10 2026-06-13 2 en-us

该脚本会自动处理所有操作:启动守护进程、查询 Agoda 缓存、内联搜索 Google 和 Booking、查询 OpenTravel API(所有城市)、发现新城市,并生成格式化的分档卡片结果。只需运行脚本并将输出发送给用户。

**不要先询问澄清问题。**直接运行命令。推断所有参数:

  • **年份:**除非用户另有说明,否则使用今天日期所在的年份。如果所请求的日期(月和日)今年已经过去,则假定为明年。(如不确定,使用 date +%Y-%m-%d 获取今天的日期。)
  • “10-13/6” → <year>-06-10 <year>-06-13——根据上面的规则填写 <year>
  • “2 guests” / “2 people” → 2 位成人
  • **区域设置:**传递给 OTA 的语言/区域代码(用于控制网站语言和区域)。默认为 en-us。价格以 USD 计价(Google Hotels 的请求参数为 gl=us&curr=USD);其他来源则遵循你传入的区域设置。

**不要使用任何其他方式。**不得使用 Python 脚本、curl、浏览器工具或子 Agent。这一条命令就足够了。


🚨 关键规则——每次都必须遵守

规则 0——禁止使用的工具。请仔细阅读两遍。此技能通过 terminal 工具驱动一个长期运行的 Patchright 守护进程。你的运行时还提供了其他一些看似方便、但在此技能中严格禁止使用的工具:

❌ browser_navigate / browser_open——禁止使用
❌ browser_click——禁止使用
❌ browser_type / browser_fill——禁止使用
❌ browser_snapshot——禁止使用
❌ browser_close——禁止使用
❌ 任何其他 browser_* 原生工具——禁止使用
❌ delegate_task / spawn_agent / 子 Agent 委派——禁止使用

原因:这些原生工具会启动未启用隐身功能的普通 Chromium,因此 Booking.com 和 Agoda 会在几秒内检测到机器人,导致请求一直挂起,直到运行时以“Command timed out after 30/60 seconds”终止它们。你会在超时上浪费 5 分钟以上,而用户什么也得不到。通过 terminal 启动的 Patchright 守护进程能够绕过机器人检测。

委派的子 Agent 启动时没有历史记录,也不具备此技能的上下文——它们总会退回到使用 Python/curl 抓取数据,并立即被机器人拦截。此技能必须完全由当前 Agent 使用 terminal 工具运行。 ✅ 在此技能中,驱动浏览器的唯一允许方式是通过 terminal:

terminal: cd {baseDir} && node bin/search.js ...

规则 1 — search.js 负责处理所有事务。切勿自行抓取 OTA。 不要手动调用 browse.js 命令,不要在浏览器中执行 goto/click/type,不要手动构建 Agoda/Booking/Google URL,不要单独调用 OpenTravel API,也不要尝试自行启动守护进程。search.js 已通过谨慎的流程驱动隐身守护进程,能够应对机器人检测——它会在内部处理所有城市(包括上海、杭州等中国城市)的 Agoda 发现。**手动导航 OTA 是导致失败的首要原因:这会触发 Agoda/Booking 的反机器人机制(“检测到自动化”“重定向至主页”“完成搜索时遇到问题”),并导致 IP 被封锁。**你唯一要做的就是运行一次 search.js 并发送其输出。如果你认为某个来源“缺失”,请重新阅读规则 4——不要手动去获取它。

规则 2 — 首次发现城市需要 2–4 分钟。 如果 search.js 输出包含 "discovering" 或 "launching" 消息,请告知用户:“首次搜索此城市——正在发现选择器,大约需要 2–4 分钟……”然后等待结果。不要重试或中止。

规则 3 — 原样发送输出。 search.js 会输出格式化好的分档卡片,可直接发送。将输出直接复制到回复中。不要重新格式化、总结或缩写。

规则 3a — 保留 Markdown 超链接。 输出中的每个酒店名称都已用 [Hotel Name](https://booking-url...) 包裹。这是可点击的超链接——请勿:

  • 删除 Markdown 格式并将 URL 单独显示在 🔗 https://... 行中
  • 将 [Hotel Name](url) 替换为纯文本
  • 将 OTA 名称改为首字母大写(google 应保持为 google,不能改为 Google)
  • 重命名分区——“📋 More good deals”必须保持原样

输出已适配 Telegram-MarkdownV2。原样发送即可让用户看到可点击的酒店名称和隐藏的 URL(界面更简洁)。

规则 3b — 如果你确实在输出后添加了建议/评论部分,其中提到的每个酒店名称也必须是 Markdown 超链接 [Hotel Name](url),并使用脚本为该酒店打印的相同 URL。切勿在自己的评论中将酒店名称写成纯文本。

规则 4 — 部分结果很常见且可以接受。切勿手动“修复”结果。 某个来源可能不会出现在输出中(例如本次运行时 Agoda 被拦截,或 OpenTravel 在该城市没有库存)。这没关系——发送包含现有来源的分档卡片即可。页脚(📊 N hotels | <sources> • prices in USD)会准确列出找到的来源。不要尝试通过浏览器、直接 URL 或任何其他工具获取缺失来源——这会触发反机器人机制,让情况更糟。如果 search.js 完全报错,请用一行说明失败原因,并显示错误上方打印的任何部分输出。如果想获得更多结果,唯一有效的重试方式是再次运行相同的 search.js 命令(反机器人拦截通常是暂时的)。


输出格式参考

search.js 会按以下格式打印分档卡片——请直接发送给用户:

酒店名称是指向最便宜 OTA 的 Markdown 链接。价格行不包含链接,OTA 键以小写显示(agoda/booking/google/opentravel)。没有星级评分或区域行——脚本没有这些数据。

🏨 <city> • <d1>–<d2> • <N> nights • <adults> guests
━━━━━━━━━━━━━━━━━━━━

🥇 BEST VALUE
[<Hotel Name>](<cheapest_link>)
  ✅ agoda      💰 <price>/night
     booking    💰 <price>/night
     opentravel 💰 <price>/night
     → Save <diff> vs Booking

🥈 CHEAPEST
[<Hotel Name>](<cheapest_link>)
  ✅ google     💰 <price>/night
     agoda      💰 <price>/night

🥉 QUALITY
[<Hotel Name>](<cheapest_link>)
  ✅ booking    💰 <price>/night
     agoda      💰 <price>/night

📋 More good deals
  — Agoda —
  • [<Hotel>](<agoda_link>) — agoda: <price> | booking: <price>
  — Booking —
  • [<Hotel>](<booking_link>) — booking: <price>
  — Google —
  • [<Hotel>](<google_link>) — google: <price>
  — OpenTravel —
  • [<Hotel>](<opentravel_link>) — opentravel: <price>

💡 Tip: <best Hotel Name>
   [Book on <OTA>](<link>) — <price>/night

📊 <N> hotels | <sources with data> • prices in USD

所有价格均以 USD 显示。Agoda、Google 和 OpenTravel 会根据 IP 将地区锁定为 VND,价格会通过实时汇率换算;Booking 原生返回 USD。页脚仅列出实际返回数据的来源。


限制

  • 每个城市的首次搜索需要支付 Agoda 发现的耗时(2–4 分钟)。Google 和 Booking 可直接使用(无需发现);OpenTravel 则会直接调用 API。
  • 后续搜索会复用 Agoda 缓存,并在约 30–60 秒内完成。

评论

支持 Markdown