สร้าง LINE Bot ด้วย Node.js + Messaging API — A Beginner’s Guide

ในบทความนี้จะพูดถึงการสร้าง LINE Bot จากการเรียกใช้ Messaging API ที่ทาง LINE ได้จัดเตรียมไว้ให้ โดยจะพัฒนาบน Node.js และ Deploy ลง Heroku เพื่อให้ผู้อ่านเข้าใจหลักการพื้นฐานของการทำ Bot และสามารถนำไปต่อยอดได้ค่ะ :D

ในการส่งข้อความผ่าน LINE Bot จะทำได้สามแบบ

  1. REPLY
    ส่งข้อความเมื่อมี User สนทนากับ Bot หรือใน Group ที่มี Bot รวมอยู่ด้วย ซึ่งจำเป็นต้องใช้ Reply Token
  2. PUSH
    ส่งข้อความหา User หรือ Group ซึ่งไม่จำเป็นต้องมีข้อความมาหา Bot ก่อน โดยจะอาศัย ID ของ User หรือ Group สำหรับการอ้างอิง ทำได้ทีละ User หรือ Group ต่อการส่งข้อความหนึ่งครั้งเท่านั้น
  3. MULTICAST
    ส่งข้อความไปหาหลายๆ User พร้อมกัน

โดยจะยกตัวอย่างแบบแรกคือ REPLY ค่ะ

Prerequisites:
- Node.js
- Git

ต่อไปจะมาลงรายละเอียดการสร้าง Bot แบบ Step-by-step กัน

อันดับแรกคือเตรียม Channel ใน Line Developers ก่อน ให้ทำการสร้างบัญชีผู้ใช้งานได้ที่ https://developers.line.me ตรงนี้คงไม่ต้องอธิบายอะไรมากนะคะ จะเหมือนกับการสมัครสมาชิกทั่วๆไป

พอได้บัญชีผู้ใช้แล้ว ก็เข้าไปสร้าง Provider ขึ้นมา https://developers.line.me/console/register/provider/

เมื่อสร้าง Provider เรียบร้อยแล้วให้เลือก Messaging API เพื่อสร้าง Channel ของเราต่อไปค่ะ

สำหรับ Developer Trial Plan จะอนุญาตให้เพิ่มเพื่อนได้ 50 คนเท่านั้นค่ะ

ใส่ข้อมูลและรายละเอียดของ Channel ตามที่เราต้องการ

ตัวอย่างหน้าตา Channel เมื่อสร้างเสร็จเรียบร้อยแล้ว

ถัดมาจะเป็นการตั้งค่า Channel ในส่วนที่จำเป็นเพื่อให้เราเขียนแอพติดต่อได้ โดยสิ่งที่จำเป็นต้องใช้คือ Channel Access Token และ Webhook URL ค่ะ

กด Issue เพื่อสร้าง Channel Access Token สำหรับการ Authorize Request ไว้ใช้งาน

โดยเจ้า Token นี้จะหมดอายุเมื่อมีการสร้าง Token ใหม่ขึ้นมา ซึ่งเราสามารถกำหนดได้ว่าหลังจากสร้าง Token ใหม่แล้วจะให้ของเก่าใช้งานได้อีกกี่ชั่วโมงจึงจะหมดอายุ เมื่อกด Issue เราจะได้ Token พร้อมใช้งาน ซึ่งมันก็จะยาวๆแบบนี้ ให้เรา Copy เก็บไว้ เดี๋ยวจะเอาไปใช้ตอนเขียนแอพ

ปิด Auto-reply messages ด้วยเพราะเราจะเขียนให้ Bot ตอบเอง

ถัดมาเป็น Webhook URL ซึ่งเป็น URL ที่เราไว้รับ Request นั่นคือเมื่อเกิด Event ขึ้นมาจะมีการเรียก URL ดังกล่าวทันที ซึ่ง URL ที่ว่านี้เราจะใช้จาก Heroku ค่ะ เพราะฉะนั้นก็สมัคร Heroku ได้ที่นี่

เริ่มสร้าง App โดยเข้าไปที่ https://dashboard.heroku.com/apps

เลือก New -> Create new app จะได้ Domain ของ app เราเป็น https://{ชื่อแอพ}.herokuapp.com จากตัวอย่างเป็น https://line-hellobot-demo.herokuapp.com

กำหนด Use webhooks ให้เป็น Enabled และใส่ Webhook URL ลงไปตามที่เราตั้งชื่อไว้ใน Heroku แต่จะเห็นว่ากด Verify แล้วไม่ผ่าน เนื่องจากเรายังไม่ได้ทำการ Deploy ตัว Bot ลง Heroku เพื่อทำการส่ง Response ให้กับ Request ที่จะถูกส่งมายัง URL นี้ ดังนั้นเราจะมาเขียนแอพบน Node.js และ Deploy ลง Heroku เพื่อให้ Verify ผ่านกันก่อนโดยการส่งค่า HTTP Status 200 กลับไป

สร้าง Folder โปรเจคเราขึ้นมา จากนั้นสร้างไฟล์ app.js และ Procfile ซึ่งตัว Procfile จะเป็นไฟล์ที่ใช้ในการบอก Heroku ว่าเป็นคำสั่งที่จะถูกเรียกใช้หลัง Deploy เพื่อสั่งให้แอพเริ่มต้นทำงาน โดยใน Procfile ให้ใส่ดังนี้

web: node app.js

จากนั้นเปิด Terminal แล้วเข้าไปที่ Path ของ Folder แอพเราและพิมพ์คำสั่งด้านล่างเพื่อเริ่มสร้างโปรเจค

npm init

ตรง Entry Point ให้ใส่เป็น app.js และเมื่อใส่ครบจะได้ไฟล์ package.json ที่จะบอกรายละเอียดของโปรเจคเรารวมถึง Dependencies ต่างๆ

ลง Express ซึ่งเป็น Web Application Framework ตัวนึงที่ช่วยให้เราพัฒนา Web Application หรือ Web Service บน Node.js ได้ง่ายขึ้น

npm install express --save

เมื่อลง Express เรียบร้อยแล้วก็เข้ามาที่ app.js แล้วใส่โค้ดลงไปตามนี้ เพื่อให้เมื่อเรียก /webhook ตอนกด Verify แล้วจะได้ HTTP Status 200 กลับคืนมา

จากนั้นเตรียม Deploy แอพเราลง Heroku ผ่าน Heroku CLI หรือจะ Deploy ผ่าน GitHub ก็ได้เช่นกัน แต่ในบทความนี้จะขอพูดถึงเฉพาะผ่าน Heroku CLI เท่านั้นค่ะ

ลง Heroku CLI กันก่อน

npm install -g heroku-cli

เมื่อลงเรียบร้อยแล้วให้ Login และใส่ Email & Password ที่ใช้ในการ Login เข้าบัญชี Heroku ของเรา

heroku login

สร้าง Git Repository และ Attach กับ Heroku App ที่ได้สร้างไว้

git init
heroku git:remote -a line-hellobot-demo

Push ขึ้น Heroku เพื่อทำการ Deploy

git add .
git commit -m "Initial project"
git push heroku master

ตรวจสอบในหน้า Dashboard ของ App เราใน Heroku ว่า Deploy สำเร็จหรือไม่ หากสำเร็จให้ใช้คำสั่งด้านล่างเพื่อทำให้แน่ใจว่ามีอย่างน้อย 1 instance ที่กำลังรันแอพของเรา

heroku ps:scale web=1

กลับมาที่หน้า LINE Developers แล้ว Verify อีกครั้ง จะเห็นว่า Success แล้ว~~

ตอนนี้เราก็เซตทุกอย่างพร้อมใช้งาน ถัดมาจะเป็นการเขียนโค้ดให้ Bot ทำการโต้ตอบกับเราโดยการเรียกใช้งาน Reply API ซึ่งต้องส่ง Request Headers & Body ดังนี้

Request Headers
Content-Type application/json
Authorization Bearer {channel access token}

Request Body
replyToken (String) คือ Token ที่ถูกส่งมาตอนที่ User ส่งข้อความหา Bot เราจะนำ Token นี้มาใช้ในการตอบกลับ User ซึ่งใช้ได้แค่ช่วงเวลาหนึ่งก่อนหมดอายุและจะใช้ได้แค่ครั้งเดียวเท่านั้น
messages (Array ของ Message Object) ซึ่งตัว Message Object จะมี Content เป็นได้ทั้งข้อความ รูป วีดีโอ เสียง Sticker ฯลฯ

เราจะลองเขียน Bot ให้ตอบสองข้อความ คือ Hello และ How are you? ซึ่งเขียนเป็น Curl ได้ตามตัวอย่าง

curl -v -X POST https://api.line.me/v2/bot/message/reply 
-H 'Content-Type:application/json'
-H 'Authorization: Bearer {ใส่ Channel Access Token ของเรา}'
-d '{
"replyToken":"xxxxxxxx",
"messages":[
{ "type":"text", "text":"Hello" },
{ "type:"text", "text":"How are you?" }
] }'

ทีนี้คำถามคือเราจะหา replyToken ได้จากไหน?

ดังนั้นจึงต้องทำความเข้าใจ Webhook Event Object ก่อน ซึ่งเป็นข้อมูลประเภท JSON ที่เป็นข้อมูลของ Event ที่เกิดขึ้น ยกตัวอย่าง Event ที่เป็นข้อความเมื่อมี User ส่งข้อความหา Bot หนึ่งข้อความก็จะได้ Request Body หน้าตาประมาณนี้

ก่อนแก้ไข app.js ให้ลง body-parser เพื่อให้อ่าน Body ของ Request ที่ส่งเข้ามาได้ และลง request เพื่อสร้าง Request และยิง POST ไปยัง Reply API

npm install body-parser --save
npm install request --save

แก้ไข app.js (อย่าลืมเปลี่ยน xxxxxxx เป็น Channel Access Token ของเรานะ)

Commit แล้ว Push ขึ้น Heroku เหมือนเดิม เมื่อ Deploy เรียบร้อย ให้ Add Bot แล้วลองส่งข้อความหา จะเห็นว่า Bot ตอบข้อความตามที่เรากำหนดไว้

ทีนี้ลองเขียนให้ Bot ทำการ Echo ทุกอย่างที่เราพิมพ์มาหามันบ้าง

ผลลัพธ์ที่ได้~

ตอนนี้ LINE Bot เราก็จะดูเหมือนเป็นแอพธรรมดาๆแอพนึงใช่มั้ย ที่ทำงานอยู่บน Application Layer และมีการเรียก API เพื่อใช้ Service จากภายนอก ส่วน UI ก็จะเป็น Chat Interface

เราสามารถนำ AI (Artificial Intelligence) มาประยุกต์ใช้ โดยการใช้ NLP (Natural language processing) ควบคู่กับ ML (Machine Learning) ซึ่งมี Classification Method อีกหลายแบบในการจำแนกและจัดกลุ่มของข้อความจาก User และทำการ Train ให้ Bot ของเราได้เรียนรู้จากการสนทนาเพื่อให้โต้ตอบกับเราได้ดีขึ้น

ตัวอย่าง Classification Method แบบง่ายๆเราจะใช้ Pattern Matching คือ AIML (Artificial Intelligence Markup Language) ที่พัฒนามาจากภาษา XML เพื่อใช้ในการจัดกลุ่มของข้อความและเลือกคำตอบที่คิดว่าเหมาะสมตอบกลับไปยัง User

นี่คือหน้าตาของ AIML

ใครสนใจอ่านเพิ่มเติมตามไปดูเปเปอร์ได้ที่นี่ค่ะ https://arxiv.org/ftp/arxiv/papers/1307/1307.3091.pdf

เจ้า Bot ก็จะรู้ว่าต้องตอบอย่างไรจาก Pattern ที่กำหนดไว้ให้ หรือทำให้มันเรียนรู้จาก Pattern แล้วใส่ข้อมูลที่ได้จากบทสนทนาไว้เป็นฐานข้อมูล แต่เราก็ต้องเขียนเองให้ครอบคลุมที่สุด ซึ่งมันก็จะไม่สามารถทำได้มากกว่านั้น ถ้าอยากให้พัฒนามากขึ้นก็ต้องนำ Algorithms อื่นหรือ Artificial Neural Networks มาช่วย

ลง aimlinterpreter ใช้ในการ Parse ไฟล์ AIML

npm install aimlinterpreter --save

Copy ตัว AIML ด้านบนแล้ว Save ตั้งชื่อว่า test-aiml.xml เก็บไว้ใน Folder ของโปรเจคเดียวกันกับ Bot ของเราค่ะ

EDITED

เนื่องจาก aimlinterpreter ไม่รองรับภาษาไทย เลยนำมาแก้ไขให้ใช้ภาษาไทยได้ด้วยค่ะ ชื่อ aimlparser (เป็นโอกาสได้ลอง publish ขึ้น npmjs เพิ่งรู้ว่ามันทำได้ง่ายมากๆ)

npm install aimlparser --save

แก้ไข app.js ตามนี้

ตัวอย่างโค้ดที่เขียนดูได้ที่นี่เลยค่ะ http://bit.ly/2Qy5rEA

จบแล้ว~ หวังว่าบทความนี้คงทำให้หลายๆคนเข้าใจวิธีการสร้าง LINE Bot เบื้องต้นโดยใช้ Node.js นะคะ เราสามารถนำหลักการเดียวกันไปประยุกต์กับการสร้าง Bot อื่นๆได้ เช่น Slack, Facebook, Telegram ที่ม่ี Messaging API ให้เราได้เรียกใช้งานกันค่ะ ❤

References:
- LINE Messaging API
- API Reference
- Heroku Reference
- AIML TutorialsPoint