ข้ามไปยังเนื้อหา

รับ Webhook ข้อความ

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


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

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

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

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
  • หมุนเวียนเป็นระยะเพื่อความปลอดภัย

เมื่อมีการส่งหรือรับข้อความ DealDroid จะทำคำขอ POST ไปยัง webhook URL ของคุณพร้อม verify token แนบมาเป็น query parameter

https://your-server.com/webhook?verify_token=your_verify_token_here_2024

สำคัญ: ตรวจสอบ query parameter verify_token ให้ตรงกับ token ที่คุณตั้งค่าไว้เสมอก่อนประมวลผลคำขอ เพื่อให้แน่ใจว่า webhook มาจากบอท DealDroid ของคุณจริงๆ


ทุกคำขอ 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"
}

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 ของเวลาที่สร้างข้อความ

ถึงเวลาสร้าง endpoint เซิร์ฟเวอร์ของคุณเพื่อรับและประมวลผล webhook นี่คือตัวอย่างที่สมบูรณ์โดยใช้ 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 ทันทีเพื่อยืนยันการรับ

หากคุณกำลังพัฒนาในเครื่อง ใช้ 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
  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

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);
}
}
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}"`,
});
}
}
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}`,
});
}
}

  • ตรวจสอบ verify token เสมอ ก่อนประมวลผลคำขอ
  • ✅ ใช้ HTTPS สำหรับ webhook URL ของคุณ
  • ✅ เก็บ token ใน environment variables ไม่ใช่ในโค้ด
  • ✅ ใช้ rate limiting เพื่อป้องกันการใช้งานในทางที่ผิด
  • ✅ บันทึก log ความพยายามยืนยันตัวตนที่ล้มเหลว
  • ตอบกลับอย่างรวดเร็ว — ยืนยันการรับภายใน 5 วินาที
  • ⚡ ประมวลผลงานหนักแบบ asynchronous (ใช้ queue)
  • ⚡ อย่ารอการเรียก API ภายนอกก่อนตอบกลับ
  • ⚡ ใช้การจัดการข้อผิดพลาดที่เหมาะสมเพื่อป้องกันการล่ม
  • 🔄 จัดการความล้มเหลวอย่างเหมาะสม — บันทึก log ข้อผิดพลาดและดำเนินการต่อ
  • 🔄 เก็บ webhook ใน queue สำหรับ retry logic
  • 🔄 ตรวจสอบ uptime ของ endpoint ของคุณ
  • 🔄 ตั้งค่าการแจ้งเตือนสำหรับความล้มเหลวของ webhook
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);
});

ตรวจสอบ:

  • ✅ เซิร์ฟเวอร์ของคุณเข้าถึงได้แบบสาธารณะหรือไม่?
  • ✅ URL ของคุณใช้ HTTPS หรือไม่?
  • ✅ เซิร์ฟเวอร์ของคุณกำลังทำงานและรอรับที่พอร์ตที่ถูกต้องหรือไม่?
  • ✅ มีกฎ firewall ใดๆ ที่บล็อกคำขอขาเข้าหรือไม่?
  • ✅ webhook URL ตั้งค่าถูกต้องใน DealDroid หรือไม่?

สาเหตุ: Verify token ไม่ตรงกัน

วิธีแก้:

  • ตรวจสอบว่า token ในการตั้งค่า DealDroid ของคุณตรงกับโค้ดเซิร์ฟเวอร์
  • ตรวจสอบช่องว่างหรือตัวอักษรพิเศษที่เกิน
  • ตรวจสอบว่าคุณกำลังอ่าน verify_token จาก query parameter ไม่ใช่จาก body

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

วิธีแก้:

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

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

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

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

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