[Line] Safe zone Line bot

ตัวอย่าง Safe zone line bot

ในวันที่ 5 กรกฎาคม ที่ผ่านมาเจมส์ได้ลองทำ Line bot ที่ชื่อว่า safezone ขึ้นมา สำหรับตรวจสอบระยะห่างจากที่อยู่ กับจุดเกิดเหตุระเบิด-เพลิงไหม้โรงงานผลิตเม็ดโฟมพลาสติก เนื่องจากตอนแรกพี่ชายจะกลับบ้าน และไม่แน่ใจว่าบ้านห่างจากจุดเกิดเหตุเท่าไร แต่ตอนนั้นไม่รู้ว่าจะตรวจสอบผ่านช่องทางไหน (ตอนทำเสร็จแล้วพี่ไม่ได้ใช้ เพราะใช้ช่องทางจาก longdo.com)

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

ตั้งค่าและสร้าง Line channel

คุณผู้อ่านสามารถเข้าไปดูการตั้งค่า และสร้าง Line channel ในบทความด้านล่างได้เลยเน้อครับ โดยค้นหาคำว่า “ตั้งค่าและสร้าง Line channel”

ติดตั้ง Firebase และ Cloud function

คุณผู้อ่านสามารถเข้าไปดูการติดตั้ง Firebase และ Cloud function ได้ที่นี่เลยเน้อครับ โดยค้นหาคำว่า “ติดตั้ง Firebase และ set up firebase cloud function”

สร้าง Firebase Cloud function

หลังจากคุณผู้อ่านตั้งค่า Line chanel และติดตั้ง firebase cli เรียบร้อยแล้ว เราจะสร้าง Firebase cloud function ขึ้นมา เพื่อรับ webhook จาก line

ขั้นแรกก็สร้าง directory สำหรับ project ขึ้นมาด้วยคำสั่ง

mkdir safezone && cd safezone

ในขั้นถัดไปเราจะ initial firebase cloud function เข้ามาด้วยคำสั่ง

firebase init functions

ในที่นี้เจมส์สร้าง firebase project ไว้แล้วก็เลือก firebase project ที่เราสร้างไว้

จากนั้นจะมีให้เราเลือกว่าจะใช้ภาษาอะไรเขียน cloud functions จะมี JavaScript และ TypeScript ในที่นี้เจมส์เลือก JavaScript จากนั้นก็กด enter

จากนั้นระบบจะถามว่าจะใช้ ESLint ไหมในการจัด Style ประมาณว่าถ้า style ไม่ถูกต้องก็จะ deploy ไม่ได้ ในที่นี้เจมส์จะพิมพ์ N แล้วกด enter คือ ไม่ใช้งาน ESLint

ระบบก็จะถามอีกว่าต้องการ install dependencies ตอนนี้เลยไหม ก็ตอบ Y แล้วก็ enter ได้เลยครับ

สร้าง firebase cloud functions เรียบร้อยแล้ว ให้เข้าไปที่ folder functions และ install ตัว dependencies เพิ่มเติมชื่อ geopoint, axios

  • geopoint — เราจะเอามาใช้คำนวณระยะห่างระหว่างพิกัดสองจุด ว่าห่างกันเท่าไร
  • axios — เราจะเอามาใช้สำหรับเรียก API เพื่อ reply message กลับไปให้ผู้เรียก
cd functions && npm install --save geopoint axios

เราจะแก้ไขไฟล์ index.js ใน functions/index.js เป็นแบบนี้ครับ

อธิบายโค้ด

ในส่วนนี้เรากำหนด EXPLOSION_LAT_LONG คือ พิกัดของตำแหน่งที่เกิดเหตุระเบิดขึ้น จากนั้นก็เช็คว่า webhook ที่ส่งมาเป็น message หรือเปล่า ถ้าหากเป็น message ก็ดูว่าเป็น type location หรือเปล่า (คือเราจะให้ผู้ใช้งานส่ง location มาเพื่อตรวจสอบ) ซึ่ง

ถ้าหากไม่ได้เป็น location ส่งมา จะตอบกลับไปว่าถ้าหากต้องการตรวจสอบระยะห่างจากจุดเกิดเหตุกรุณาส่ง Location ของคุณที่ต้องการตรวจสอบ

แต่ถ้าหากเป็น location ส่งมาเราก็จะเอา latitude, longitude ของจุดเกิดเหตุ และจุดที่ส่งมาคำนวณระยะทาง ด้วย function .distanceTo() จากนั้นก็เอาผลลัพธ์ที่ได้ว่าห่างกันเท่าไรมาดูว่าอยู่ในช่วงความเสี่ยงระดับไหน และตอบกลับไป เช่น “คุณอยู่ห่างจากจุดเกิดเหตุ: 30 กิโลเมตร” (ถ้ากรณีถ้าระยะห่างมากกว่า 10 กิโลเมตร) แต่ถ้าระยะห่างน้อยกว่า 10 กิโลเมตร เช่น ห่าง 3 กิโลเมตร จะแจ้งเพิ่มต่อท้ายว่า “คุณอยู่ในพื้นที่อพยพ

ไฟล์ helpers/line.js

ไฟล์ src/config.js

CHANNEL_ACCESS_TOKEN ให้เปลี่ยนเป็นค่า channel access token ที่ได้จาก line channel ที่เราสร้างครับ

Deploy ขึ้น firebase cloud function

หลังจากที่เพื่อน ๆ ใส่ code ต่าง ๆ ตามที่กล่าวไว้แล้ว ขั้นต่อไปคือ deploy ขึ้น firebase cloud function ครับ โดยการพิมพ์

firebase deploy

เมื่อ Deploy เรียบร้อยแล้วให้เข้าไปในหน้า https://console.firebase.google.com แล้วเลือกโปรเจค firebase ที่เราใช้สร้างตอนที่เรา init ในตอนต้น
จากนั้นให้เข้าไปดูที่เมนู functions

แสดง URL ที่อัพโหลดไปที่ firebase cloud functions

แสดง URL ที่อัพโหลดไปที่ firebase cloud functions

ให้เรา Copy URL ที่แสดง เพื่อเอาไปใส่ในหน้าของ Line channel ในส่วนของ Webhook settings > Webhook URL เรียบร้อยแล้วครับ เพื่อน ๆ สามารถเอาไปประยุกต์เพิ่มเติมได้ เช่น ในส่วนของส่ง Location อาจจะใช้ Rich menu เพื่อส่งให้ Location ให้ง่ายขึ้น หรืออาจจะทำ Backend เพื่อปรับเปลี่ยนพิกัดที่เกิดเหตุ อะไรแบบนี้ครับ

ถ้าหากบทความนี้มีส่วนไหนผิดพลาดประการใด ก็ขออภัยมา ณ ที่นี้ด้วยเน้อครับ หรือหากเพื่อน ๆ ต้องการสอบถามส่วนไหน ก็สามารถพิมพ์ไว้ในคอมเม้นท์ได้เน้อครับ

Source code ของบทความ

Reference

--

--

ถึงเขียนน้อย แต่เขียนนะ บทความส่วนใหญ่จะเป็นสิ่งที่ได้เรียนรู้ และลองทำมาครับ ^^