← บทความทั้งหมด
บทช่วยสอน

เพิ่มและลบรีแอ็กชันข้อความด้วย UnifyPort

หากต้องการเพิ่มรีแอ็กชันผ่าน UnifyPort ให้เรียก POST /v1/messages/reaction โดยระบุบัญชี บทสนทนา ข้อความ ผู้ส่งข้อความต้นฉบับ และ emoji หากต้องการลบรีแอ็กชันเดิมของบัญชีที่เชื่อมต่อ ให้ใช้เป้าหมายเดิมและส่ง emoji: "" จุดสำคัญคือ sender_id หมายถึงผู้เขียนข้อความที่ต้องการตอบด้วยรีแอ็กชัน ไม่ใช่เจ้าหน้าที่ผู้กดปุ่ม หรือผู้ใช้คนใดก็ได้ที่คุณต้องการเปลี่ยนรีแอ็กชันของเขา

ประเด็นสำคัญ

  • คำสั่งส่งรองรับ whatsapp และ telegram ส่วนการรับอีเวนต์รีแอ็กชันเป็นอีกความสามารถหนึ่ง
  • เลือกเป้าหมายจากข้อความต้นฉบับ ไม่ใช่ ID ของตัวรีแอ็กชันในอีเวนต์
  • ระบุ sender_id เมื่อเป็นข้อความของผู้อื่น หากละไว้ ค่าเริ่มต้นจะเป็นบัญชีที่เชื่อมต่อเอง
  • แยกคำสั่งเพิ่มกับลบอย่างชัดเจน อย่าสร้างปุ่มสลับที่ลองซ้ำโดยไม่ทราบผลเดิม

จับคู่ฟิลด์กับข้อความต้นฉบับ

เอกสาร React to message กำหนดการทำงานกับข้อความที่มีอยู่แล้ว ไม่ใช่การส่งข้อความใหม่ที่มีอีโมจิ และไม่ใช้โทเค็นสำหรับตอบแบบอ้างอิง

ฟิลด์ในคำขอแหล่งข้อมูลจาก message.received ที่เก็บไว้
account_idaccount_id ระดับบนสุด
conversation_iddata.conversation.id
message_iddata.message.id
sender_iddata.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 ที่คืนมา แต่ไม่ควรตีความว่าอีกฝ่ายเห็นรีแอ็กชันแล้ว

แนวทางที่แนะนำสำหรับแอป:

  1. จัดคำสั่งของบัญชีและข้อความเป้าหมายเดียวกันให้ทำงานตามลำดับ อย่าให้งานเพิ่มเก่าทำงานหลังคำสั่งลบใหม่
  2. บันทึกอีโมจิที่ต้องการก่อนส่ง และเก็บผล HTTP แยกกัน
  3. เมื่อพบ react_message_failed ให้ตรวจข้อผิดพลาดและเป้าหมายเดิม หากหมดเวลารอ ให้คงสถานะผลไม่แน่ชัด อย่าส่งคำสั่งตรงข้ามเพื่อชดเชยอัตโนมัติ
  4. เมื่อมีอีเวนต์ที่ตรงกัน ให้ปรับสถานะแบบ 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:

UnifyPort API

เปลี่ยนการเชื่อมต่อข้อความให้เป็น pipeline ผลิตภัณฑ์ที่เสถียร

เริ่มจากการส่งผ่าน API เดียว แล้วส่งข้อความขาเข้าทั้งหมดกลับสู่ระบบธุรกิจของคุณด้วย event มาตรฐาน