Petch Kruapanich
readmoreth
Published in
2 min readSep 29, 2018

--

How to: ทำยังไงให้ LINE Chatbot มีเพื่อนได้มากกว่า 50 คน

Photo credit Michael Prewett

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

ถ้าดูจากโจทย์แล้ว การพัฒนา LINE Chatbot ตัวนี้ไม่ใช่เรื่องยาก และซับซ้อนอะไรเลย เพราะมันคือการพัฒนาแชทบอททั่วๆไปนี่แหละ แต่ความยากของมันกลับเป็น เราจะนำแชทบอทตัวนี้ไปให้แขกกว่า 400 คนใช้ มันจะติดข้อจำกัดนึงก็คือ เมื่อเปิดใช้งาน Bot กับ LINE แล้ว ตัว LINE Channel จะรองรับเพื่อนได้แค่ 50 คนเท่านั้น

LINE Chatbot รองรับเพื่อนได้ 50 คน

เมื่อพูดถึงการพัฒนาแชทบอท โดยเลือก LINE เป็น ฺBot Channel ข้อจำกัดที่ทำให้พวกเรานักพัฒนาหงุดหงิดใจ ก็คือตัวบอทจะสามารถมีเพื่อนได้เพียง 50 คน หรือพูดขยายความให้ชัดเจนก็คือ จะมีได้แค่ 50 LINE Accounts ที่จะสามารถกดปุ่ม Add Friends เข้าหาบอทของเราได้

แนวทางการแก้ไข ก็คือไปเข้าร่วมโครงการ LINE Scale up ไม่ก็ใช้เงินในการแก้ปัญหา โดยการซื้อ Official Account ซะ ซึ่งแน่นอนเราไม่สามารถไปในแนวทางนั้นได้ เพราะสิ่งที่ทำนี่ค่อนข้างส่วนบุคคลมาก จะเข้า LINE Scale up ก็คงไม่ผ่าน และจะเสียเงินหลักล้านเพื่อมาทำเจ้าสิ่งนี้ี้ ว่าที่ภรรยาก็คงจะไม่ค่อยพอใจเท่าไร แนวทางที่พอจะเป็นไปได้ก็คือ ทำการ Coding บางอย่าง เพื่อมาแก้ไขปัญหานั้นเอง

Landing Architecture

หลังจากลองหาข้อมูล เบื้องต้น และลองผิดลองถูกมาประมาณนึง เลยได้ข้อสรุปออกมาว่า ในการพัฒนาครั้งนี้เราจะแยกออกเป็น 2 ส่วนประกอบด้วย

  1. การพัฒนา Web hook เพื่อจัดการ Logic ต่างๆของตัวแชทบอท
    โดยในส่วนนี้เราจะไม่ลงรายละเอียดเยอะ ขอแค่พัฒนา Webhook ขึ้นมาอันนึง จากนั้นเอาไปลงทะเบียนกับ Bot แต่ละตัวที่ developers.line.me
  2. การพัฒนาส่วน Landing page ที่สามารถแยกได้ว่าผู้ใช้งานที่เข้ามาเป็นใคร จากนั้นค่อยพาเค้าไปยังห้องสนทนาที่เค้าเคยเข้าไปแล้ว หรือเลือกห้องให้เขา จึงออกมาเป็น Architecure ดังภาพ
LINE Bot Landing Architecture

สำหรับการออกแบบครั้งนี้ เราใช้วิธีสร้าง LINE@ ขึ้นมาตามจำนวนแขกที่ต้องการให้รองรับ เช่นถ้าต้องการ 500 คน ก็สร้าง LINE@ ขึ้นมา 10 ตัว จากนั้นทำการพัฒนา Landing page ที่ผู้ใช้งาน จะเข้ามาเจอบอทของเรา หลังจาก Scan QR code หรือกด Link เข้ามา ซึ่งจำเป็นจะต้องแยกให้ได้ว่าคนๆนั้นคือใคร ถ้าไม่อย่างนั้นจะเกิดเหตุการณ์ที่คนเดิม Scan QR Code ซ้ำ แล้วก็ถูกพาไปห้องใหม่ แทนที่จะกลับมาห้องที่เค้าเคยคุยอยู่

ดังนั้นเราเลยต้องเอา LINE Login มาคั่น เมื่อผู้ใช้ Scan QR Code เพื่อเปิด Landing page แล้ว จะพบกับช่องทางให้ผู้ใช้งาน Login ซึ่งตรงนี้สามารถกด Login with LINE ได้เลย ตัว LINE Platform ก็จะพาไปยัง Flow ของการขอสิทธิ์ และจบที่ LINE Platform จะ return JWT Token กลับมา

ให้ทำการถอดรหัสข้อมูล และเมื่อถอดรหัสแล้วก็จะได้ json หน้าตาประมาณนี้

{
"iss": "https://access.line.me",
"sub": "U1234567890abcdef1234567890abcdef ",
"aud": "1234567890",
"exp": 1504169092,
"iat": 1504263657,
"nonce": "0987654asdf",
"name": "Taro Line",
"picture": "https://sample_line.me/aBcdefg123456"
}

สำหรับจุดนี้ ข้อมูลที่เราต้องการ ก็คือ Id ของผู้ใช้งาน ซึ่งก็คือ “sub” นั้นเอง จากนั้นจะเป็นหน้าที่ของ Registration Logic ที่เราพัฒนาขึ้น โดยให้ตรวจสอบ และค้นหาจากฐานข้อมูลว่าผู้ใช้งานคนนี้เคยมีห้องสนทนารึยัง ถ้ายังระบบ็จะเลือกห้อง LINE@ ให้ และบันทึกลงฐานข้อมูล

จากนั้นจะ Redirect หรือเปิดหน้าเว็บใหม่ ด้วย Url ประมาณนี้

https://line.me/R/ti/p/@[LINE@]

ซึ่ง Url นี้จะทำให้ LINE วิ่งไปที่ห้องสนทนาโดยอัตโนมัติ หรือกรณีที่ยังไม่เคย Add Friends กันก็พาไปที่หน้า Add Friends ให้

เพียงเท่านี้เราก็จะสามารถสร้าง LINE Chatbot ที่รองรับเพื่อนได้มากกว่า 50 คนแล้ว ซึ่งวิธีนี้อาจจะไม่ใช่วิธีที่ดีเท่าไร เพราะมีความถึกในการสร้าง LINE Channel เยอะมากๆ แต่ถ้าเราต้องการพัฒนาแชทบอทเพื่อใช้ภายในองค์กร แนวทางนี้อาจจะพอช่วยให้ทุกคนเอาไปลองทำอะไรเล่นมันส์ๆได้

แต่อย่างไรก็ตามแนวทางนี้ก็ยังมีช่องโหว่ อยู่เล็กๆน้อยๆเหมือนกันคือ

  1. ตัวบอทไม่รองรับการ Recommend ถ้ามีคน Recommend เข้า Channel ใดเยอะเกินไป เพื่อนก็จะเต็มได้อยู่ดี
  2. เวลาใช้งานจำเป็นต้องมีการ Login ก่อน ซึ่งขั้นตอนนี้อาจจะมองว่ายากเกินไปสำหรับ User บางกลุ่ม การเลือกใช้แนวทางนี้ต้องดูว่าผู้ใช้ของเราเหมาะกับวิธีนี้ไหม
  3. ผู้ใช้งานบางคน รู้สึกไม่สบายใจ ที่ต้องมีการ Login ก่อน ซึ่งถ้าจะมาทำอะไรแนวๆ Support ผู้ใช้งานอาจจะต้องคิดดีๆข้อนี้เหมือนกัน

--

--

Petch Kruapanich
readmoreth

Full time Developer, Part time writer, Vinyl lover