لا يمكن إجراء طلب POST مع Webhook

الوصف

أنا أحاول استخدام أداة Webhook للاتصال بـ Telegram. إليك ما أفعله:


:warning: مهم:: بدلاً من localhost أستخدم فعلاً عنوان ngrok!

ومع ذلك عندما أختبر هذا أحصل على الخطأ التالي:

{
"code": 404,
"message": "This webhook is not registered for GET requests. Did you mean to make a POST request?"
}

ومع ذلك عندما أستخدم أداة Telegram لفعل نفس الشيء تقريباً، أتمكن من الاتصال وكل شيء يعمل بشكل مثالي.

بعد البحث عبر الإنترنت، رأيت أن عدة أشخاص واجهوا نفس المشكلة كما يظهر هنا: 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:

  1. الاختبار بفتح الرابط في المتصفح. شريط العناوين يرسل دائماً GET. يجب أن يأتي POST من curl/Postman أو Telegram.
  2. إعادة توجيه تخفض الطريقة. إذا اتصلت برابط ngrok على http:// (أو ضربت إعادة توجيه الشرطة المائلة الزائدة)، فإن 301/302 إلى https يحول POST إلى GET. استخدم رابط ngrok على https مباشرة، وعيّن 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

هناك ملاحظة واحدة مع اختبار الرابط: اضغط على “Listen for test event” أولاً، فهو يلتقط طلباً واحداً فقط أثناء الاستماع النشط. Postman يعمل أيضاً، فقط عيّن الطريقة إلى POST.

بالنسبة لإعداد Telegram الحقيقي، انتقل إلى Production URL، فعّل سير العمل، ثم وجّه setWebhook من Telegram إلى ذلك رابط https. يرسل Telegram التحديثات كـ POST، لذا سيتصرف مثل Telegram Trigger الخاص بك بالفعل.

الخطأ يحدث لأن Telegram يحاول الوصول إلى عنوان webhook الخاص بك باستخدام طلب GET، بينما عقدة Webhook في n8n مكونة لقبول طلبات POST فقط.

إليك بعض الأشياء التي يجب التحقق منها:

  1. تأكد من أنك تستخدم عنوان الإنتاج (أو عنوان الاختبار النشط أثناء الاستماع) من n8n وليس فتح العنوان مباشرة في المتصفح. المتصفحات ترسل طلبات GET افتراضياً.
  2. تحقق من أن webhook الخاص بـ Telegram مسجل بشكل صحيح:

https://api.telegram.org/bot<BOT_TOKEN>/setWebhook?url=<YOUR_NGROK_URL>/webhook/<path>
  1. بعد تعيين webhook، تحقق منه باستخدام:

https://api.telegram.org/bot<BOT_TOKEN>/getWebhookInfo
  1. في n8n، انقر على “الاستماع إلى حدث اختبار” إذا كنت تستخدم عنوان الاختبار. أداة webhooks للاختبار تعمل فقط بينما سير العمل يستمع بنشاط.
  2. تأكد من أن مسار Telegram Bot Trigger/Webhook يطابق بدقة المسار المكون في n8n وأن ngrok يعيد توجيه الطلبات إلى منفذ n8n الصحيح.
  3. إذا قمت بزيارة عنوان webhook يدوياً في المتصفح ورأيت:

{
  "code": 404,
  "message": "This webhook is not registered for GET requests. Did you mean to make a POST request?"
}

هذا السلوك متوقع فعلاً لأن نقطة الدخول تقبل طلبات POST فقط.

شكراً جزيلاً @achamm! كانت هذه هي الإجابة الصحيحة!

أهلاً وسهلاً، وأنا مستعد للإجابة على أي سؤال لديك