← 所有工具
我们的笔记

ngrok 做 UnifyPort webhook 的本地开发

UnifyPort 把事件投递到一个公网 HTTPS URL。如果你的 handler 跑在 localhost——多数日子里都是——你需要一条 tunnel。ngrok 是我们多年来的默认选择。

ngrok 解决什么

一条命令就有一个公网 HTTPS URL,把每个请求转到本地某个端口。所有过路的流量都被 http://127.0.0.1:4040 的请求 inspector 捕获——headers、body、时序、replay 按钮一应俱全。这个 inspector 才是我们至今仍用 ngrok 的原因,就算市面上有不少免费 tunnel 替代品:它把本来需要边打日志边追的事压缩成"看一眼"。

UnifyPort handler 的五分钟搭建

假设 handler 监听在 3000 端口:

  1. 1. ngrok http 3000——拷贝它输出的 https://*.ngrok-free.app URL。
  2. 2. 通过 POST /v1/webhook-endpoints 注册这个 URL——把 url 设成 https://<your-tunnel>.ngrok-free.app/events,按需选择 subscribed_events(迭代期可以先 ["*"] 全收)。
  3. 3. 浏览器打开 http://127.0.0.1:4040。从 provider 那边触发事件——一条 Telegram 私信、一条 WhatsApp 消息——看着它落进来。
  4. 4. 用 replay 按钮把同一条投递重发给改过代码的 handler。这就是 ngrok 比每次改代码都要去 provider 那边重新触发事件更快的原因。

本地验证签名

ngrok 免费版 tunnel 在上游就解了 TLS,所以你的 handler 看到请求时 body 已经是明文——正是 UnifyPort 签的那份。这意味着签名校验跟生产一样:算 hex(HMAC-SHA256(secret, timestamp + "." + body)),跟 X-Device-Signature header 比对。想加代码前先手动确认一次,可以走我们的 CyberChef 详解——同一个算法在浏览器里跑一遍。

ngrok 不再是最佳答案的时候

  • staging 或 demo 环境。免费版 URL 每次重启都换,长期配置会被打断。要么上付费版用固定域名,要么换 Cloudflare Tunnel,免费固定 host。
  • 高频压测。免费版 ngrok 限流很激进。要么升级套餐,要么把 handler 部到真实环境跑。
  • 只跑 webhook、没其他 HTTP 流量的场景。smee.io 更轻——不用装二进制,只要一个 client 脚本。

推荐的 UnifyPort 开发循环

一个 bot/账号专门做本地 dev,ngrok tunnel 长开在一个终端 pane 里,handler 改即重载,4040 inspector 钉一个浏览器 tab。出问题时直接从 4040 重放给重建后的 handler——几乎总比再去哄 provider 触发同一个事件快。