Skip to content

รับ Webhook ข้อความ

อยากรู้ว่าลูกค้าของคุณส่งข้อความมาเมื่อไหร่ใช่ไหม? Webhook ช่วยให้บอท DealDroid ของคุณส่งการแจ้งเตือนแบบเรียลไทม์ไปยังเซิร์ฟเวอร์ของคุณสำหรับทุกข้อความ — ช่วยให้คุณสร้างการเชื่อมต่อแบบกำหนดเอง ติดตามการสนทนา และสร้างเวิร์กโฟลว์อัตโนมัติที่ทรงพลัง


ลองคิดว่า webhook เป็นเหมือนกริ่งประตูสำหรับแอปของคุณ ทุกครั้งที่ลูกค้าส่งข้อความมาหา Droid ของคุณ DealDroid จะส่งคำขอ POST ไปยังเซิร์ฟเวอร์ของคุณทันทีพร้อมรายละเอียดข้อความทั้งหมด

กรณีการใช้งานทั่วไป:

  • 📊 วิเคราะห์และติดตาม — บันทึกทุกการสนทนาเพื่อวิเคราะห์
  • 🔔 การแจ้งเตือนแบบกำหนดเอง — แจ้งเตือนทีมของคุณผ่าน Slack, Discord หรืออีเมล
  • 💾 เชื่อมต่อฐานข้อมูล — เก็บข้อความในฐานข้อมูลของคุณเอง
  • 🤖 ระบบอัตโนมัติจากบุคคลที่สาม — เรียกใช้เวิร์กโฟลว์ในเครื่องมืออย่าง Zapier หรือ Make
  • 🔍 ตรวจสอบคุณภาพ — ตรวจสอบการตอบกลับของ AI แบบเรียลไทม์

ขั้นตอนที่ 1: ตั้งค่า Webhook ของคุณ

Section titled “ขั้นตอนที่ 1: ตั้งค่า Webhook ของคุณ”

Webhook configuration in automation panel

ไปที่ Automation Panel ในแดชบอร์ด DealDroid ของคุณและตั้งค่าสองส่วนสำคัญ:

นี่คือ URL สาธารณะของ endpoint เซิร์ฟเวอร์ของคุณที่จะรับคำขอ POST จาก webhook

ตัวอย่าง: https://your-server.com/webhook

ข้อกำหนด:

  • ต้องเข้าถึงได้แบบสาธารณะ (DealDroid ต้องเข้าถึงได้)
  • ต้องใช้ HTTPS (เพื่อความปลอดภัย)
  • ควรตอบกลับอย่างรวดเร็ว (ภายใน 5 วินาที)

สร้าง 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 พร้อมข้อมูลรายละเอียดเกี่ยวกับข้อความ

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
};
{
"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”
FieldTypeคำอธิบาย
midstringตัวระบุที่ไม่ซ้ำกันสำหรับข้อความนี้โดยเฉพาะ
chatIdnumberID ที่ไม่ซ้ำกันสำหรับเธรดการสนทนา
customerIdnumberID ที่ไม่ซ้ำกันสำหรับผู้ใช้ปลายทาง
droidIdnumberID ที่ไม่ซ้ำกันสำหรับบอทของคุณ
channelIdnumberID ที่ไม่ซ้ำกันสำหรับช่องทางการสื่อสาร (Facebook, LINE ฯลฯ)

ฟิลด์ type บอกว่าใครเป็นผู้ส่งข้อความ:

Valueคำอธิบาย
humanข้อความจากลูกค้า
aiข้อความจากบอท DealDroid ของคุณ
systemการแจ้งเตือนหรือเหตุการณ์ของระบบ
logข้อความ log ภายใน
adminข้อความจากเจ้าหน้าที่/แอดมิน

ออบเจ็กต์ content มี payload ข้อความจริง:

FieldTypeคำอธิบาย
typestringรูปแบบของเนื้อหาข้อความ
valuestring or string[]เนื้อหาข้อความเอง
altstring (optional)ข้อความทางเลือกสำหรับการเข้าถึง
TypeValue Formatตัวอย่าง
textstring"Hello, I have a question"
imagestring (URL)"https://example.com/image.jpg"
buttonstring[] (array)["Apple", "Orange", "Banana"]
carouselstring"Send carousel to user"
FieldTypeคำอธิบาย
notestring (optional)หมายเหตุใดๆ ที่เกี่ยวข้องกับข้อความ
createdAtstringISO 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 variable
const VERIFY_TOKEN = process.env.VERIFY_TOKEN || "your_verify_token_here";
// Middleware to verify the token
const 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 bodies
app.use(express.json());
// Define the webhook endpoint
app.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 logic
function 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 server
app.listen(PORT, () => {
console.log(`🚀 Webhook server is running on port ${PORT}`);
console.log(
`📡 Ready to receive webhooks at http://localhost:${PORT}/webhook`
);
});
  1. ความปลอดภัยเป็นอันดับแรก: middleware verifyToken ตรวจสอบ query parameter verify_token ก่อนประมวลผลคำขอใดๆ
  2. แปลง JSON: Express แปลง JSON body โดยอัตโนมัติ
  3. ประมวลผลข้อความ: ฟังก์ชัน processMessage แบบกำหนดเองของคุณจัดการ webhook payload
  4. ตอบกลับอย่างรวดเร็ว: เซิร์ฟเวอร์ตอบกลับด้วย 200 OK ทันทีเพื่อยืนยันการรับ

ขั้นตอนที่ 5: ทดสอบ Webhook ของคุณ

Section titled “ขั้นตอนที่ 5: ทดสอบ Webhook ของคุณ”

ทดสอบในเครื่องด้วย ngrok

Section titled “ทดสอบในเครื่องด้วย ngrok”

หากคุณกำลังพัฒนาในเครื่อง ใช้ ngrok เพื่อเปิดเผยเซิร์ฟเวอร์ในเครื่องของคุณสู่อินเทอร์เน็ต:

Terminal window
# Install ngrok (if not already installed)
brew install ngrok
# Start your local server
node server.js
# In another terminal, expose it
ngrok http 3000

ngrok จะให้ URL สาธารณะเช่น:

https://abc123def.ngrok.io

ใช้ URL นี้ในการตั้งค่า webhook ของ DealDroid:

https://abc123def.ngrok.io/webhook

ทดสอบด้วยข้อความจริง

Section titled “ทดสอบด้วยข้อความจริง”
  1. ตั้งค่า webhook URL และ secret ใน DealDroid
  2. ส่งข้อความทดสอบไปยัง Droid ของคุณผ่าน Facebook, LINE หรือแชทเว็บไซต์ของคุณ
  3. ตรวจสอบ log ของเซิร์ฟเวอร์เพื่อยืนยันว่าได้รับ webhook แล้ว
  4. ตรวจสอบว่าข้อมูลถูกต้อง

ผลลัพธ์ log ที่คาดหวัง:

✅ Webhook received successfully
Message ID: ddtp-ckz9abc123xyz
Message Type: human
Content: { 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 “แนวทางปฏิบัติที่ดี”
  • ตรวจสอบ verify token เสมอ ก่อนประมวลผลคำขอ
  • ✅ ใช้ HTTPS สำหรับ webhook URL ของคุณ
  • ✅ เก็บ token ใน environment variables ไม่ใช่ในโค้ด
  • ✅ ใช้ rate limiting เพื่อป้องกันการใช้งานในทางที่ผิด
  • ✅ บันทึก log ความพยายามยืนยันตัวตนที่ล้มเหลว
  • ตอบกลับอย่างรวดเร็ว — ยืนยันการรับภายใน 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 immediately
app.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 asynchronously
webhookQueue.process(async (job) => {
const message = job.data;
// Do heavy processing here
await saveToDatabase(message);
await sendNotifications(message);
await updateAnalytics(message);
});

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

สาเหตุ: เซิร์ฟเวอร์ของคุณใช้เวลานานเกินไปในการตอบกลับ

วิธีแก้:

  • ตอบกลับด้วย 200 OK ทันที
  • ย้ายการประมวลผลหนักไปยัง background jobs
  • ใช้ async/await อย่างถูกต้อง
  • ใช้ queuing สำหรับงานที่ใช้เวลานาน

ตอนนี้คุณกำลังรับ webhook แบบเรียลไทม์จากบอท DealDroid ของคุณแล้ว!

เมื่อตั้งค่า webhook เรียบร้อยแล้ว คุณสามารถสร้างการเชื่อมต่อที่ทรงพลังซึ่งขยายความสามารถของบอทของคุณไปไกลเกินกว่าแดชบอร์ด DealDroid ไม่ว่าคุณจะบันทึกการสนทนา เรียกใช้การแจ้งเตือน หรือสร้างเวิร์กโฟลว์แบบกำหนดเอง — ความเป็นไปได้ไม่มีที่สิ้นสุด

จำไว้ว่า: รักษา endpoint ของคุณให้เร็ว ปลอดภัย และเชื่อถือได้ Webhook ของคุณคือสะพานเชื่อมระหว่าง DealDroid และระบบแบบกำหนดเองของคุณ

ต้องการความช่วยเหลือหรือไม่? เรายินดีสนับสนุนคุณ! 😊