การทำ LINE Bot (Chatbot) ด้วย Python
ก่อนที่จะเข้าสู่วิธีการ ทำ LINE Bot เราต้องขออ้างอิงบทความก่อน วิธีสมัคร LINE Business Center และ LINE@ เนื่องจากการทำ LINE bot ครั้งนี้จะเป็นแบบ Official API แล้วเพราะทาง LINE เองเป็นคนเขียน document ออกมาเอง ไม่เหมือนในบทความก่อนหน้านี้ที่ เราไป hack API เค้ามาใช้ (สร้าง LINE Bot Unofficial) จึงจะเป็นต้องใช้ ID Line@ account ในการเปิดขอใช้ Messaging API กับทาง LINE
หลักการทำงานของ LINE Bot
ในส่วน flow การทำงานที่ทาง LINE ได้ให้ API มานั้น หลักการคือเราต้องมี server พร้อมทั้งติดตั้ง webserver เอาไว้ก่อน ในกรณีทีเราต้องการให้ LINE Bot เราสามารถรับคำสังได้ เพราะตัว official นี้จะแตกต่างจาก version hack อันเก่าของเรา เพราะของเก่าเราใช้วิธีเข้าไป fetch เอาข้อมูล message ที่อยู่ใน queue ของ LINE Id นั้น แต่ของใหม่ทาง LINE จะ push message ที่มีคนส่งหา LINE Id เรา มายัง server ของเราให้เองเลย (เรียกว่า Realtime มาก) หรือเรียกอีกอย่างว่า Webhook เป็นผลให้เราต้องที URL ส่งให้ LINE เพื่อที่เค้าจะเรียกมาที่ URL นั้นได้ เท่านั้นยังไม่พอ เพื่อความปลอดภัยเราต้องทำ URL เป็น https ที่เป็น cert แบบถูกต้องด้วย (ห้ามเป็น self signed) และที่สำคัญเราไม่จำเป็นต้องใช้ user/pass ในการ authen แล้ว แต่เปลี่ยนมาใช้ Channel Access Token ที่ทาง LINE ให้มาเป็นตัว auten แทน
ขั้นตอนการทำ LINE Bot (Official)
อย่างที่บอกเราต้องมี Linux Server ที่ Install Webserver ไว้พร้อมแล้ว หรือจะ Install LAMP เลยก็ได้ พร้อมทั้ง Flask flamwork สำหรับทำ web application ด้วย Python รวมถึงต้องจด domain name ซึ่งถ้าไม่อยากเสียเงินก็ใช้ DDNS ก็ได้ครับแล้ว configure IP มาที่ Server ที่บ้านเราเอง จากนั้นก็สมัคร SSL domain (https) ก่อน ซึ่งในเว็ปเรามีการสอนวิธีการทำไว้หมดแล้วสำหรับผู้ที่ยังไม่มี
- ขั้นตอนการติดตั้ง Linux Ubuntu
- ขั้นตอนการติดตั้ง Webserver Apache
- ขั้นตอนการติดตั้ง LAMP
- ขั้นตอนการติดตั้ง Flask
- ขั้นตอนการทำ domain name แบบ DDNS
- ขั้นตอนการทำ domain name จาก http เป็น https
- ขั้นตอนการสมัคร LINE Business Account
เมื่อมี Server ที่ Install และ Configure webserver จนได้ URL ที่เป็น https ของเราเองมาแล้ว (ในที่นี้ของผมคือ https://saixiii.com) ก็มาเริ่ม ทำ LINE Bot กันได้เลย
1. ทำการสมัคร messaging API
Link : https://business.line.me/en/ คลิกที่ Messaging API
2. เลือก Start Using Developer Trial
3. กรอกข้อมูล ตั้งชื่อ Account แล้วใส่รูป Profile รวมถึงรายละเอียดต่างๆ แล้วกด “OK”
4. หลังจากข้อมูลครบถ้วนถูกต้อง ก็จะได้รับ LINE@ Account และคลิกที่ “LINE@ Manager”
5. ในหน้า LINE@ Manager ให้กด Bot Settings หรือ การตั้งค่า Bot
6. เปิด Enable API (ระบบจำเป็นต้องปิด 1-1 Chat และ ไม่สามารถใช้ App ของ LINE@ ได้)
7. เลือก “LINE Developer” เพื่อเข้าไป Configure ค่าของ Bot
8. สักเกตุที่ Channel Secret ให้กด “Show” จะแสดง Channel key ออกมา ให้เราเก็บค่านี้ไว้
9. ตรง Webhook URL ให้ใส่ URL https ที่เราได้ทำไว้ แล้วต่อท้ายด้วย /Callback
อย่างของผม URL คือ https://saixiii.com ก็ใส่เป็น https://saixiii.com/callback
10. ตรงส่วนของ Channel Access Token ให้เราเก็บค่านี้ไว้ เพราะจะเอาไว้ใช้ Authen Bot
ตั้งแต่ส่วนนี้ไปจะเป็นการติดตั้ง Python และ ทำ LINE Bot บน Linux
11. SSH เข้าไปที่ Server แล้วทำการ Install Python Line package
$ pip install line-bot-sdk
12. ทำการ download ตัวอย่าง echobot มาลองเล่นดูจาก link ด้านล่าง
Link: https://github.com/Saixiii/line-bot-sdk-python/blob/master/examples/flask-kitchensink/app.py
บรรทัดที่ 45,46 ทำการแก้ไขค่า channel_secrect และ channel_access_token ที่เราได้จาก LINE Developer มาใส่แทน
channel_secret = os.getenv('LINE_CHANNEL_SECRET', None) channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)
เป็น
channel_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' channel_access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
สร้าง file ชื่อว่า __init__.py และไว้ที่ path app ของ flask ที่เรา set ไว้ (จากบทความ Flask คืออะไร Python Flask คือ framwork สำหรับทำ web application)
13. ลอง test โดนเข้าไป web browser แล้วไป URL webhook ของเรา
https://yourdomain.com/callback
ถ้าได้ผลเป็น Method Not Allowed แสดงว่า configure Apache และ Flask ถูกต้องแล้ว
เสร็จเรียบร้อยแล้ว ซึ่ง LINE Bot ตัวนี้นอกจาก echo text message แล้ว sticker ก็ยังตอบกลับด้วย รวมถึงสามารถ auto join group ได้ด้วย และมี command เฉพาะเสริมให้ถ้าพิมพ์ keyword เช่น
- profile – จะส่งชื่อของเรา รวมถึง status ของเรากลับมา
- bye – คือการไล่บอทออกจากกลุ่ม บอทจะ leave group เอง
สำหรับผู้ที่สนใจต่อข้อมูล LINE API เชิงลึกอ่านต่อในบทต่อไปทางนี้ครับ
บทที่2 เรียนรู้ LINE API คืออะไร ทำ LINE Bot ผ่าน LINE Messaging API (Official)
Reference:
- ทำความเข้าใจ LINE API (Unofficial) – Messaging API
- ทำ LINE bot (Unofficial) สามารถโต้ตอบแบบ Chatbot หรือ Echobot
- วิธีสมัคร LINE Business Center และ LINE@
- บทที่1 ทำ LINE Bot สามารถโต้ตอบ หรือ Chatbot ด้วย Python (Official)
- บทที่2 เรียนรู้ LINE API คืออะไร ทำ LINE Bot ผ่าน LINE Messaging API (Official)
- บทที่3 วิธีใช้ LINE API (Messaging API) เพื่อทำ LINE Bot
- บทที่4 Webhook หลักการของ LINE API ที่เอาไว้ ทำ LINE Bot
- บทที่5 วิธีส่งข้อความผ่าน LINE API หรือ LINE Bot ด้วย Curl
- บทที่6 วิธีใช้ LINE Python SDK ทำ LINE Bot ด้วย LINE Messaging API
Author: Suphakit Annoppornchai
Credit: https://saixiii.com
[…] บทที่1 ทำ LINE Bot สามารถโต้ตอบ หรือ Chatbot ด้ว… […]
[…] ต่อจากบทความ บทที่1 ทำ LINE Bot สามารถโต้ตอบ หรือ Chatbot ด้ว… เรามาทำความเข้าใจให้มากขึ้นถึงวิธีการใช้ API เพื่อนำไปต่อยอดใช้งานกับ bot ของเราได้มากขึ้น เริ่มต้นจากทำความรู้จักกับ Messaging API ก่อน […]
[…] บทที่ 1 ที่เราติดตั้ง ทำ LINE Bot ไปแล้ว […]
[…] บทที่1 ทำ LINE Bot สามารถโต้ตอบ หรือ Chatbot ด้ว… […]
[…] บทที่1 เราสามารถติดตั้ง LINE Bot บน Linux ได้ […]
[…] บทที่1 ทำ LINE Bot สามารถโต้ตอบ หรือ Chatbot ด้ว… […]
[…] บทที่1 เราสามารถติดตั้ง LINE Bot บน Linux ได้ […]
ผมมีปัญหาว่าผมจะใช้งาน python sdk ทำ line bot แต่ผมทดลองทำ หน้าเว็บด้วย flask ซึ่งมันสามารถ run ได้ และเรียกใช้งานได้
แต่ผมไป verify ทาง line ปรากฏว่าขึ้น An error occurred when sending the webhook. ครับ ผมเลยไม่สามารถตรวจสอบได้ว่าทำไม หรือเกิดจากอะไร เพราะหน้า cmd ที่ run โค๊ด ก็ไม่ขึ้นว่ามีอะไรเข้ามาบ้าง แต่ที่ผมทดสอบเปิดผ่าน browser ปรากฏว่ามี log แสดงไว้ครับ
รบกวนช่วยชี้แนะด้วยครับ
ตัวอย่างโค๊ดคือ
# -*- coding: utf-8 -*-
#!flask/bin/python
import ssl
from flask import Flask
app = Flask(__name__)
@app.route(“/”)
def hello():
return “Hello World!”
#enddef
@app.route(“/callback”)
@app.route(“/callback/”)
def callback():
return “”
#enddef
if __name__ == ‘__main__’:
context = (‘filecrt.crt’,’filekey.key’)
app.run(host=’lineapp.devdev.com’,port=443, ssl_context=context, threaded=True)
#end if