มาทำ Line bot ไว้เช็ค Web Service เล่นกันเถอะ By Golang

Puttapong Khemcharoen
3 min readMay 26, 2018

--

สวัสดีครับทุกท่าน เมื่อไม่กี่วันก่อนผมได้มีโอกาสไปพูดคุยกับรุ่นน้องกลุ่มหนึ่ง ซึ่งหัวข้อที่พูดคุยกันดันมีเรื่องของ “Line bot” เข้ามาด้วย ผมก็เลยเกิดความคิดขึ้นมาว่า เราก็ได้เห็น Line bot มาบ่อยจนชินตาไม่ว่าจะมาจาก Ar-pae(อาแป๊ะ), Shopee, Paperlunch, Lazada และอื่นๆอีกมากมาย ก็เลยคิดว่ามันน่าจะสนุกดี วันรุ่งขึ้นก็เลยมาลองเล่นกับมันดูสักหน่อย

Line-boi Mini project

เช้าวันใหม่ของวันทำงาน หลังจากที่ปิด task ใน Jira งานหลักไปเป็นที่เรียบร้อยก็ทำให้พอมีเวลาว่างๆ ก็เลยจับโปรเจค Line bot ที่คิดไว้เมื่อวานขึ้นมา โดยตั้งชื่อมันว่า “Line-boi” ซึ่งโปรเจคนี้ที่คิดไว้เล่นๆความสามารถที่ต้องมีก็คือ

  • Connect to Line bot ผ่าน webhook
  • Reply Message, Push message กลับไปหา user
  • Checking private service ที่ทำขึ้นมาว่ามันตายหรือใหม่ด้วยการ ping ไปหา
  • Broadcast กลับหาทุกคน กรณีที่ service ตาย
  • และอื่นๆอีกมากมาย เช่น restart service ผ่าน .sh script ด้วยคำสั่ง /restart {ชื่อ service} โดยต้องใส่รหัส admin เป็นต้น ไอเดียมี แต่ที่ไม่มีคือเวลา ฮ่าๆ เราก็ค่อยๆติดอาวุธให้ Line-boi project ขึ้นไปตามเวลานะครับ โดยที่เพื่อนๆสามารถร่วมแบ่งปันและติดอาวุธให้กับมันได้ที่ Line-boi Github

เกือบลืมบอกไปว่า… ผมได้ใช้ภาษา Go language ในการเขียนโปรเจคนี้ เนื่องจากผมกำลังศึกษามันอยุ่ ถือว่าเป็นอีกหนึ่งความท้าทายใน mini project นี้ ซึ่งยังมีอีกหลายความท้าทายที่เกิดขึ้นในระหว่างทำโปรเจคเช่น หัวหน้าเดินมาตอนทำ หยอก:P

Let’s start

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

  1. เราต้องสมัคร Line-Dev Account กันก่อน

2. หลังจากสมัครเสร็จแล้วให ้ล็อกอินเข้าไปแล้วให้ไปสมัคร line-bot ขึ้นมาตัวนึงโดยกดที่ Create New Provider ซึ่งเราต้องกรอกข้อมูลทั่วไปเช่น ชื่อบอท, รูป, คำอธิบายเกี่ยวกับบอทของเรา

ภาพตัวอย่าง ข้อมูล line bot หลังจาก สมัครเสร็จสิ้น

3. หลังจากที่เราสร้าง line bot ขึ้นมาได้แล้ว ให้เพื่อนๆจำให้ขึ้นใจว่า 3 สิ่งที่เราต้องใช้เกี่ยวกับ line bot คือ

ภาพตัวอย่าง field สำคัญ ยังมี Channel Secret ที่อยุ่ตรงภาพด้านบนอีก
  • Webhook ตั้งค่าเป็น Enable และช่องใส่ link ที่เราต้องเอา link server ที่เราทำเสร็จแล้วมาใส่ไว้
  • Channel Secret ที่เราต้องนำจาก line bot ไปใส่ใน server ของเรา เพื่อระบุถึงตัวตน Line bot ID ที่เราต้องการเชื่อมต่อ
  • Chanel Token คือ token ที่จะใช้ในการเชื่อมต่อกับ line bot ของเรา

4. หลังจากนั้นให้ไปที่ Line-boi github เพื่อ clone โปรเจคนี้ลงเครื่อง และทำตาม Readme.md ซึ่งจะมีสเตปคร่าวๆคือ

  • นำ CHANNEL_TOKEN,CHANNEL_SECRET มาเซ็ตเป็น environment โดยใช้คำสั่ง export CHANNEL_TOKEN= “your_token”
  • ดาวโหลดน์ library ที่ต้องใช้ซึ่งได้แก่ linebot-golang-sdk และ echo ด้วยคำสั่ง

go get github.com/labstack/echo

go get github.com/line/line-bot-sdk-go/linebot

  • หลังจากที่เราตั้งค่าทั้งหมดแล้วเราก็สามารถรัน server ได้ด้วยคำสั่ง

go run ./main.go

5. ผ่านมาถึง step นี้ทุกท่านจะ ได้ server มาตัวนึงที่ต่อ linebot ของท่านได้แล้ว ซึ่ง step ต่อไปเราจะทำการ Forwarding IP Address ของเราด้วย Ngrok เพื่อทำให้เครื่องภายนอก (linebot) สามารถส่ง message เข้า server เราได้

  • สมัคร Ngrok และดาวโหลดน์โปรแกรมลงเครื่องของคุณ
  • รัน ngrok โปรแกรมและเชื่อมต่อโปรแกรมเข้ากับบัญชีของคุณด้วยการล็อกอินที่หน้าเวป แล้วไปที่ซ้ายมือหัวข้อ auth เพื่อก๊อปจำคำสั่งมาใช้ ตัวอย่างคำสั่ง

./ngrok authtoken {{your_ngrok_token}}

  • รัน ngrok http เพื่อเชื่อมต่อไปยัง server ของเราด้วย port ที่ตรงกัน (default จากโปรเจคคือ 6000) ตัวอย่างคำสั่ง

./ngrok http 6000

  • เมื่อเราทำทุกอย่างเสร็จหมดแล้วเราจะได้หน้าจอประมาณนี้ขึ้นมา
ภาพตัวอย่างการ forward IP address ด้วย Ngrok

ซึ่งให้เรา copy link http ที่ช่อง forwarding ไปใส่ในช่องของ webhook ของ linebot ซึ่งเป็นอันเสร็จสิ้นการติดตั้ง linebot ให้เชื่อมต่อกับ server ของคุณ

เมื่อเราทำตามขั้นตอนทั้งหมดแล้วเราก็จะได้ไลน์บอทตัวนึงที่พร้อมจะเช็คสุขภาพ service ของคุณผ่านการพิมชื่อ service ตัวอย่างเช่น

ภาพตัวอย่างจากผลงานที่่จะเกิดขึ้น เมื่อเพื่อนๆทำถามทีละสเตปมาจนเสร็จสิ้น

มาถึงช่วงสุดท้ายกันแล้วนะครับ อยากให้เพื่อนๆมอง line bot แบบนี้ครับ

ขอขอบคุณภาพจาก line developer

เมื่อผู้ใช้คุย line กับ line bot ของเรานั้นจะทำให้เกิดการส่ง Message API ผ่าน webhook เข้าสู่ server ของเรา ส่วนเราจะดักเอา message พวกนั้นไปประยุกต์ใช้ทำอะไรก็ตามขึ้นอยุ่กับเรา เช่น ping service ตามชื่อที่พิมพ์, หรือ เก็บข้อมูลลงดาต้าเบส เมื่อระบบของเราทำเสร็จแล้วก็ให้ส่งข้อมูลกลับไปหาผู้ใช้ได้ ซึ่งหมายความว่า ระบบยังคงเป็นเราที่สามารถออกแบบได้อย่างตามใจฉัน เพียงแต่เราสามารถเพิ่มช่องทางการติดต่อกับ user ขึ้นมาผ่านการส่ง Messaging API ทาง line bot เท่านั้นเอง

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

  1. แยกการทำงานอีก thread ออกไปทำการ ping all services ที่ตัวเองมี (ซึ่งผมทำ StartPingAllServices function ไว้ให้เป็นตัวอย่างแล้ว แล้วหาเฉพาะ service ที่ตาย แล้วส่งค่าหากลับ user หรือ admin ทุกคน เพื่อแจ้งเตือน โดยมีเงื่อนไข
  • เราไม่สามารถ get all user ได้เนื่องจาก line develop account ของเรายังไม่ผ่านการรับรอง ทำให้เราต้องแอบเก็บ user id เอง โดยคุณจะเอาไปทำ cache ก็ได้ หรือเก็บลงดาต้าเบสก้ได้
  • service จะต้องแจ้งก็ต่อเมื่อตัวมันตาย และมัน restart กลับมาแล้วเท่านั้น เพื่อเป็นการบอกว่ามันพร้อมใช้งาน

2. ทำชุดคำสั่งใช้เอง เช่น พิมพ์คุยกับบอทไลน์ว่า “/check all service” ระบบก็ทำการ ping หา service ทั้งหมด, หรือทำการพิมว่า /all “สวัสดี” ระบบก็ทำการ broadcast message “สวัสดี” ไปหาทุกๆคนที่ line bot มี friend โดยอาจจะยากขึ้นมาหน่อยโดยเช็คสิทธิ์ line id ว่าคนนั้นเป็น admin ของระบบหรือไม่

สุดท้ายจริงๆละ สำหรับใครที่มีคำถามก็สามารถ comment ที่บทควาทนี้หรือติดต่อผมด้วยการส่งข้อความมาที่ email : m.khemcharoen@gmail.com ได้ตลอดครับ

  • Writing by Puttapong Khemcharoen // 26.05.2018

อ่านบทความของผมในหัวข้ออื่นๆเพิ่มเติมได้ที่นี่ Puttapong Khemcharoen

--

--

Puttapong Khemcharoen

Jobs is a hat that you wear, it does not mentally who you are.