描述
我正在嘗試使用 Webhook widget 來連接到 Telegram。這是我的做法:
重要:我實際上使用的是 ngrok URL,而不是 localhost!
但是,當我測試時,我收到以下錯誤:
{
"code": 404,
"message": "This webhook is not registered for GET requests. Did you mean to make a POST request?"
}
但是,當我使用 Telegram widget 來基本上做相同的事情時,我能夠連接,一切都完美運作。
在網上搜尋時,我看到有幾個人遇到了相同的問題,如下所示:Webhook interprets all sent requests as GET · Issue #12751 · n8n-io/n8n
我試圖遵循該主題的建議,但沒有成功。
問題
你知道我可能做錯了什麼嗎?有什麼可能的建議來避免此錯誤嗎?
你的 n8n 設置信息
- **n8n 版本:v2
- **資料庫(預設:SQLite):Sqlite
- **n8n EXECUTIONS_PROCESS 設置(預設:own, main):main
- **運行 n8n 方式(Docker、npm、n8n cloud、desktop app):docker
- **作業系統:Linux Mint
@Federico_Gentile 那個 404 表示 GET 請求確實到達了節點,儘管它被設定為 POST,所以是有什麼東西改變了方法,而不是節點設定有問題。
ngrok 通常的兩個原因:
- 在瀏覽器中打開 URL 測試。位址欄總是發送 GET。POST 必須來自 curl/Postman 或 Telegram。
- 重新導向降級了方法。如果你呼叫 http:// ngrok URL(或點擊尾部斜線重新導向),301/302 到 https 會把你的 POST 轉變為 GET。直接使用 https ngrok URL,並設定 WEBHOOK_URL=https://your-ngrok-domain,這樣 n8n 會發出 https。
你是如何發送失敗的請求的:瀏覽器、curl 或 Telegram setWebhook?
非常感謝您的回覆。到目前為止,我一直是透過瀏覽器的搜尋欄來發送請求,所以那可能是原因所在。如果我想要正確地測試它,您會建議我使用什麼呢?
@Federico_Gentile 沒錯,就是這樣,搜尋列發送的是 GET 所以一定會觸發那個錯誤。
測試的話,發送一個真正的 POST。最快的方法是用 curl:
curl -X POST -H "Content-Type: application/json" -d '{"hello":"world"}' https://your-ngrok-domain/webhook-test/9390c7f6-894b-4948-9579-8d9ec556dc7b
測試 URL 有個要注意的地方:先點擊「Listen for test event」,它只會在主動監聽時捕捉單一請求。Postman 也可以,只要把方法設為 POST。
對於真正的 Telegram 設定,切換到 Production URL,啟用工作流程,然後將 Telegram 的 setWebhook 指向那個 https URL。Telegram 以 POST 方式發送更新,所以它的行為會和你的 Telegram Trigger 一樣。
發生此錯誤是因為 Telegram 正在嘗試使用 GET 請求存取你的 webhook URL,而你的 n8n Webhook 節點被設定為只接受 POST 請求。
檢查以下幾點:
- 確保你使用的是 n8n 的生產 URL(或在監聽時使用的活躍測試 URL),而不是直接在瀏覽器中開啟 URL。瀏覽器預設會發送 GET 請求。
- 驗證 Telegram webhook 已正確註冊:
https://api.telegram.org/bot<BOT_TOKEN>/setWebhook?url=<YOUR_NGROK_URL>/webhook/<path>
- 設定 webhook 後,使用以下方式檢查:
https://api.telegram.org/bot<BOT_TOKEN>/getWebhookInfo
- 在 n8n 中,如果使用測試 URL,請點擊**「監聽測試事件」**。測試 webhook 只在工作流程主動監聽時工作。
- 確認 Telegram Bot 觸發器/Webhook 路徑與在 n8n 中設定的路徑完全相符,並且 ngrok 正在將請求轉發到正確的 n8n 連接埠。
- 如果你手動在瀏覽器中造訪 webhook URL 並看到:
{
"code": 404,
"message": "This webhook is not registered for GET requests. Did you mean to make a POST request?"
}
這實際上是預期的行為,因為該端點只接受 POST 請求。