รับ Webhook ข้อความ
อยากรู้ว่าลูกค้าของคุณส่งข้อความมาเมื่อไหร่ใช่ไหม? Webhook ช่วยให้บอท DealDroid ของคุณส่งการแจ้งเตือนแบบเรียลไทม์ไปยังเซิร์ฟเวอร์ของคุณสำหรับทุกข้อความ — ช่วยให้คุณสร้างการเชื่อมต่อแบบกำหนดเอง ติดตามการสนทนา และสร้างเวิร์กโฟลว์อัตโนมัติที่ทรงพลัง
Webhook คืออะไร?
Section titled “Webhook คืออะไร?”ลองคิดว่า webhook เป็นเหมือนกริ่งประตูสำหรับแอปของคุณ ทุกครั้งที่ลูกค้าส่งข้อความมาหา Droid ของคุณ DealDroid จะส่งคำขอ POST ไปยังเซิร์ฟเวอร์ของคุณทันทีพร้อมรายละเอียดข้อความทั้งหมด
กรณีการใช้งานทั่วไป:
- 📊 วิเคราะห์และติดตาม — บันทึกทุกการสนทนาเพื่อวิเคราะห์
- 🔔 การแจ้งเตือนแบบกำหนดเอง — แจ้งเตือนทีมของคุณผ่าน Slack, Discord หรืออีเมล
- 💾 เชื่อมต่อฐานข้อมูล — เก็บข้อความในฐานข้อมูลของคุณเอง
- 🤖 ระบบอัตโนมัติจากบุคคลที่สาม — เรียกใช้เวิร์กโฟลว์ในเครื่องมืออย่าง Zapier หรือ Make
- 🔍 ตรวจสอบคุณภาพ — ตรวจสอบการตอบกลับของ AI แบบเรียลไทม์
ขั้นตอนที่ 1: ตั้งค่า Webhook ของคุณ
Section titled “ขั้นตอนที่ 1: ตั้งค่า Webhook ของคุณ”
ไปที่ Automation Panel ในแดชบอร์ด DealDroid ของคุณและตั้งค่าสองส่วนสำคัญ:
1. Webhook URL
Section titled “1. Webhook URL”นี่คือ URL สาธารณะของ endpoint เซิร์ฟเวอร์ของคุณที่จะรับคำขอ POST จาก webhook
ตัวอย่าง: https://your-server.com/webhook
ข้อกำหนด:
- ต้องเข้าถึงได้แบบสาธารณะ (DealDroid ต้องเข้าถึงได้)
- ต้องใช้ HTTPS (เพื่อความปลอดภัย)
- ควรตอบกลับอย่างรวดเร็ว (ภายใน 5 วินาที)
2. Verify Token
Section titled “2. Verify Token”สร้าง token ยืนยันตัวตนที่ไม่ซ้ำกันเพื่อตรวจสอบคำขอ webhook DealDroid จะรวม token นี้ไว้ในทุกคำขอ webhook ช่วยให้คุณตรวจสอบได้ว่าข้อความมาจากบอท DealDroid ของคุณจริงๆ
ตัวอย่าง: your_verify_token_here_2024
แนวทางปฏิบัติที่ดี:
- ใช้สตริงแบบสุ่มที่ยาว (อย่างน้อย 32 ตัวอักษร)
- เก็บไว้อย่างปลอดภัยเป็น environment variable
- อย่า commit ลงใน version control
- หมุนเวียนเป็นระยะเพื่อความปลอดภัย
ขั้นตอนที่ 2: ทำความเข้าใจคำขอ Webhook
Section titled “ขั้นตอนที่ 2: ทำความเข้าใจคำขอ Webhook”เมื่อมีการส่งหรือรับข้อความ DealDroid จะทำคำขอ POST ไปยัง webhook URL ของคุณพร้อม verify token แนบมาเป็น query parameter
รูปแบบ URL ของคำขอ
Section titled “รูปแบบ URL ของคำขอ”https://your-server.com/webhook?verify_token=your_verify_token_here_2024สำคัญ: ตรวจสอบ query parameter verify_token ให้ตรงกับ token ที่คุณตั้งค่าไว้เสมอก่อนประมวลผลคำขอ เพื่อให้แน่ใจว่า webhook มาจากบอท DealDroid ของคุณจริงๆ
ขั้นตอนที่ 3: ทำความเข้าใจ Request Body
Section titled “ขั้นตอนที่ 3: ทำความเข้าใจ Request Body”ทุกคำขอ webhook จะมี JSON payload พร้อมข้อมูลรายละเอียดเกี่ยวกับข้อความ
TypeScript Type Definition
Section titled “TypeScript Type Definition”type MessageForwarding = { // Reference IDs mid: string; chatId: number; customerId: number; droidId: number; channelId: number;
// Message Content type: "human" | "ai" | "system" | "log" | "admin"; content: { type: "text" | "image" | "button" | "carousel"; value: string | string[]; alt?: string; };
// Metadata note?: string; createdAt: string; // ISO 8601 timestamp};ตัวอย่าง Webhook Payload
Section titled “ตัวอย่าง Webhook Payload”{ "mid": "ddtp-ckz9abc123xyz", "chatId": 12345, "customerId": 67890, "droidId": 11122, "channelId": 33445, "type": "human", "content": { "type": "text", "value": "Hello, I have a question about your products!" }, "note": "", "createdAt": "2025-08-04T12:30:00.000Z"}คู่มืออ้างอิง Field
Section titled “คู่มืออ้างอิง Field”Reference IDs
Section titled “Reference IDs”| Field | Type | คำอธิบาย |
|---|---|---|
mid | string | ตัวระบุที่ไม่ซ้ำกันสำหรับข้อความนี้โดยเฉพาะ |
chatId | number | ID ที่ไม่ซ้ำกันสำหรับเธรดการสนทนา |
customerId | number | ID ที่ไม่ซ้ำกันสำหรับผู้ใช้ปลายทาง |
droidId | number | ID ที่ไม่ซ้ำกันสำหรับบอทของคุณ |
channelId | number | ID ที่ไม่ซ้ำกันสำหรับช่องทางการสื่อสาร (Facebook, LINE ฯลฯ) |
Message Type
Section titled “Message Type”ฟิลด์ type บอกว่าใครเป็นผู้ส่งข้อความ:
| Value | คำอธิบาย |
|---|---|
human | ข้อความจากลูกค้า |
ai | ข้อความจากบอท DealDroid ของคุณ |
system | การแจ้งเตือนหรือเหตุการณ์ของระบบ |
log | ข้อความ log ภายใน |
admin | ข้อความจากเจ้าหน้าที่/แอดมิน |
Content Object
Section titled “Content Object”ออบเจ็กต์ content มี payload ข้อความจริง:
| Field | Type | คำอธิบาย |
|---|---|---|
type | string | รูปแบบของเนื้อหาข้อความ |
value | string or string[] | เนื้อหาข้อความเอง |
alt | string (optional) | ข้อความทางเลือกสำหรับการเข้าถึง |
Content Types
Section titled “Content Types”| Type | Value Format | ตัวอย่าง |
|---|---|---|
text | string | "Hello, I have a question" |
image | string (URL) | "https://example.com/image.jpg" |
button | string[] (array) | ["Apple", "Orange", "Banana"] |
carousel | string | "Send carousel to user" |
Metadata
Section titled “Metadata”| Field | Type | คำอธิบาย |
|---|---|---|
note | string (optional) | หมายเหตุใดๆ ที่เกี่ยวข้องกับข้อความ |
createdAt | string | ISO 8601 timestamp ของเวลาที่สร้างข้อความ |
ขั้นตอนที่ 4: สร้าง Webhook Endpoint ของคุณ
Section titled “ขั้นตอนที่ 4: สร้าง Webhook Endpoint ของคุณ”ถึงเวลาสร้าง endpoint เซิร์ฟเวอร์ของคุณเพื่อรับและประมวลผล webhook นี่คือตัวอย่างที่สมบูรณ์โดยใช้ Node.js และ Express
ตัวอย่าง Node.js + Express แบบสมบูรณ์
Section titled “ตัวอย่าง Node.js + Express แบบสมบูรณ์”import express from "express";
const app = express();const PORT = process.env.PORT || 3000;
// Store your verify token securely as an environment variableconst VERIFY_TOKEN = process.env.VERIFY_TOKEN || "your_verify_token_here";
// Middleware to verify the tokenconst verifyToken = (req, res, next) => { const providedToken = req.query.verify_token;
if (providedToken !== VERIFY_TOKEN) { console.warn("Unauthorized webhook attempt with invalid verify token"); return res.status(403).send("Forbidden: Invalid verify token."); }
next();};
// Middleware to parse JSON bodiesapp.use(express.json());
// Define the webhook endpointapp.post("/webhook", verifyToken, (req, res) => { const message = req.body;
console.log("✅ Webhook received successfully"); console.log("Message ID:", message.mid); console.log("Message Type:", message.type); console.log("Content:", message.content); console.log("Created At:", message.createdAt);
// Add your custom logic here processMessage(message);
// Always respond quickly to avoid timeouts res.status(200).send("Webhook processed.");});
// Your custom processing logicfunction processMessage(message) { // Example: Only process messages from humans if (message.type === "human") { console.log( `Customer ${message.customerId} said: ${message.content.value}` );
// Add your custom logic: // - Save to database // - Send notification to Slack // - Trigger analytics event // - Call external API }}
// Start the serverapp.listen(PORT, () => { console.log(`🚀 Webhook server is running on port ${PORT}`); console.log( `📡 Ready to receive webhooks at http://localhost:${PORT}/webhook` );});วิธีการทำงาน
Section titled “วิธีการทำงาน”- ความปลอดภัยเป็นอันดับแรก: middleware
verifyTokenตรวจสอบ query parameterverify_tokenก่อนประมวลผลคำขอใดๆ - แปลง JSON: Express แปลง JSON body โดยอัตโนมัติ
- ประมวลผลข้อความ: ฟังก์ชัน
processMessageแบบกำหนดเองของคุณจัดการ webhook payload - ตอบกลับอย่างรวดเร็ว: เซิร์ฟเวอร์ตอบกลับด้วย
200 OKทันทีเพื่อยืนยันการรับ
ขั้นตอนที่ 5: ทดสอบ Webhook ของคุณ
Section titled “ขั้นตอนที่ 5: ทดสอบ Webhook ของคุณ”ทดสอบในเครื่องด้วย ngrok
Section titled “ทดสอบในเครื่องด้วย ngrok”หากคุณกำลังพัฒนาในเครื่อง ใช้ ngrok เพื่อเปิดเผยเซิร์ฟเวอร์ในเครื่องของคุณสู่อินเทอร์เน็ต:
# Install ngrok (if not already installed)brew install ngrok
# Start your local servernode server.js
# In another terminal, expose itngrok http 3000ngrok จะให้ URL สาธารณะเช่น:
https://abc123def.ngrok.ioใช้ URL นี้ในการตั้งค่า webhook ของ DealDroid:
https://abc123def.ngrok.io/webhookทดสอบด้วยข้อความจริง
Section titled “ทดสอบด้วยข้อความจริง”- ตั้งค่า webhook URL และ secret ใน DealDroid
- ส่งข้อความทดสอบไปยัง Droid ของคุณผ่าน Facebook, LINE หรือแชทเว็บไซต์ของคุณ
- ตรวจสอบ log ของเซิร์ฟเวอร์เพื่อยืนยันว่าได้รับ webhook แล้ว
- ตรวจสอบว่าข้อมูลถูกต้อง
ผลลัพธ์ log ที่คาดหวัง:
✅ Webhook received successfullyMessage ID: ddtp-ckz9abc123xyzMessage Type: humanContent: { type: 'text', value: 'Hello!' }Created At: 2025-08-04T12:30:00.000Zตัวอย่างการเชื่อมต่อทั่วไป
Section titled “ตัวอย่างการเชื่อมต่อทั่วไป”บันทึกข้อความลงฐานข้อมูล (MongoDB)
Section titled “บันทึกข้อความลงฐานข้อมูล (MongoDB)”import mongoose from "mongoose";
const MessageSchema = new mongoose.Schema({ mid: String, chatId: Number, customerId: Number, type: String, content: Object, createdAt: Date,});
const Message = mongoose.model("Message", MessageSchema);
async function processMessage(message) { try { await Message.create(message); console.log("💾 Message saved to database"); } catch (error) { console.error("❌ Error saving message:", error); }}ส่งการแจ้งเตือน Slack
Section titled “ส่งการแจ้งเตือน Slack”import axios from "axios";
const SLACK_WEBHOOK_URL = process.env.SLACK_WEBHOOK_URL;
async function processMessage(message) { if (message.type === "human") { await axios.post(SLACK_WEBHOOK_URL, { text: `🗨️ New customer message: "${message.content.value}"`, }); }}เรียกใช้การแจ้งเตือนทางอีเมล
Section titled “เรียกใช้การแจ้งเตือนทางอีเมล”import nodemailer from "nodemailer";
const transporter = nodemailer.createTransport({ service: "gmail", auth: { user: process.env.EMAIL_USER, pass: process.env.EMAIL_PASS, },});
async function processMessage(message) { if (message.type === "human") { await transporter.sendMail({ from: "bot@yourcompany.com", to: "team@yourcompany.com", subject: "New Customer Message", text: `Customer ${message.customerId} said: ${message.content.value}`, }); }}แนวทางปฏิบัติที่ดี
Section titled “แนวทางปฏิบัติที่ดี”ความปลอดภัย
Section titled “ความปลอดภัย”- ✅ ตรวจสอบ verify token เสมอ ก่อนประมวลผลคำขอ
- ✅ ใช้ HTTPS สำหรับ webhook URL ของคุณ
- ✅ เก็บ token ใน environment variables ไม่ใช่ในโค้ด
- ✅ ใช้ rate limiting เพื่อป้องกันการใช้งานในทางที่ผิด
- ✅ บันทึก log ความพยายามยืนยันตัวตนที่ล้มเหลว
ประสิทธิภาพ
Section titled “ประสิทธิภาพ”- ⚡ ตอบกลับอย่างรวดเร็ว — ยืนยันการรับภายใน 5 วินาที
- ⚡ ประมวลผลงานหนักแบบ asynchronous (ใช้ queue)
- ⚡ อย่ารอการเรียก API ภายนอกก่อนตอบกลับ
- ⚡ ใช้การจัดการข้อผิดพลาดที่เหมาะสมเพื่อป้องกันการล่ม
ความน่าเชื่อถือ
Section titled “ความน่าเชื่อถือ”- 🔄 จัดการความล้มเหลวอย่างเหมาะสม — บันทึก log ข้อผิดพลาดและดำเนินการต่อ
- 🔄 เก็บ webhook ใน queue สำหรับ retry logic
- 🔄 ตรวจสอบ uptime ของ endpoint ของคุณ
- 🔄 ตั้งค่าการแจ้งเตือนสำหรับความล้มเหลวของ webhook
ตัวอย่าง: รูปแบบการประมวลผลแบบ Async
Section titled “ตัวอย่าง: รูปแบบการประมวลผลแบบ Async”import Queue from "bull";
const webhookQueue = new Queue("webhooks");
// Webhook endpoint - responds immediatelyapp.post("/webhook", verifyToken, async (req, res) => { // Add to queue for async processing await webhookQueue.add(req.body);
// Respond immediately res.status(200).send("Webhook queued.");});
// Process webhooks asynchronouslywebhookQueue.process(async (job) => { const message = job.data;
// Do heavy processing here await saveToDatabase(message); await sendNotifications(message); await updateAnalytics(message);});การแก้ปัญหา
Section titled “การแก้ปัญหา”Webhook ไม่ได้รับคำขอ
Section titled “Webhook ไม่ได้รับคำขอ”ตรวจสอบ:
- ✅ เซิร์ฟเวอร์ของคุณเข้าถึงได้แบบสาธารณะหรือไม่?
- ✅ URL ของคุณใช้ HTTPS หรือไม่?
- ✅ เซิร์ฟเวอร์ของคุณกำลังทำงานและรอรับที่พอร์ตที่ถูกต้องหรือไม่?
- ✅ มีกฎ firewall ใดๆ ที่บล็อกคำขอขาเข้าหรือไม่?
- ✅ webhook URL ตั้งค่าถูกต้องใน DealDroid หรือไม่?
ได้รับข้อผิดพลาด 403 Forbidden
Section titled “ได้รับข้อผิดพลาด 403 Forbidden”สาเหตุ: Verify token ไม่ตรงกัน
วิธีแก้:
- ตรวจสอบว่า token ในการตั้งค่า DealDroid ของคุณตรงกับโค้ดเซิร์ฟเวอร์
- ตรวจสอบช่องว่างหรือตัวอักษรพิเศษที่เกิน
- ตรวจสอบว่าคุณกำลังอ่าน
verify_tokenจาก query parameter ไม่ใช่จาก body
Webhook หมดเวลา
Section titled “Webhook หมดเวลา”สาเหตุ: เซิร์ฟเวอร์ของคุณใช้เวลานานเกินไปในการตอบกลับ
วิธีแก้:
- ตอบกลับด้วย
200 OKทันที - ย้ายการประมวลผลหนักไปยัง background jobs
- ใช้ async/await อย่างถูกต้อง
- ใช้ queuing สำหรับงานที่ใช้เวลานาน
เสร็จแล้ว! 🎉
Section titled “เสร็จแล้ว! 🎉”ตอนนี้คุณกำลังรับ webhook แบบเรียลไทม์จากบอท DealDroid ของคุณแล้ว!
เมื่อตั้งค่า webhook เรียบร้อยแล้ว คุณสามารถสร้างการเชื่อมต่อที่ทรงพลังซึ่งขยายความสามารถของบอทของคุณไปไกลเกินกว่าแดชบอร์ด DealDroid ไม่ว่าคุณจะบันทึกการสนทนา เรียกใช้การแจ้งเตือน หรือสร้างเวิร์กโฟลว์แบบกำหนดเอง — ความเป็นไปได้ไม่มีที่สิ้นสุด
จำไว้ว่า: รักษา endpoint ของคุณให้เร็ว ปลอดภัย และเชื่อถือได้ Webhook ของคุณคือสะพานเชื่อมระหว่าง DealDroid และระบบแบบกำหนดเองของคุณ
ต้องการความช่วยเหลือหรือไม่? เรายินดีสนับสนุนคุณ! 😊