เพิ่มและลบรีแอ็กชันข้อความด้วย UnifyPort
หากต้องการเพิ่มรีแอ็กชันผ่าน UnifyPort ให้เรียก POST /v1/messages/reaction โดยระบุบัญชี บทสนทนา ข้อความ ผู้ส่งข้อความต้นฉบับ และ emoji หากต้องการลบรีแอ็กชันเดิมของบัญชีที่เชื่อมต่อ ให้ใช้เป้าหมายเดิมและส่ง emoji: "" จุดสำคัญคือ sender_id หมายถึงผู้เขียนข้อความที่ต้องการตอบด้วยรีแอ็กชัน ไม่ใช่เจ้าหน้าที่ผู้กดปุ่ม หรือผู้ใช้คนใดก็ได้ที่คุณต้องการเปลี่ยนรีแอ็กชันของเขา
ประเด็นสำคัญ
- คำสั่งส่งรองรับ
whatsappและtelegramส่วนการรับอีเวนต์รีแอ็กชันเป็นอีกความสามารถหนึ่ง - เลือกเป้าหมายจากข้อความต้นฉบับ ไม่ใช่ ID ของตัวรีแอ็กชันในอีเวนต์
- ระบุ
sender_idเมื่อเป็นข้อความของผู้อื่น หากละไว้ ค่าเริ่มต้นจะเป็นบัญชีที่เชื่อมต่อเอง - แยกคำสั่งเพิ่มกับลบอย่างชัดเจน อย่าสร้างปุ่มสลับที่ลองซ้ำโดยไม่ทราบผลเดิม
จับคู่ฟิลด์กับข้อความต้นฉบับ
เอกสาร React to message กำหนดการทำงานกับข้อความที่มีอยู่แล้ว ไม่ใช่การส่งข้อความใหม่ที่มีอีโมจิ และไม่ใช้โทเค็นสำหรับตอบแบบอ้างอิง
| ฟิลด์ในคำขอ | แหล่งข้อมูลจาก message.received ที่เก็บไว้ |
|---|---|
account_id | account_id ระดับบนสุด |
conversation_id | data.conversation.id |
message_id | data.message.id |
sender_id | data.sender.id ของผู้เขียนข้อความต้นฉบับ |
emoji | อีโมจิที่เลือก หรือสตริงว่างเมื่อต้องการลบ |
ในกลุ่ม ID บทสนทนาหมายถึงกลุ่ม ส่วน ID ผู้ส่งหมายถึงสมาชิก อย่าแทนที่ ID บทสนทนาด้วย ID ผู้ส่งเพียงเพราะในแชตส่วนตัวค่าดูคล้ายกัน เก็บตัวระบุที่แพลตฟอร์มส่งมาโดยไม่ดัดแปลง และอย่าสร้างขึ้นจากชื่อหรือเบอร์โทรของผู้ติดต่อ
หากเริ่มจากอีเวนต์ message.reaction ต้องแยกอีกชั้นหนึ่ง: data.message.id ระบุตัวรีแอ็กชัน ส่วน data.message.target_message_id ชี้ไปยังข้อความต้นฉบับ ผู้ส่งของอีเวนต์นี้คือคนที่ทำรีแอ็กชัน ไม่จำเป็นต้องเป็นผู้เขียนข้อความเดิม จึงควรค้นหาข้อความต้นฉบับที่เก็บไว้ก่อนสร้างคำสั่งใหม่ บทความประมวลผล reaction webhook อธิบายด้านรับข้อมูลและปรับสถานะ ส่วนบทความนี้อธิบายด้านส่งคำขอ
สร้างคำขอเพิ่มหรือลบอย่างชัดเจน
JavaScript ด้านล่างเป็นตัวอย่างสร้างคำขอ ไม่ใช่ผลการทดสอบที่รันแล้วหรือระบบรับ webhook แบบสมบูรณ์ อินพุตต้องเป็นอีเวนต์ข้อความต้นฉบับที่ผ่านการตรวจลายเซ็น เก็บถาวร และถูกเลือกโดยเจ้าหน้าที่ที่มีสิทธิ์ ชื่อฟังก์ชันและข้อความผิดพลาดเป็นโค้ดภายในแอป
function buildReactionRequest(original, emoji) {
if (original.type !== 'message.received' ||
!['whatsapp', 'telegram'].includes(original.provider)) {
throw new Error('Select a supported original message');
}
const conversation = original.data?.conversation;
const message = original.data?.message;
const sender = original.data?.sender;
if (!original.account_id || !conversation?.id ||
!message?.id || !sender?.id) {
throw new Error('Original message context is incomplete');
}
if (typeof emoji !== 'string') {
throw new Error('Choose an emoji or an empty string');
}
return {
account_id: original.account_id,
conversation_id: conversation.id,
message_id: message.id,
sender_id: sender.id,
emoji
};
}
ส่ง "👍" เพื่อขอเพิ่มรีแอ็กชัน หรือ "" เพื่อขอลบ ฟังก์ชันนี้ตรวจเฉพาะบริบทและชนิดข้อมูล ไม่ได้ยืนยันว่าระบบต้นทางยอมรับทุกอีโมจิ อย่าใช้ null ละฟิลด์ หรือเพิ่มแฟล็ก remove ที่ไม่มีในเอกสารแทนสตริงว่าง
ให้แบ็กเอนด์ส่ง JSON ที่ได้ไปยัง POST /v1/messages/reaction โดยใช้ X-Api-Key อย่าใส่คีย์ในโค้ดเบราว์เซอร์ ก่อนส่งต้องตรวจสิทธิ์ของเจ้าหน้าที่ต่อบัญชีรับส่งข้อความและข้อความเป้าหมาย พร้อมตรึงรายการที่เลือกไว้ เพื่อไม่ให้ข้อความใหม่เปลี่ยนเป้าหมายระหว่างทำงาน
หากต้องการตอบเป็นประโยคโดยอ้างอิงข้อความเดิม ให้ใช้ ขั้นตอนตอบแบบอ้างอิงของ WhatsApp แทน reply_token ในขั้นตอนนั้นไม่ใช่ตัวระบุรีแอ็กชัน
เปิดปุ่มตามความสามารถในการส่ง ไม่ใช่ความสามารถในการรับ
ตารางรองรับคำสั่ง และ ตารางรองรับอีเวนต์ webhook ระบุความสามารถคนละด้าน
| ผู้ให้บริการ | ส่งรีแอ็กชันผ่าน API นี้ | การแมปอีเวนต์รีแอ็กชัน |
|---|---|---|
whatsapp | รองรับ | รองรับ |
telegram | รองรับ | รองรับ |
line | ไม่รองรับ | รองรับ |
twitter, zalo, tiktok, whatsapp-protocol | ไม่รองรับ | ไม่รองรับ |
สำหรับกล่องข้อความที่รวม LINE ต้องระวังจุดนี้เป็นพิเศษ การแสดงรีแอ็กชันที่เข้ามาได้ไม่ได้แปลว่าส่งกลับได้ ตารางเป็นการแมปของอะแดปเตอร์ตามเอกสาร ไม่ได้รับประกันทุกบัญชีหรือทุกเงื่อนไขของระบบต้นทาง คู่ที่ไม่รองรับจะคืน 501 unsupported_by_provider การเรียกซ้ำไม่ได้เพิ่มความสามารถ
UnifyPort เป็นอินเทอร์เฟซที่ไม่เป็นทางการสำหรับบัญชีที่เชื่อมต่อ ส่วน Bot API ทางการของ Telegram มี setMessageReaction สำหรับบอตแยกต่างหาก หากต้องใช้ตัวตนบอต ให้ใช้สัญญา API นั้น อย่านำโครงสร้างคำขอหรือข้อจำกัดมาใช้กับ UnifyPort โดยตรง
แยกเจตนา ผลคำขอ และสถานะที่สังเกตได้
เอกสารแสดงผลสำเร็จเป็น 200 OK พร้อม data.ok: true เก็บผล HTTP จริงและ request_id ที่คืนมา แต่ไม่ควรตีความว่าอีกฝ่ายเห็นรีแอ็กชันแล้ว
แนวทางที่แนะนำสำหรับแอป:
- จัดคำสั่งของบัญชีและข้อความเป้าหมายเดียวกันให้ทำงานตามลำดับ อย่าให้งานเพิ่มเก่าทำงานหลังคำสั่งลบใหม่
- บันทึกอีโมจิที่ต้องการก่อนส่ง และเก็บผล HTTP แยกกัน
- เมื่อพบ
react_message_failedให้ตรวจข้อผิดพลาดและเป้าหมายเดิม หากหมดเวลารอ ให้คงสถานะผลไม่แน่ชัด อย่าส่งคำสั่งตรงข้ามเพื่อชดเชยอัตโนมัติ - เมื่อมีอีเวนต์ที่ตรงกัน ให้ปรับสถานะแบบ idempotent อย่าสมมติว่าทุกคำขอมี callback หรือ callback จะมาตามลำดับ
ฝั่งรับควรกำหนด signing_secret และทำตาม เอกสารการส่ง webhook: ตรวจ HMAC-SHA256 จาก timestamp จุด และ raw body ตรวจความใหม่ของเวลา แล้วเก็บถาวรก่อนตอบรับ การได้รับ webhook ไม่ใช่สิทธิ์ให้เริ่มคำสั่งส่งใหม่โดยอัตโนมัติ
รายการทดสอบและคำถามที่พบบ่อย
ก่อนเปิดใช้ ให้ทดสอบข้อความส่วนตัวที่รับมา ข้อความของสมาชิกกลุ่มอื่น ข้อความที่บัญชีส่งเอง การลบด้วยสตริงว่าง ผู้ให้บริการที่ไม่รองรับ และผลเครือข่ายที่ไม่แน่ชัด ตรวจด้วยว่าข้อความใหม่ไม่เปลี่ยนเป้าหมายที่เลือก นี่เป็นรายการทดสอบที่แนะนำ ไม่ใช่ผลการทดสอบที่ดำเนินการแล้ว
sender_id เลือกได้หรือไม่ว่าใครเป็นคนทำรีแอ็กชัน?
ไม่ได้ ฟิลด์นี้ระบุผู้เขียนข้อความที่เป็นเป้าหมาย บัญชีที่เชื่อมต่อเป็นผู้ดำเนินการ และใช้ฟิลด์นี้สวมตัวตนคนอื่นไม่ได้
ส่งอีโมจิเดิมอีกครั้งจะลบหรือไม่?
วิธีลบที่ระบุในเอกสารคือ emoji: "" อย่าสมมติว่าเป็นการสลับสถานะ
ทำไมรับรีแอ็กชัน LINE ได้ แต่ส่งไม่ได้?
การแปลงอีเวนต์ขาเข้าและคำสั่งขาออกมีตารางรองรับแยกกัน ปัจจุบันคำสั่งส่งรีแอ็กชันรองรับ Telegram และ WhatsApp
ขั้นตอนถัดไปและแหล่งข้อมูล
เริ่มจากตรวจเป้าหมายตาม React to message ก่อนเพิ่มปุ่มในกล่องข้อความ หากหลักฐานไม่ครบ ให้คงสถานะไม่แน่ชัด อย่าสมมติว่ามี API อ่านรีแอ็กชันหรือระบบส่งย้อนหลังที่รับประกัน
ตรวจสอบเมื่อ 2026-10-16:
เปลี่ยนการเชื่อมต่อข้อความให้เป็น pipeline ผลิตภัณฑ์ที่เสถียร
เริ่มจากการส่งผ่าน API เดียว แล้วส่งข้อความขาเข้าทั้งหมดกลับสู่ระบบธุรกิจของคุณด้วย event มาตรฐาน