← 所有工具
我們的筆記

smee.io 把 UnifyPort webhook 轉發到 localhost

UnifyPort 把事件投遞到一個公開的 HTTPS URL。smee.io 只靠一個 Node 用戶端就把它橋接到你的筆電——不用通道二進位,也不用註冊帳號。

smee.io 解決什麼

smee.io 是 GitHub 維護的代理:開啟一次就給你一個公開的 channel URL。任何 POST 到這個 channel 的請求都會被重新廣播給每個連線的用戶端。在你機器上跑那個小小的 smee-client,它就把每條請求重放到你本地的 handler——於是來自公開網路的 webhook 不用裝通道軟體就能到達 localhost

五分鐘接上 UnifyPort handler

假設你的 handler 監聽 3000 連接埠:

  1. 1. 開啟 smee.io,按 Start a new channel,複製 channel URL。
  2. 2. 透過 POST /v1/webhook-endpoints 註冊它——把 url 設成這個 channel,迭代期間 subscribed_events["*"]
  3. 3. 跑用戶端,把它指向你本地的路由:
  4. 4. 從渠道側觸發一個事件——一則 Telegram 私訊、一則 WhatsApp 訊息——看它到達 localhost:3000
npx smee-client -u https://smee.io/<channel> -t http://localhost:3000/events

簽章驗證照樣能用

smee 原樣轉發 raw body,所以你 handler 看到的位元組就是 UnifyPort 簽章的那一份。驗證和正式環境完全一致——重新計算並和 X-Device-Signature 比對:

X-Device-Signature = hex( HMAC-SHA256( secret, timestamp + "." + raw_body ) )

想在寫程式碼前先用手確認一遍,可以在我們的 CyberChef 教學裡跑同一套演算法,或者用離線的 DevToys

smee.io 不適合的場景

  • 任何接近正式環境的流量。 channel 是公開且可被猜到的——當作任何人都能讀取或注入流量來對待。只用一次性的密鑰。
  • 高頻或對延遲敏感的測試。 公共中繼多了一跳;像 ngrok 這樣帶 4040 inspector 的本地通道更穩。
  • 你還要看其他 HTTP 流量。 smee 只中繼它自己的 channel;ngrok 或 Pipedream RequestBin 能給你更完整的檢視。

常見問題

smee.io 會改動請求 body 嗎?
不會。它中繼的是 raw 位元組,所以 X-Device-Signature 驗證和正式環境完全一樣——重新算 hex(HMAC-SHA256(secret, timestamp + "." + body)) 再比對即可。
我需要裝什麼嗎?
只要 Node——用 npx smee-client 跑用戶端就行,不用全域安裝,也不用任何通道二進位。
smee.io 能用於正式環境的 webhook 嗎?
不能。channel 公開且可被猜到。它適合本地開發、配一次性的 signing secret;上 staging 或正式環境請換私有通道或你真實的 endpoint。

推薦的 UnifyPort 本地開發流程

專門留一個帳號給本地開發,smee 用戶端常駐在一個終端窗格裡,handler 存檔即重載。某條投遞不對勁時,從渠道側重新觸發,或從 handler 紀錄裡回看——萬一簽章對不上,用 CyberChef 驗一下。