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

ตอบความคิดเห็น TikTok ผ่าน API: ตรวจสอบโพสต์และความคิดเห็นระดับบนสุดก่อน

การตอบความคิดเห็น TikTok ผ่าน UnifyPort ต้องเริ่มจากโพสต์ที่ตรวจสอบแล้วว่าเป็นของบัญชีที่เชื่อมต่อ และความคิดเห็นที่ยืนยันว่าอยู่ระดับบนสุด จากนั้นเรียก POST /v1/accounts/{account_id}/posts/comments/reply พร้อม post_id, comment_id และ text นี่ไม่ใช่การส่ง DM หรือเครื่องมือสำหรับตอบบนวิดีโอใดก็ได้ ผล accepted หมายถึงรับคำขอแล้ว ไม่ได้รับประกันการแสดงผลสาธารณะ การส่งถึง หรือการเกิด webhook

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

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

แยก API ความคิดเห็นออกจาก API กล่องข้อความ

เอกสารทางการ Query Video Comments ของ TikTok อธิบายการอ่านผ่าน Research API โดยใช้ video_id เพื่ออ่านความคิดเห็น หรือ comment_id เพื่ออ่านคำตอบ และใช้ scope research.data.basic นี่เป็นคนละสัญญา API กับการโพสต์คำตอบผ่านบัญชีที่เชื่อมต่อ อย่านำ ID ชนิดตัวเลข พารามิเตอร์แบ่งหน้า หรือส่วนหัวการยืนยันตัวตนมาใช้กับคำขอ UnifyPort โดยตรง

บทความ เปรียบเทียบ TikTok Business Messaging กับกล่องข้อความที่เชื่อมต่อด้วย QR ก็เป็นเรื่องสถาปัตยกรรมข้อความส่วนตัว ความคิดเห็นสาธารณะไม่ใช่ปลายทางการสนทนาของ API ส่งข้อความทั่วไป

บทความนี้ใช้ unofficial interface ของ UnifyPort สำหรับ โพสต์ของบัญชี TikTok ที่เข้าสู่ระบบอยู่เท่านั้น หากยังไม่ได้เชื่อมต่อ ให้ทำตาม ขั้นตอนอนุญาต TikTok ด้วย QR ก่อน ตรวจสอบว่าอนุญาตสำเร็จและ runtime_status: running ก่อนทำรายการ เก็บ API key ของเวิร์กสเปซไว้ฝั่งเซิร์ฟเวอร์ และตรวจสอบสิทธิ์ผู้ปฏิบัติงานต่อบัญชีที่เลือก แม้ใช้หน้าจอร่วมกับ LINE ก็ไม่ควรอนุมานว่าทุกช่องทางรองรับการตอบความคิดเห็นแบบเดียวกัน

อ่านโพสต์และความคิดเห็นก่อนเปิดปุ่มตอบ

งานเมธอดและเส้นทาง APIขอบเขต
ค้นหาโพสต์ของตนเองGET /v1/accounts/{account_id}/postsเฉพาะโพสต์ของบัญชีที่เข้าสู่ระบบ
ตรวจสอบโพสต์POST /v1/accounts/{account_id}/posts/infoส่ง post_id ใน JSON และตรวจสอบเจ้าของ
อ่านความคิดเห็นPOST /v1/accounts/{account_id}/posts/comments/listเฉพาะระดับบนสุด ส่งข้อมูลแบ่งหน้าใน JSON
ตอบความคิดเห็นPOST /v1/accounts/{account_id}/posts/comments/replyเป้าหมายระดับบนสุดที่ยืนยันแล้วบนโพสต์ตนเอง

เริ่มด้วย รายการโพสต์ของบัญชี แล้วใช้ อ่านข้อมูลโพสต์ กับโพสต์ที่เลือก URL วิดีโอที่วางเข้ามาไม่ใช่หลักฐานว่าเป็นเจ้าของ

ในการเรียก รายการความคิดเห็นระดับบนสุด ให้ส่ง post_id และ limit โดย limit มีค่าเริ่มต้น 20 และช่วงที่รองรับคือ 1–50 หน้าแรกต้องละ cursor ไม่ใช่ส่งสตริงว่าง หาก data.has_more เป็น true ให้ส่ง data.next_cursor กลับเป็น cursor โดยไม่แก้ไข หน้าสุดท้ายจะไม่คืนเคอร์เซอร์

ผูกลำดับการแบ่งหน้าไว้กับบัญชีและโพสต์เดิม เลือกเป้าหมายด้วย ID ที่ได้รับ ไม่ใช่ตำแหน่งในอาร์เรย์หรือชื่อที่แสดง จำนวนรายการน้อยในหน้าไม่ใช่เหตุผลให้ละเลย has_more และการอ่านล้มเหลวไม่ใช่รายการว่าง

ฟิลด์เนื้อหาและผู้เขียนจะมีเมื่อข้อมูลพร้อมใช้งานเท่านั้น text ที่ถูกละไว้หมายถึงไม่ทราบ ไม่ใช่ความคิดเห็นว่าง หากไม่มี created_at อย่าใส่เวลาที่ระบบคุณพบข้อมูลแทน เก็บ post_id เป็นสตริงจำนวนเต็มบวกฐานสิบที่ไม่มีศูนย์นำหน้า และอย่าแปลง ID โพสต์หรือความคิดเห็นเป็น JavaScript number

ส่งคำตอบที่ตรวจทานแล้วเพียงครั้งเดียว

ก่อนส่ง ให้ผู้ปฏิบัติงานเห็นโพสต์ ความคิดเห็น บัญชี และร่างคำตอบ แนะนำให้บันทึกเป้าหมายพร้อมข้อความที่อนุมัติไว้ในแอป เพื่อป้องกันรายการที่รีเฟรชทำให้เป้าหมายการเขียนเปลี่ยนไป

ตัวอย่างนี้เรียก API ตอบความคิดเห็นระดับบนสุด หนึ่งครั้ง โดยรับ ID จริงจากการเลือกที่ตรวจสอบแล้วและ API key ฝั่งเซิร์ฟเวอร์ ไม่ใช่ระบบอนุมัติที่สมบูรณ์ ไม่ตรวจสอบเจ้าของในเครื่อง และไม่มีการลองใหม่อัตโนมัติ

async function replyToTikTokComment({
  apiKey, accountId, postId, commentId, text
}) {
  if (typeof postId !== 'string' || !/^[1-9][0-9]*$/.test(postId)) {
    throw new Error('Use the returned post ID string');
  }
  if (typeof commentId !== 'string' || !commentId.trim() ||
      typeof text !== 'string' || !text.trim()) {
    throw new Error('Select a comment and provide reply text');
  }
  if (typeof accountId !== 'string' || !accountId.trim()) {
    throw new Error('Select the connected account');
  }
  const response = await fetch(
    `https://api.unifyport.ai/v1/accounts/${encodeURIComponent(accountId)}/posts/comments/reply`,
    {
      method: 'POST',
      headers: {
        'X-Api-Key': apiKey,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        post_id: postId, comment_id: commentId, text
      })
    }
  );
  const result = await response.json();
  return { httpStatus: response.status, result };
}

การตรวจช่องว่างปฏิเสธข้อมูลว่างโดยไม่เปลี่ยนข้อความที่อนุมัติ หากเครือข่ายหรือการแปลงผลตอบกลับล้มเหลวหลังส่ง ให้เก็บสถานะว่าผลยังไม่ทราบ อย่าครอบฟังก์ชันนี้ด้วยลูปลอง POST ใหม่ทั่วไป

ตีความผลโดยไม่สรุปเกินหลักฐาน

ผลลัพธ์ความหมายการจัดการที่แนะนำ
200, data.status: acceptedรับคำขอแล้วเก็บผล แต่อย่าระบุว่าแสดงสาธารณะแล้ว
data.comment ซึ่งอาจมีหรือไม่มีก็ได้มีข้อมูลยืนยันที่เชื่อถือได้ของความคิดเห็นใหม่เก็บเมื่อมี ไม่ใช้เป็นเงื่อนไขบังคับของการรับคำขอ
403 post_inaccessibleเข้าถึงโพสต์ไม่ได้ โดยไม่ได้ระบุสาเหตุหยุดและตรวจสอบ อย่าทำเครื่องหมายว่าถูกลบ
404 post_not_foundตรวจสอบแล้วว่าไม่พบโพสต์รีเฟรชการเลือก
404 comment_not_foundไม่พบเป้าหมายหลังตรวจสอบเลือกใหม่ ไม่ได้แปลว่าค้นหาคำตอบซ้อนทั้งหมดแล้ว
501 unsupported_by_providerช่องทางไม่รองรับ หรือยืนยันว่าเป็นเป้าหมายซ้อนหยุด อย่าเปลี่ยนไปส่ง DM โดยพลการ
502 reply_post_comment_failed เมื่อยืนยันผลหลังเขียนไม่ได้ไม่ทราบผลการเขียนพักไว้ตรวจทาน ไม่ส่งซ้ำอัตโนมัติ

การตรวจสอบที่ไม่สมบูรณ์จะหยุดการเขียน การอ่านที่ตรวจสอบไม่ครบอาจลองใหม่ได้ แต่ไม่ได้ทำให้การส่งคำตอบที่ผลไม่ชัดเจนปลอดภัยต่อการทำซ้ำ การอ่านภายหลังที่ไม่พบคำตอบ ไม่ใช่หลักฐานว่าคำตอบไม่เคยถูกสร้าง โดยเฉพาะเมื่อ API รายการอ่านเฉพาะความคิดเห็นระดับบนสุด

จัดคิวการเขียนเป้าหมายเดียวกันในแอป ป้องกันการกดซ้ำ และเก็บ request_id พร้อมผล HTTP นี่เป็นมาตรการฝั่งแอป ไม่ใช่การรับประกัน idempotency ของ API อย่าใส่เนื้อหาความคิดเห็นลูกค้าหรือ API key ในบันทึกทั่วไป

เพิ่มการแจ้งเตือนเป็นชั้นรับข้อมูลแยกต่างหาก

รายการอีเวนต์มาตรฐาน ระบุ post.comment.created แต่การสมัครอีเวนต์อย่างเดียวไม่ได้เปิดการ polling ความคิดเห็น ซึ่งปิดไว้โดยค่าเริ่มต้น การตั้ง provider_data.enable_comment: true ต้องเริ่มระบบหรือเชื่อมต่อใหม่ และการเปลี่ยนขณะออนไลน์ต้องเชื่อมต่อใหม่ ตรวจสอบความพร้อมของสภาพแวดล้อมและตัวรับก่อน การเริ่มสำเร็จไม่ใช่หลักฐานว่าค่ามีผลแล้ว และการปิด polling ไม่ถอนอีเวนต์ที่อยู่ในคิว

ใช้การแจ้งเตือนเป็นสัญญาณแบบ best-effort ที่อาจช้า ซ้ำ สลับลำดับ หรือขาดหาย ไม่ใช่ประวัติทั้งหมดหรือหลักฐานยืนยันทุกคำตอบ ตรวจลายเซ็นตาม สัญญาการส่ง webhook และกำจัดรายการซ้ำด้วย event ID แม้ไม่มี parent_comment_id ก็ยังต้องตรวจสอบเป้าหมายก่อนตอบ

คำถามที่พบบ่อย

ตอบความคิดเห็นบนวิดีโอ TikTok ใดก็ได้หรือไม่?

ไม่ได้ในขั้นตอนนี้ ต้องตรวจสอบว่าโพสต์เป็นของบัญชีที่เข้าสู่ระบบ และตอบได้เฉพาะความคิดเห็นระดับบนสุดที่ยืนยันแล้ว

accepted หมายถึงแสดงคำตอบแล้วหรือไม่?

ไม่ใช่ ไม่ได้รับประกันการแสดงผลหรือการส่งถึง ข้อมูลยืนยันความคิดเห็นเป็นทางเลือก และไม่รับประกัน webhook

อ่านคำตอบซ้อนทั้งหมดด้วยการแบ่งหน้าได้หรือไม่?

ไม่ได้ API รายการของ UnifyPort ครอบคลุมเฉพาะระดับบนสุด ส่วน TikTok Research API เป็นสัญญาการอ่านอีกแบบ ไม่ใช่ endpoint ที่ใช้แทนกันได้

ควรทดสอบอะไรก่อนเปิดใช้งาน?

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

ขั้นตอนต่อไปและแหล่งข้อมูล

เริ่มทำหน้าจอเลือกแบบอ่านอย่างเดียวด้วย รายการความคิดเห็นระดับบนสุด ก่อนเปิดการส่งคำตอบ

ตรวจสอบแหล่งข้อมูลเมื่อ 2026-10-26:

UnifyPort API

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

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