ย้ายแชต WhatsApp ระหว่างป้ายกำกับ: ส่งต่องานผ่าน API อย่างปลอดภัย
การย้ายแชต WhatsApp ระหว่างป้ายกำกับขั้นตอนงานผ่าน UnifyPort ต้องเปลี่ยนความสัมพันธ์สองครั้ง: เพิ่มป้ายปลายทาง ตรวจสอบผล แล้วจึงนำป้ายต้นทางออก เอกสารไม่ได้รับประกันการย้ายแบบอะตอมมิก ควรเก็บป้ายที่ไม่เกี่ยวข้องไว้ และแสดงงานส่งต่อที่ยังไม่แน่นอนว่าไม่เสร็จ อย่าลบตัวป้ายกำกับ หรือถือว่า timeout ยืนยันว่าไม่มีการเปลี่ยนแปลงเกิดขึ้น
ประเด็นสำคัญ
action: "remove"นำป้ายออกจากบทสนทนาที่เลือก ไม่ใช่การลบตัวป้ายกำกับ- แชตมีหลายป้ายพร้อมกันได้ จึงไม่ได้บังคับให้มีผู้รับผิดชอบหรือขั้นตอนงานเพียงหนึ่งเดียว
- เพิ่มก่อนนำออกช่วยรักษาการมองเห็น แต่ระหว่างทางจะมีทั้งสองป้ายชั่วคราว
- เก็บข้อมูลมอบหมายงานหลักและความคืบหน้าการส่งต่อไว้ในแอป ไม่อนุมานจากป้ายเพียงอย่างเดียว
กำหนดสิ่งที่จะย้าย ไม่ใช่แทนที่ป้ายทั้งหมด
คำแนะนำเรื่องป้ายกำกับของ WhatsApp อธิบายการจัดระเบียบแชตและการใช้หลายป้ายกับแชตเดียว อีกทั้งระบุว่ากำลังทยอยเปลี่ยนป้ายกำกับเป็นรายการ การเปลี่ยนชื่อในหน้าจอไม่ได้หมายความว่าฟิลด์ label_id ของ UnifyPort เปลี่ยนชื่อ หรือทุกรายการในแอปมี API ที่เทียบกันได้
ลองดู สถานการณ์สมมติ: แชตมีป้าย “รอดำเนินการ” และ “VIP” เจ้าหน้าที่ต้องการย้ายไป “กำลังดำเนินการ” สิ่งที่ต้องทำคือเพิ่ม “กำลังดำเนินการ” นำ “รอดำเนินการ” ออก และคง “VIP” ไว้ ไม่ใช่แทนที่ป้ายทั้งหมดด้วยป้ายใหม่
อัปเดต API เดือนมิถุนายน แนะนำคำสั่งป้ายกำกับไว้แล้ว แต่สำหรับการส่งต่องาน ต้องแยกเป้าหมายของแต่ละคำสั่งให้ชัดเจน:
| เจตนา | คำสั่ง | เป้าหมาย |
|---|---|---|
| สร้างหรือเปลี่ยนชื่อหมวด | สร้างหรืออัปเดตป้าย | ตัวป้ายกำกับ |
| เพิ่มปลายทาง | ความสัมพันธ์ action: "add" | บทสนทนาที่เลือกภายใต้ป้ายนั้น |
| นำต้นทางออก | ความสัมพันธ์ action: "remove" | บทสนทนาที่เลือกภายใต้ป้ายนั้น |
| เลิกใช้หมวด | ลบป้าย | ตัวป้าย ไม่ใช่ความสัมพันธ์ของแชตเดียว |
อย่าใช้การลบป้ายแทนการนำป้ายออกจากแชตหนึ่งรายการ เพราะแชตอื่นอาจยังใช้หมวดนั้นอยู่
เตรียมคำสั่งทั้งสอง
อ่านรายการป้ายกำกับ ของบัญชีรับส่งข้อความที่เลือก เพื่อหา ID ต้นทางและปลายทาง อ่านให้ครบตามการแบ่งหน้า ชื่อเป็นข้อความแสดงผล ไม่ใช่กุญแจระบุตัวตนที่คงที่ หากต้องสร้างปลายทาง ให้ใช้สร้างหรืออัปเดตป้าย แล้วเก็บ data.id ที่ตอบกลับ
ระบุ conversation_id ของแชตภายใต้บัญชีเดียวกัน อย่าใช้ชื่อป้าย ชื่อที่แสดงของผู้ติดต่อ หรือ ID ข้อความแทน ID บทสนทนา ตรวจสอบตารางรองรับคำสั่ง ก่อน: คำสั่งป้ายเหล่านี้รองรับ whatsapp ในปัจจุบัน ไม่รองรับ LINE, Telegram, Zalo หรือผู้ให้บริการแยกต่างหากอย่าง whatsapp-protocol หากทีมใช้ LINE ร่วมกับ WhatsApp ต้องออกแบบหมวดหมู่ของ LINE ในแอปแยกจากคำสั่งนี้
เอกสารความสัมพันธ์ของป้าย กำหนดให้ใช้ POST /v1/accounts/{account_id}/conversations/labels พร้อม label_id, action และอาร์เรย์ conversation_ids ที่ไม่ว่าง
ฟังก์ชัน JavaScript ฝั่งเซิร์ฟเวอร์ต่อไปนี้ทำเพียง หนึ่งคำสั่ง โดยตั้งใจไม่ทำการส่งต่อทั้งหมดอัตโนมัติ ส่ง ID จริงที่แบ็กเอนด์เลือกและ API key ที่เก็บอย่างปลอดภัยเข้าไป โค้ดนี้เป็นตัวอย่างประกอบ ไม่ใช่ไคลเอนต์ production ที่ผ่านการทดสอบแล้ว
async function changeLabelMembership({
apiKey, accountId, labelId, conversationIds, action
}) {
const validId = value => typeof value === 'string' && value.trim() !== '';
if (!validId(accountId) || !validId(labelId) ||
!Array.isArray(conversationIds) || conversationIds.length === 0 ||
!conversationIds.every(validId) || !['add', 'remove'].includes(action)) {
throw new Error('Select an account, label, conversations, and action');
}
const response = await fetch(
`https://api.unifyport.ai/v1/accounts/${encodeURIComponent(accountId)}/conversations/labels`,
{
method: 'POST',
headers: { 'X-Api-Key': apiKey, 'Content-Type': 'application/json' },
body: JSON.stringify({
label_id: labelId,
action,
conversation_ids: [...new Set(conversationIds)]
})
}
);
const result = await response.json();
return { httpStatus: response.status, result };
}
ครั้งแรกใช้ ID ปลายทางและ add ส่วนครั้งถัดไปใช้ ID ต้นทางและ remove กับแชตเดิม ปฏิเสธกรณีต้นทางและปลายทางเป็น ID เดียวกันในแอป ตรวจสอบ HTTP status และข้อมูลตอบกลับ เพราะ fetch ที่จบตามปกติไม่ได้แปลว่าสำเร็จเสมอไป ข้อมูลสำเร็จตามเอกสารระบุ label_id, action และ conversation_ids ที่ได้รับผล
ตรวจสอบระหว่างเพิ่มและนำออก
ขั้นตอนนี้เป็นคำแนะนำในการออกแบบแอป ไม่ใช่การรับประกันธุรกรรมจาก UnifyPort:
- บันทึกบัญชี บทสนทนา ต้นทาง และปลายทางไว้ในระบบของคุณ ตรวจสอบสิทธิ์ของเจ้าหน้าที่ในการเปลี่ยนการมอบหมาย
- เพิ่มป้ายปลายทาง เก็บผลตอบกลับและ
request_idโดยไม่บันทึก API key - เรียกรายการบทสนทนา พร้อม
label_idของปลายทางอย่างชัดเจน ยืนยันว่าแชตที่เลือกปรากฏก่อนนำต้นทางออก - นำออกเฉพาะความสัมพันธ์กับต้นทาง คงป้ายอิสระอย่าง VIP ไว้
- ตรวจสอบทั้งสองมุมมอง หากผลไม่ตรงกับที่ตั้งใจ ให้แสดงว่างานยังไม่เสร็จ
อย่าใช้รายการที่ไม่ได้ระบุป้ายเพื่อตรวจสอบปลายทาง ตามสัญญา API ของ WhatsApp หากไม่ส่ง label_id จะได้เฉพาะบทสนทนาที่ติดดาวหรือให้ความสนใจเป็นพิเศษ คู่มือตรวจสอบแชตที่หายและตัวกรองป้าย อธิบายขอบเขตนี้และการแบ่งหน้า การไม่พบในหน้าแรกไม่ได้พิสูจน์ว่าไม่มี และการอ่านล้มเหลวไม่ใช่ผลลัพธ์ว่าง การอ่านหลายหน้าแบบสดไม่ได้รับประกันว่าเป็น snapshot ที่ไม่เปลี่ยนแปลง
| ความสัมพันธ์ที่สังเกตได้ | ความหมายสำหรับงานนี้ | การดำเนินการที่แนะนำ |
|---|---|---|
| มีต้นทางเท่านั้น | ยังไม่พบปลายทาง | เก็บต้นทางไว้และตรวจสอบคำสั่งเพิ่ม |
| มีทั้งสองป้าย | สถานะระหว่างทาง หรือมีผู้อื่นแก้ไข | ยืนยันเจตนาปัจจุบันก่อนนำต้นทางออก |
| มีปลายทางเท่านั้น | พบรูปแบบความสัมพันธ์ที่ต้องการ | บันทึกว่าเสร็จหากการมอบหมายในแอปยังตรงกัน |
| ไม่มีทั้งคู่ หรืออ่านไม่ครบ | ยังสรุปไม่ได้ | เก็บงานในแอปและตรวจสอบ ไม่เดาว่าเสร็จแล้ว |
กู้คืนโดยไม่ทำเจตนาเก่าซ้ำ
เรียงลำดับการเปลี่ยนแปลงของบทสนทนาเดียวกันในแอป และปฏิเสธงานคิวที่ล้าสมัยก่อนส่ง หากเจ้าหน้าที่คนอื่นเปลี่ยนผู้รับผิดชอบแล้ว อย่าทำการส่งต่อเก่าให้เสร็จโดยไม่ตรวจสอบ การเรียงลำดับในแอปไม่สามารถล็อกทุกไคลเอนต์ที่เชื่อมโยงได้ จึงต้องตรวจเทียบการเปลี่ยนแปลงภายนอกด้วย
หากคำสั่งเพิ่ม timeout ให้คงต้นทางและอ่านปลายทางก่อนตัดสินใจ หากผลการนำออกไม่แน่นอน ให้ตรวจทั้งสองมุมมองก่อนทำซ้ำ อย่าลบปลายทางอัตโนมัติเพื่อ “ย้อนคืน” เพราะผู้อื่นอาจใช้งานป้ายนั้นแล้ว
เอกสารสาธารณะไม่ได้รับประกันความเป็นอะตอมมิกระหว่างสองคำสั่ง การสำเร็จหรือล้มเหลวทั้งแบตช์ เงื่อนไขตรวจเวอร์ชันก่อนเขียน หรือ webhook เฉพาะสำหรับการเปลี่ยนป้าย สำหรับงานจำนวนมาก ให้เก็บความคืบหน้าแยกตามบทสนทนา ไม่ใช่ถือว่าทั้งแบตช์เป็นการมอบหมายที่เสร็จแล้ว set_label_members_failed ใช้กับความล้มเหลวฝั่งเซิร์ฟเวอร์หรือระบบต้นทางตามเอกสาร ส่วน unsupported_by_provider คือขอบเขตความสามารถ ไม่ใช่เหตุผลให้ retry ไม่สิ้นสุด
คำถามที่พบบ่อย
เพิ่มป้ายใหม่แล้วป้ายเก่าจะหายเองหรือไม่?
ไม่ API มีคำสั่งเพิ่มและนำออกแยกกัน ให้จัดการความสัมพันธ์ของแต่ละป้ายอย่างอิสระ
ใช้ป้ายบังคับให้มีเจ้าหน้าที่เพียงคนเดียวได้หรือไม่?
สัญญา API นี้ไม่รับประกัน เก็บผู้รับผิดชอบและสิทธิ์ในแอป แล้วใช้ป้ายเป็นภาพสะท้อนของการตัดสินใจนั้นในฝั่งผู้ให้บริการ
conversation.updated จะยืนยันการส่งต่อหรือไม่?
อย่าตั้งสมมติฐานเช่นนั้น การตั้งค่าที่ระบุในเอกสารมีปิดเสียง เก็บถาวร ปักหมุด และสถานะอ่าน ไม่ใช่ใบยืนยันความสัมพันธ์ของป้ายที่รับประกันว่าจะส่งมา
นี่เป็นคำสั่งทางการของ WhatsApp Cloud API หรือไม่?
ไม่ใช่ เป็น endpoint ของ UnifyPort ผ่านอินเทอร์เฟซที่ไม่เป็นทางการสำหรับบัญชีที่เชื่อมต่อแล้ว คู่มือแอป WhatsApp อธิบายแนวคิดสำหรับผู้ใช้ ไม่ใช่สัญญา API นี้
ขั้นตอนถัดไปและแหล่งอ้างอิง
เริ่มจากเพิ่มหรือนำป้ายออกจากบทสนทนา ทดสอบการส่งต่อปกติ เพิ่มปลายทางล้มเหลว นำออกแล้ว timeout การแก้ไขแข่งกัน การแบ่งหน้า และการคงป้ายอื่นไว้ในบัญชีที่ควบคุมได้ ก่อนเปิดการย้ายจำนวนมาก รายการเหล่านี้เป็นข้อเสนอสำหรับการทดสอบ ไม่ใช่ผลที่ทดสอบแล้ว
ตรวจสอบแหล่งข้อมูลเมื่อ 2026-10-14:
เปลี่ยนการเชื่อมต่อข้อความให้เป็น pipeline ผลิตภัณฑ์ที่เสถียร
เริ่มจากการส่งผ่าน API เดียว แล้วส่งข้อความขาเข้าทั้งหมดกลับสู่ระบบธุรกิจของคุณด้วย event มาตรฐาน