ทำ Line OA Bot ง่ายๆ ด้วย Python + Flask: คุยกับบอทชิลๆ
ทำ Line OA Bot ง่ายๆ ด้วย Python + Flask: คุยกับบอทชิลๆ
สวัสดีครับทุกคน! วันนี้เราจะมาเล่นอะไรสนุกๆ กัน นั่นคือการสร้าง Line OA Bot! ไม่ต้องคิดเยอะว่ามันยาก เอาจริงโคตรง่ายเลยถ้ามีไกด์ดีๆ นะ
Line OA Bot มันคืออะไร? แล้วทำไมต้องทำ?
เอาง่ายๆ มันก็คือบอทที่เราคุยด้วยได้ใน Line Official Account นั่นแหละครับ เหมือนแอดมินตอบแชทลูกค้าตลอด 24 ชม. แต่เป็น AI ไง! ทำไมต้องทำเหรอ? ก็เผื่อคุณอยากให้มันตอบคำถามลูกค้าเบื้องต้น, ส่งโปรโมชั่น, หรือแม้แต่ทำเป็นเกมส์เล็กๆ ก็ยังได้. มันดีตรงที่ตอบได้เร็ว ไม่ต้องรอคนว่าง
เตรียมของก่อนเริ่ม
- Line Developers Account: เข้าไปสมัครเลย ถ้ายังไม่มี https://developers.line.biz/
- Channel Access Token กับ Channel Secret: อันนี้สำคัญมาก เหมือนกุญแจเข้าบ้านเราเลย ไปสร้าง Line OA แล้วเข้าไปที่ Messaging API แล้วก็ก็อป
Channel access token (long-lived)กับChannel secretมาเก็บไว้ดีๆ นะ - Python 3: อันนี้ไม่ต้องพูดเยอะ มีกันอยู่แล้วปะ?
- Flask: Micro-framework ตัวจิ๋วของเรา ไว้ทำ API รับ webhook จาก Line
- Line Bot SDK for Python: SDK อย่างเป็นทางการ ช่วยให้ชีวิตง่ายขึ้นเยอะ ไม่ต้องมานั่ง parse JSON เอง
- Ngrok (สำหรับเทส local): อันนี้โคตรสำคัญ! ถ้าอยากเทสบอทบนเครื่องเราโดยไม่ต้อง deploy ขึ้นเซิร์ฟเวอร์จริง Ngrok คือคำตอบเลย เปิด HTTPS ให้เราได้เลยนะ
เริ่มโค้ดกันเลย!
ก่อนอื่นก็ลง library ที่จำเป็นก่อนเลย:
pip install flask line-bot-sdk ngrok
สร้างไฟล์ app.py ขึ้นมา แล้วเริ่มใส่โค้ดเลยครับ
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
import os
app = Flask(__name__)
# Get Channel Access Token and Channel Secret from environment variables
# หรือจะใส่ตรงๆ ก็ได้ แต่ไม่แนะนำเท่าไหร่ ถ้าเป็น production มันไม่ปลอดภัย!
CHANNEL_ACCESS_TOKEN = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', 'YOUR_CHANNEL_ACCESS_TOKEN_ตรงนี้เลยจ้า')
CHANNEL_SECRET = os.getenv('LINE_CHANNEL_SECRET', 'YOUR_CHANNEL_SECRET_ตรงนี้เลยจ้า')
line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(CHANNEL_SECRET)
# นี่คือส่วนที่ Line จะยิง Webhook มาหาเรานะ
@app.route("/callback", methods=['POST'])
def callback():
# Get X-Line-Signature header value
signature = request.headers['X-Line-Signature']
# Get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
# Handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
# โค้ดตรงนี้จะทำงานถ้า signature มันไม่ตรง (เช่น token ผิด หรือบอทตั้งค่า webhook ผิด)
print("Invalid signature. Please check your channel access token/channel secret.")
abort(400)
return 'OK'
# นี่คือส่วนที่เอาไว้จัดการข้อความที่บอทได้รับ
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
text_from_user = event.message.text # ข้อความที่ผู้ใช้พิมพ์มา
reply_message = "อะไรนะ ไม่เข้าใจเลย!\nลองพิมพ์อะไรที่ฉันตอบได้สิ" # ข้อความ default ถ้าบอทไม่รู้จะตอบอะไร
# อันนี้คือ logic ตอบกลับแบบง่ายๆ นะ
if text_from_user == 'สวัสดี':
reply_message = 'สวัสดีครับ! ยินดีที่ได้รู้จักนะ'
elif 'ชื่ออะไร' in text_from_user:
reply_message = 'ฉันคือบอทน้อยน่ารัก ที่คุณสร้างขึ้นมาไงล่ะ!'
elif 'ขอบคุณ' in text_from_user:
reply_message = 'ด้วยความยินดีครับ'
elif 'บาย' in text_from_user:
reply_message = 'บ๊ายบาย! ไว้คุยกันใหม่นะ'
else:
# ถ้าบอทไม่รู้จะตอบอะไร ก็ยังส่งข้อความไปหา user ได้นะ เผื่อมี logic อื่นๆ
# เช่น ส่งไปหา admin จริงๆ หรือบันทึก log ไว้
pass
# ส่งข้อความกลับไปหาผู้ใช้
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply_message)
)
if __name__ == "__main__":
# ใช้ os.getenv() เพื่อดึงค่า Port จาก Environment Variable
# ถ้าไม่มี ก็ใช้ 5000 เป็นค่า default
port = int(os.getenv("PORT", 5000))
app.run(host='0.0.0.0', port=port)
วิธีรันและเทส
- ตั้งค่า Webhook ใน Line Developers Console: เข้าไปที่ Line Developers Console (ตรง Channel ของเรา) ไปที่
Messaging APIเลื่อนลงมาหาWebhook settingsแล้วเอา URL ที่ได้จาก Ngrok มาใส่ตรงWebhook URLโดยต้องเพิ่ม/callbackต่อท้ายด้วยนะ (เช่นhttps://xxxx-xxxx-xxxx-xxxx.ngrok-free.app/callback)จำไว้: ต้องเปิดUse webhookด้วยนะ! ถ้าลืมเปิด บอทก็ไม่ทำงาน!
รัน Ngrok: เปิด Terminal อีกอัน แล้วพิมพ์:
ngrok http 5000
Ngrok จะให้ URL มา เช่น https://xxxx-xxxx-xxxx-xxxx.ngrok-free.app อันนี้สำคัญมาก! เพราะ Line จะยิงมาหา URL นี้นะ
รัน Flask app: เปิด Terminal ขึ้นมา แล้วพิมพ์:
python app.py
มันจะรันบน http://127.0.0.1:5000 (หรือพอร์ตอื่นถ้าคุณเปลี่ยน)
ตั้งค่า Environment Variables: ก่อนรัน ให้ตั้งค่า LINE_CHANNEL_ACCESS_TOKEN กับ LINE_CHANNEL_SECRET ใน environment ของคุณ หรือจะเปลี่ยนในโค้ดตรงๆ ก็ได้ (แต่ไม่ดีนะเวลา deploy จริง).
export LINE_CHANNEL_ACCESS_TOKEN='YOUR_CHANNEL_ACCESS_TOKEN_ตรงนี้เลยจ้า'
export LINE_CHANNEL_SECRET='YOUR_CHANNEL_SECRET_ตรงนี้เลยจ้า'
(ถ้าเป็น Windows ใช้ set แทน export นะ)
ปัญหาที่เคยเจอ (และทำเอาเสียเวลาโคตรๆ)
- Webhook ไม่ยิงมาเลย:
- เคสแรก คือลืมเปิด
Use webhookใน Line Developers Console! อันนี้บ่อยสุดๆ ผมก็เคย. - เคสสอง คือ Webhook URL ที่ใส่ใน Line Developer มันผิด อาจจะพิมพ์ผิด หรือลืมใส่
/callbackต่อท้าย. - เคสสาม คือ
InvalidSignatureErrorอันนี้ส่วนใหญ่มาจากChannel Access TokenหรือChannel Secretผิดนะ เช็คดีๆ อีกทีว่าก็อปมาครบถ้วนถูกต้อง - เคสสี่ คือ Ngrok ไม่ได้รันอยู่ หรือ URL ของ Ngrok หมดอายุไปแล้ว (เพราะถ้าไม่ได้สมัครแบบเสียเงิน Ngrok มันจะเปลี่ยน URL เรื่อยๆ เมื่อปิด-เปิดใหม่)
- เคสแรก คือลืมเปิด
- บอทตอบช้ามาก: บางทีโค้ดเราไปเรียก API ข้างนอกที่ใช้เวลานาน ทำให้ Line timeout ได้ (Line รอไม่นานนะ) ลองทำ asynchronous messaging หรือใช้ background task แทน
- ติดตั้ง Library ไม่ได้: อันนี้ก็คลาสสิก! Python version ไม่ตรง, pip เวอร์ชั่นเก่า, หรือ network มีปัญหา. ลองอัปเดต pip ก่อน
python -m pip install --upgrade pip
ความเห็นส่วนตัวนะ
เอาจริง Line Bot SDK เนี่ย โคตรจะช่วยชีวิตเลยนะ จากที่เคยต้องมานั่ง verify signature เอง parse JSON เองให้ปวดหัว ตอนนี้แทบไม่ต้องทำอะไรเลย แค่เขียน logic ตอบกลับก็พอ. มันทำให้เราโฟกัสกับสิ่งที่บอทจะทำได้จริงๆ ไม่ต้องมาจมกับเรื่อง boilerplate code.
สำหรับ Ngrok ก็คือพระเอกสำหรับ dev local เลยอะ คิดดูดิ ถ้าไม่มีนี่ต้อง deploy ทุกครั้งที่เปลี่ยนโค้ดบ้าไปแล้ว! แต่ก็จำกัดเวลาอยู่ถ้าใช้ฟรีนะ ต้องคอย re-run ใหม่เรื่อยๆ
ลองเล่นดูนะ มันสนุกกว่าที่คิดเยอะเลย! เอาไปต่อยอดได้อีกเยอะแยะเลย ไม่ว่าจะทำเป็นบอทตอบคำถามบ่อยๆ (FAQ), บอทสั่งอาหาร, หรือจะเชื่อมกับ AI อย่าง ChatGPT ก็ยังได้! สู้ๆ! 🎉