รู้ครบจบในที่เดียวกับการดึง User Profile ผ่าน API ต่างๆใน LINE

Jirawatee
LINE Developers Thailand
4 min readFeb 18, 2020

--

ข้อมูลของผู้ใช้ คือสิ่งหนึ่งที่นักพัฒนา LINE สามารถเก็บได้จาก APIs และมีความสำคัญในการที่จะใช้แบ่งกลุ่มของผู้ใช้(segmentation) และ กำหนดกลุ่มเป้าหมายในอนาคต(retargeting)

ซึ่งข้อมูลของผู้ใช้ที่เราสามารถเก็บได้จาก LINE APIs จะประกอบไปด้วย

  • userId: ID ของผู้ใช้(สำหรับระบบหลังบ้าน)
  • displayName: ชื่อของผู้ใช้
  • statusMessage: ข้อความของผู้ใช้
  • pictureUrl: รูปของผู้ใช้
  • email: อีเมลของผู้ใช้(เฉพาะ LIFF v2 และ LINE Login)

เนื้อหาหลักของบทความนี้จะถูกแบ่งออกเป็น 4 เรื่อง โดยจะเกี่ยวข้องกับ Messaging API, LINE Login และ LIFF ดังนี้

  1. วิธีการเก็บ User ID ใน Messaging API
  2. วิธีการดึง User Profile ใน Messaging API
  3. วิธีการดึง User Profile ใน LINE Login
  4. วิธีการดึง User Profile ใน LIFF

1. วิธีการเก็บ User ID ใน Messaging API

ก่อนที่เราจะไปลงเรื่อง Messaging API กัน ผมขออธิบายเกี่ยวกับบัญชีประเภทต่างๆสักเล็กน้อย เนื่องจากมันจะมีผลกับ API บางตัวที่จะพูดถึงต่อไป

  • Premium: บัญชีสำหรับองค์กร(enterprise) ที่ได้รับการรับรองจากทาง LINE โดยสัญลักษณ์คือ โล่สีเขียว สามารถสมัครผ่าน Partner ได้ ที่นี่
  • Verified: บัญชีที่ได้รับการรับรองจากทาง LINE โดยสัญลักษณ์คือ โล่สีน้ำเงิน สามารถสมัครได้ ที่นี่
  • Unverified: บัญชีทั่วไป สำหรับทั้งร้านค้าและบุคคล โดยสัญลักษณ์คือ โล่สีเทา สามารถสมัครได้ ที่นี่

และการที่จะได้มาซึ่งข้อมูลของผู้ใช้นั้น เราจะต้องรู้ userId ของผู้ใช้ซะก่อน และ userId ที่ว่าจะไม่ใช่ LINE ID ที่คนมักเข้าใจผิดกัน

  • LINE ID: จะเป็น ID ที่คนทั่วไปใช้สื่อสารกัน ในการค้นหาเพื่อน หรือเพิ่มเพื่อน โดยจะเป็นตัวเลขและตัวอักษร ระหว่าง 4–20 ตัว เช่น Brown
  • User ID: จะเป็น ID ที่ให้ระบบหลังบ้านใช้สื่อสารกัน โดยจะขึ้นต้นด้วยตัว U และมี string ตามหลังอีก 32 ตัว เช่น U3c28a70ed7c5e7ce2c9a75976328c426

1.1 เก็บ User ID จาก Webhook Events

วิธีนี้เราจะดักเก็บ userId จาก event ต่างๆที่ผู้ใช้ interact กับ Bot ซึ่งผมคิดว่าผู้อ่านน่าจะพอทราบกันมาบ้างแล้ว หรือถ้ายังไม่เคยได้ยินมาก่อน ก็ให้อ่านบทความนี้

สิ่งที่จะเน้นย้ำในข้อนี้คือ ไม่ว่าผู้ใช้จะ interact กับ chatbot แบบ 1-ต่อ-1, Group หรือ Room เราก็จะเห็น userId ได้ แม้ว่าจะผู้ใช้คนนั้นจะเป็นเพื่อนกับ Bot หรือไม่ก็ตาม

1.2 เก็บ User ID ของ Followers ใน Account (Verified or Premium)

วิธีนี้จะเป็นการดึงค่า userId ทั้งหมดจากสมาชิกที่เพิ่ม Bot เราเป็นเพื่อนแล้ว โดยมีเงื่อนไขว่า account ของ Bot จะต้องเป็นโล่สีน้ำเงิน หรือโล่สีเขียวเท่านั้น

// HTTP Request
GET
https://api.line.me/v2/bot/followers/ids
// Headers
Content-Type
: application/json
Authorization: Bearer CHANNEL-ACCESS-TOKEN
// Query param
start: token ที่ใช้เพื่อดึง userIds รอบถัดไป (Optional)

// Response
userIds:
Array ของ userIds (max 1,000 userIds/request)
next: token สำหรับ param ชื่อ start (จะแสดงเมื่อมี userIds เกิน 1,000)

ตัวอย่างผลลัพธ์

{
"userIds": [
"Uc36f4348726a9e77...",
"Ufebd5a5236d4ae26...",
"U103769535ed04b7c..."
...
],
"next":"yANU9IA..."
}

การเขียนโค้ดเพื่อ fetch ข้อมูล userId ออกมาทั้งหมด คุณจะต้องตรวจสอบผลลัพธ์ว่ามี object ชื่อ next ติดมาด้วยหรือไม่ โดยถ้ามี ก็ให้ทำการ request รอบต่อไป

1.3 เก็บ User ID ของสมาชิกทั้งหมดใน Group (Verified or Premium)

วิธีนี้จะเป็นการดึงค่า userId ทั้งหมดจากสมาชิกใน Group ที่มี Bot ของเราสิงอยู่ โดยมีเงื่อนไขว่า account ของ Bot จะต้องเป็นโล่สีน้ำเงิน หรือ โล่สีเขียวเท่านั้น และนอกจากนี้เราจะต้องมีค่า groupId ซึ่งหาได้จาก webhook events ในกลุ่มนั้น

// HTTP Request
GET
https://api.line.me/v2/bot/group/groupId/members/ids

// Headers
Authorization: Bearer CHANNEL-ACCESS-TOKEN
//Query param
start: token ที่ใช้เพื่อดึง userIds รอบถัดไป (Optional)
// Response
memberIds:
Array ของ userIds (max 100 userIds/request)
next: token สำหรับ param ชื่อ start (จะแสดงเมื่อมี userIds เกิน 100)

ตัวอย่างผลลัพธ์

{
"memberIds": [
"Uc36f4348726a9e77...",
"Ufebd5a5236d4ae26...",
"U103769535ed04b7c..."
...
],
"next":"jxEWCEEP..."
}

1.4 เก็บ User ID ของสมาชิกทั้งหมดใน Room (Verified or Premium)

วิธีนี้จะเป็นการดึงค่า userId ทั้งหมดจากสมาชิกใน Room ที่มี Bot ของเราสิงอยู่ โดยมีเงื่อนไขว่า account ของ Bot จะต้องเป็นโล่สีน้ำเงิน หรือ โล่สีเขียวเท่านั้น และนอกจากนี้เราจะต้องมีค่า roomId ซึ่งหาได้จาก webhook events ในห้องนั้น

// HTTP Request
GET
https://api.line.me/v2/bot/room/roomId/members/ids

// Headers
Authorization: Bearer CHANNEL-ACCESS-TOKEN
//Query param
start: token ที่ใช้เพื่อดึง userIds รอบถัดไป (Optional)
// Response
memberIds:
Array ของ userIds (max 100 userIds/request)
next: token สำหรับ param ชื่อ start (จะแสดงเมื่อมี userIds เกิน 100)

ตัวอย่างผลลัพธ์

{
"memberIds": [
"Uc36f4348726a9e77...",
"Ufebd5a5236d4ae26...",
"U103769535ed04b7c..."
...
],
"next":"jxEWCEEP..."
}

2. วิธีการดึง User Profile ใน Messaging API

ปกติการดึงข้อมูลของผู้ใช้นั้น ตัว Bot จะต้องเป็นเพื่อนกับผู้ใช้คนนั้นๆซะก่อน แต่สำหรับ Group และ Room ถ้าเรารู้ userId เราก็สามารถดึง user profile ได้ด้วย

2.1 ดึง Profile ของ Followers (เป็นเพื่อนกับ Bot)

วิธีนี้จะเป็นการดึง user profile ด้วย userId ที่เราเก็บมาได้ โดยมีเงื่อนไขว่า เจ้าของ userId ดังกล่าวจะต้องเป็นเพื่อนกับ Bot ของเราแล้วเท่านั้น

// HTTP Request
GET
https://api.line.me/v2/bot/profile/userId

// Headers
Authorization: Bearer CHANNEL-ACCESS-TOKEN

ตัวอย่างผลลัพธ์ กรณีผู้ใช้คนดังกล่าวเป็นเพื่อนกับ Bot

{
"userId": "U3c28a70ed7c5e7ce...",
"displayName": "󠀠Jirawatee",
"pictureUrl": "https://profile.line...",
"statusMessage": "Tech Evangelist",
"language": "en"
}

ตัวอย่างผลลัพธ์ กรณีผู้ใช้คนดังกล่าวไม่ได้เป็นเพื่อน หรือ block Bot

{
"message": "Not found"
}

2.2 ดึง Profile ของสมาชิกใน Group (ไม่จำเป็นต้องเป็นเพื่อนกับ Bot)

วิธีนี้จะเป็นการดึง user profile ในกรณีที่เรารู้ groupId(หาได้จาก webhook events) และ userId โดยมีข้อแม้ว่า Bot และ สมาชิกคนดังกล่าว ต้องยังคงอยู่ในกลุ่ม

// HTTP Request
GET
https://api.line.me/v2/bot/group/groupId/member/userId

// Headers
Authorization: Bearer CHANNEL-ACCESS-TOKEN

ตัวอย่างผลลัพธ์ กรณี Bot และ สมาชิกคนดังกล่าว อยู่ในกลุ่ม

{
"userId": "U3c28a70ed7c5e7ce...",
"displayName": "󠀠Jirawatee",
"pictureUrl": "https://profile.line...",
}

ตัวอย่างผลลัพธ์ กรณี Bot หรือ สมาชิกคนดังกล่าว ไม่อยู่ในกลุ่ม

{
"message": "Not found"
}

2.3 ดึง Profile ของสมาชิกใน Room (ไม่จำเป็นต้องเป็นเพื่อนกับ Bot)

วิธีนี้จะเป็นการดึง user profile ในกรณีที่เรารู้ roomId(หาได้จาก webhook events) และ userId โดยมีข้อแม้ว่า Bot และ สมาชิกคนดังกล่าว ต้องยังคงต้องอยู่ในห้อง

// HTTP Reuqest
GET
https://api.line.me/v2/bot/room/roomId/member/userId

// Headers
Authorization: Bearer CHANNEL-ACCESS-TOKEN

ตัวอย่างผลลัพธ์ กรณี Bot และ สมาชิกคนดังกล่าว อยู่ในห้อง

{
"userId": "U3c28a70ed7c5e7ce...",
"displayName": "󠀠Jirawatee",
"pictureUrl": "https://profile.line...",
}

ตัวอย่างผลลัพธ์ กรณี Bot หรือ สมาชิกคนดังกล่าว ไม่อยู่ในห้อง

{
"message": "Not found"
}

3. วิธีการดึง User Profile ใน LINE Login

LINE Login เป็นบริการที่เปิดให้นักพัฒนาเอา SDK ไปติดตั้งใน platform ต่างๆ(Web, Android, iOS, Flutter และ Unity) เพื่อให้ผู้ใช้งานสามารถยืนยันตัวตนผ่าน LINE account ได้ โดยที่เราสามารถดึง email ของผู้ใช้ออกมาได้ด้วย ใครสนใจก็แนะนำให้ศึกษาจากบทความนี้ได้เลย

4. วิธีการดึง User Profile ใน LIFF

LIFF หรือ LINE Front-end Framework เป็นเทคโนโลยีที่ให้เราสร้างเว็บในห้องแชท และทำงานร่วมกับ Bot ได้ โดยเมื่อเปิด LIFF เราก็สามารถดึง user profile ของผู้ที่เปิด LIFF ขึ้นมาได้ แถมวิธีนี้ก็ดึง email ได้เช่นกัน

สรุป

เมื่อคุณอ่านมาถึงตรงนี้ นั่นก็หมายความว่า คุณได้รู้วิธีในการดึง user profile ใน LINE ด้วย APIs ครบทุกวิธีแล้ว แต่ผมขอย้ำจุดที่น่าสนใจ 4 จุด ที่ถ้าอ่านเพลินๆคุณอาจพลาดไป

  • อย่างไรเราก็สามารถเก็บ userId และ user profile จาก Group หรือ Room ได้ แม้สมาชิกจะไม่ได้เป็นเพื่อนกับ Bot + แม้ประเภท account จะเป็นแบบ Unverified (โล่เทา) ก็ตาม
  • การดึง user profile ใน Group หรือ Room นั้นจะไม่ได้ค่า statusMessage มาด้วย ซึ่งผมเองก็ยังสงสัยเหมือนกัน เอาเป็นว่าจะไปหาคำตอบมาให้ แล้วจะมาอัพเดทในโอกาสถัดไป
  • เราไม่สามารถส่งข้อความด้วย userId หาผู้ใช้ที่ไม่ได้เป็นเพื่อนกับ Bot ได้
  • การดึง email จะทำผ่าน LINE Login และ LIFF v2 ได้เท่านั้น และค่าอีเมลจะมีหรือไม่ ขึ้นอยู่กับว่าผู้ใช้คนนั้นๆได้ผูกอีเมลกับ account ของเขาแล้วหรือยัง

สุดท้ายนี้ เพื่อที่คุณจะไม่พลาดบทความตอนใหม่ๆจาก LINE Developers Thailand ก็อย่าลืมกด Follow กันไว้นะครับ แล้วพบกันใหม่บทความหน้า

--

--

Jirawatee
LINE Developers Thailand

Technology Evangelist at LINE Thailand / Google Developer Expert in Firebase