ทำ Line OA Bot ง่ายๆ ด้วย Python + Flask: คุยกับบอทชิลๆ

ทำ Line OA Bot ง่ายๆ ด้วย Python + Flask: คุยกับบอทชิลๆ

สวัสดีครับทุกคน! วันนี้เราจะมาเล่นอะไรสนุกๆ กัน นั่นคือการสร้าง Line OA Bot! ไม่ต้องคิดเยอะว่ามันยาก เอาจริงโคตรง่ายเลยถ้ามีไกด์ดีๆ นะ

Line OA Bot มันคืออะไร? แล้วทำไมต้องทำ?

เอาง่ายๆ มันก็คือบอทที่เราคุยด้วยได้ใน Line Official Account นั่นแหละครับ เหมือนแอดมินตอบแชทลูกค้าตลอด 24 ชม. แต่เป็น AI ไง! ทำไมต้องทำเหรอ? ก็เผื่อคุณอยากให้มันตอบคำถามลูกค้าเบื้องต้น, ส่งโปรโมชั่น, หรือแม้แต่ทำเป็นเกมส์เล็กๆ ก็ยังได้. มันดีตรงที่ตอบได้เร็ว ไม่ต้องรอคนว่าง

เตรียมของก่อนเริ่ม

  1. Line Developers Account: เข้าไปสมัครเลย ถ้ายังไม่มี https://developers.line.biz/
  2. Channel Access Token กับ Channel Secret: อันนี้สำคัญมาก เหมือนกุญแจเข้าบ้านเราเลย ไปสร้าง Line OA แล้วเข้าไปที่ Messaging API แล้วก็ก็อป Channel access token (long-lived) กับ Channel secret มาเก็บไว้ดีๆ นะ
  3. Python 3: อันนี้ไม่ต้องพูดเยอะ มีกันอยู่แล้วปะ?
  4. Flask: Micro-framework ตัวจิ๋วของเรา ไว้ทำ API รับ webhook จาก Line
  5. Line Bot SDK for Python: SDK อย่างเป็นทางการ ช่วยให้ชีวิตง่ายขึ้นเยอะ ไม่ต้องมานั่ง parse JSON เอง
  6. 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)

วิธีรันและเทส

  1. ตั้งค่า 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 ก็ยังได้! สู้ๆ! 🎉

Read more

ไอลีน กู: ตำนานนักสกีฟรีสไตล์ผู้พลิกโฉมวงการและความหมายของชัยชนะ

ไอลีน กู: ตำนานนักสกีฟรีสไตล์ผู้พลิกโฉมวงการและความหมายของชัยชนะ

เจาะลึกเรื่องราวของ Eileen Gu นักสกีฟรีสไตล์ผู้สร้างประวัติศาสตร์ในโอลิมปิก 2026 สถิติที่ไม่เคยมีมาก่อน ประเด็นถกเถียง และความแข็งแกร่งส่วนตัวที่ทำให้เธอก้าวสู่ระดับโลก

By ทีมงาน devdog
วันพระ: คู่มือฉบับสมบูรณ์สำหรับพุทธศาสนิกชนและผู้สนใจยุคใหม่

วันพระ: คู่มือฉบับสมบูรณ์สำหรับพุทธศาสนิกชนและผู้สนใจยุคใหม่

เจาะลึกวันพระและความสำคัญของวันมาฆบูชา 2569 ทั้งวันหยุดราชการ ธนาคาร กิจกรรมเวียนเทียนต้นไม้ และผลกระทบต่อบริการขนส่ง เตรียมตัววางแผนทำบุญและพักผ่อน

By ทีมงาน devdog
ถอดรหัสรักแท้: "บังมัดคลองตันต้นข้าว" เรื่องราวที่สะท้อนการให้อภัยและการเริ่มต้นใหม่

ถอดรหัสรักแท้: "บังมัดคลองตันต้นข้าว" เรื่องราวที่สะท้อนการให้อภัยและการเริ่มต้นใหม่

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

By ทีมงาน devdog
ไฮไลท์บอลไทยลีก 2: มหาสารคาม เอสบีที เอฟซี กับฟอร์มร้อนแรงสู่เส้นทางเพลย์ออฟ

ไฮไลท์บอลไทยลีก 2: มหาสารคาม เอสบีที เอฟซี กับฟอร์มร้อนแรงสู่เส้นทางเพลย์ออฟ

เจาะลึกไฮไลท์บอลไทยลีก 2 ของมหาสารคาม เอสบีที เอฟซี กับฟอร์มร้อนแรง ชัยชนะสำคัญจาก ชิตชนก และบทบาทโค้ชดุสิต สู่เส้นทางเพลย์ออฟที่น่าจับตา!

By ทีมงาน devdog