เขียน Chat Bot ครั้งแรก

Seehait Chockthanyawat
Seehait Chockthanyawat
3 min readJul 28, 2017

เนื่องจากช่วงนี้ฝนตกบ่อยมาก และฝนก็มักจะตกในช่วงเวลาเลิกงานพอดี ทำให้การเดินทางกลับบ้านนั้นยากลำบากมากขึ้น ในช่วงแรกนั้นผมแก้ปัญหาด้วยการเข้าไปตรวจ Weather Radar ที่ TMD Weather Radar ก่อนกลับบ้าน เพื่อวางแผนการเดินทางให้หลีกเลี่ยงฝนได้มากที่สุด (ไม่อยากเปียกนั่นเอง)

ตัวอย่างภาพ Weather Radar จาก TMD Weather Radar http://203.155.220.231/Radar/pics/nkzfiltered.jpg

แล้วเกี่ยวอะไรกับ Chat Bot?

ผมก็เจอปัญหาเล็กน้อยครับ ด้วยความที่ผมทำงาน Programming ครับ หลายๆ ครั้งที่กำลังแก้ปัญหาอะไรสักอย่างอยู่ ผมมักจะ focus กับปัญหานั้นๆ จนลืมเข้าไปดู Weather Radar นั่นเอง

Focus กับงานมากก็จะเป็นแบบนี้ครับ (ภาพจาก https://www.pexels.com/photo/office-working-app-computer-97077/)

เมื่อทราบถึงปัญหาแล้ว ผมก็ลองหา solution บางอย่างที่น่าจะแก้ปัญหานี้ได้ครับ เช่น

  • เขียน Mobile Application แล้วตั้งเวลาให้ fetch รูป พร้อมกับส่ง notification ให้เรามาดู
  • เขียน Desktop Application แล้วตั้งเวลาให้ fetch รูป เด้งขึ้นมาบนจอที่ทำงาน
  • เขียน Chat Bot ขึ้นมาใช้งาน แล้วตั้งเวลาให้ส่งรูปมาให้เรา

เมื่อพิจารณาแล้ว ผมตัด Desktop Application ออกเป็นอันดับแรก เนื่องจากมีโอกาสที่มันจะเด้งขึ้นมาตอนที่เรากำลังจะแก้ปัญหาได้ ทำให้ flow ติดขัด

หลังจากนั้นผมก็ตัด Mobile Application ออกครับ เนื่องจากว่าผมใช้ iPhone ซึ่งผมจะต้องเสียเวลาติดตั้ง application ใหม่บ่อยมาก (เนื่องจากไม่ได้สมัคร Apple Developer Account จึงไม่สามารถนำ application ขึ้นไปบน App Store ได้ สามารถใช้ได้แค่การติดตั้งจาก Xcode ซึ่งจะมีระยะเวลาใช้งานได้จำกัดต่อการติดตั้ง 1 ครั้ง)

สุดท้ายก็ตัดสินใจทำ Chat Bot ครับ ผมเลือกทำบน LINE ด้วยเหตุผลว่าผมสามารถเปิดดูได้สะดวกที่สุด และสามารถใช้งาน Messaging API ด้วย Developer Trial ได้

ภาพประกอบ LINE Messaging API https://business.line.me/en/services/bot

หลังจากตัดสินใจแล้ว ก็ลงมือ design และ develop ตัว Chat Bot ขึ้นมาครับ

Weather Reporter 0.0.1

สำหรับเวอร์ชั่น 0.0.1 (ทดลองใช้งาน) ผมเลือก deploy ไว้บน heroku (free tier) ครับ ในช่วงแรกก็สามารถใช้งานได้ดี มีฟีเจอร์โต้ตอบกับผู้ใช้ และส่ง report ให้ตามช่วงเวลาที่เรากำหนด แต่เมื่อผ่านไปได้สักพักก็เจอปัญหาดังนี้

บอทหลับ

Heroku (free tier) มีเงื่อนไขว่า

“Sleeps after 30 mins of Inactively.”

ทำให้ crons ไม่สามารถทำงานได้ตามที่คาดหวังครับ

ส่วนนี้แก้ปัญหาได้ไม่ยากครับ ผมสร้าง endpoint (with Authentication) ขึ้นมา แล้วใช้ server ที่อื่นในการยิง endpoint นี้ในช่วงเวลาที่กำหนด (เพื่อไม่ให้บอทหลับ)

Heroku (free-tire) บังคับนอนจริงๆ ครับ https://www.heroku.com/pricing

ได้รับแต่รูปเดิมซ้ำๆ

การส่งรูปผ่าน LINE Messaging API นั้น LINE จะอนุญาตให้ส่งเพียง URL ของรูปให้กับผู้รับเท่านั้น และเป็นการส่งแบบ Lazy Fetch ซึ่งจะมีลักษณะดังนี้

ภาพประกอบการอธิบาย Lazy Fetch

จากภาพประกอบด้านบน ไม่ว่าเราจะส่ง URL รูปไปตอนไหน ผู้รับจะทำการ fetch รูปจาก URL นั้นมาจริงๆ ก็ต่อเมื่อผู้รับเปิดอ่าน message แล้วเท่านั้น

ก็ฟังดูดีนี่ แล้วมีปัญหาอะไร?

ปัญหาก็คือ TMD Weather Radar ใช้ URL เดิมในการเก็บรูปครับ ทำให้ผู้รับที่ไม่เปิดดูรูปในทันที อาจเห็นรูปเดิมซ้ำๆ ได้ ซึ่งก็คือรูปล่าสุดบน server นั้นเอง

ปัญหาของ Lazy Fetch กับการเก็บรูปไว้ที่ URL เดิม

ปัญหานี้เหมือนจะแก้ไม่ยากครับ

ก็เก็บรูปไว้บน server ของเราไง แล้วก็แยก URL แค่นั้นเอง

แต่… บน Heroku นั้น ถ้า server เราดัน crash ขึ้นมา มันจะ build ทุกอย่างใหม่หมดเลยครับ (รวมถึงลบไฟล์เก่าออกทั้งหมดด้วย) ดังนั้น รูปหายแน่นอน

ผมจึงเลือกใช้ Firebase Cloud Storage ในการเก็บรูปครับ ซึ่งผมใช้งานมาหลายวันแล้วก็ยังไม่พบปัญหาอะไร และยังมีข้อดีคือ ผู้รับ fetch รูปได้เร็วขึ้นครับ (ถึงแม้ว่า server บน Heroku หลับไป ก็ไม่ต้องรอปลุก เพราะไป fetch รูปจาก Firebase ได้เลย)

Weather Reporter 1.0.0

หลังจากแก้ปัญหาแล้ว ก็ถึงเวลานำมาใช้งานจริงครับ ชมภาพประกอบด้านล่างเลย

หน้า Home ของ Weather Reporter
มี Menu ให้กดใช้งานได้ง่ายขึ้น
มี Settings ให้ปรับแต่งได้ตามต้องการ
คำนวน Chance of Rain ให้ด้วย!

เพียงเท่านี้ก็ได้ Weather Reporter ไว้ใช้งานแล้วครับ วางแผนการเดินทางหลีกเลี่ยงฝนได้สะดวกมากขึ้น นอกจากจะได้ Chat Bot มาใช้งานแล้ว ยังได้พัฒนา Programming Skills เพิ่มเติมนอกเหนือจากงานประจำด้วยครับ

การเล่าประสบการณ์ทำ Chat Bot ครั้งแรก ก็จบลงเพียงเท่านี้ครับ หากมีข้อสงสัย หรือคำแนะนำ สามารถสอบถามติชมได้เลยครับ :D

สามารถติดตามผลงานอื่นๆ ได้ที่ https://seehait.me/ ครับ สวัสดีครับ

--

--