5 นาที สร้าง Telegram Chatbot ด้วย Python

Code HERE . WT
4 min readMay 16, 2022

--

สวัสดีครับ บทความนี้เราจะมาสร้าง Telegram Chatbot กันแบบง่ายสุดๆ แต่ใช้งานได้จริง โดยบทความนี้จะไม่เยิ่นเย้อ และมีเนื้อหาดังนี้

สารบัญ

ผลที่จะได้

นี่คือ Feature ของ Chatbot ตัวแรกที่คุณจะได้เป็นเจ้าของใน 5 นาที

Features ของ Bot จากบทความนี้ (ตามภาพเลย)

ยังมี Features สนุกๆ ต่อในบทถัดไป แต่ 5 นาทีนี้ เอาแค่นี้ก่อนครับ basic

NOTE: บทความนี้ใช้ python-telegram-bot v. 13.15 ซึ่งไม่ได้ทำงานแบบ Async เหมือนกับ v.20+ ที่ออกมาภายหลัง

ลองเข้าไปคุยกับบอทตัวอย่างเล่นดูก่อนได้ครับ http://t.me/CodeHere1Bot
(หากยังไม่มี Telegram ก็ไปสมัครและติดตั้งใช้งานก่อนนะครับ)

เพื่อไม่ให้เสียเวลาสำหรับมือใหม่ เราจะทำโดยไม่ต้องติดตั้งอะไรในเครื่องเลย ด้วยการใช้ Stack นี้

Stack นี้เราจะนำ code ไปรันไว้ที่เว็บ pythonanywhere.com

Code จะอยู่บน Cloud และบอทจะทำงานอยู่เรื่อยๆ* แถมฟรีอีก!

5 นาทีเริ่ม

1. สร้าง Bot ตัวแรก

เราต้องไปคุยกับเจ้าพ่อ BotFather ก่อน เพื่อสร้าง Bot ของเราที่ https://t.me/botfather

ข้อความทักทายของเจ้าพ่อ BotFather
  • เมื่อเข้าไปคุยกับ BotFather ก็คุยตามภาพขวาสุดเลย ให้พิมพ์คำสั่ง /newbot (หรือกดที่ตัวข้อความก็ได้) เพื่อสร้างบอทตัวใหม่
  • จากนั้นตั้งชื่อให้บอทของคุณ (อะไรก็ได้)
  • ต่อมาคือ Username อันนี้มีเงื่อนไขอยู่ว่าต้องเป็นอักษร a-z, 0–9 และ underscore ลงท้ายด้วยคำว่า bot (ตัวเล็กใหญ่ไม่มีผล: case-insensitive) แต่ว่าต้องไม่ซ้ำกับคนอื่น ซึ่งถ้าซ้ำก็ลองเปลี่ยนไปเรื่อยๆ
  • เมื่อตั้ง ชื่อและ Username เสร็จแล้วคุณจะได้ URL ของบอทคุณ พร้อมกับ token สำหรับใช้ควบคุมบอทผ่าน API

ถึงตรงนี้ถือว่าคุณสร้างตัวบอทเสร็จแล้ว เรามาใส่จิตวิญญาณให้น้องบอทของเรากัน

2. ใส่จิตวิญญาณให้น้อนบอท

เริ่มต้นจากการสมัครใช้งานเว็บ PythonAnywhere ที่เราจะเอา code ไปวางไว้ ได้ที่
https://www.pythonanywhere.com/registration/register/beginner/

กรอกรายละเอียดให้เรียบร้อย (อย่าลืมไปยืนยันอีเมล์ด้วยล่ะ) | ขวามือคือ Dashboard ของเรา

เมื่อสมัครและ login เรียบร้อยระบบจะพาไปยังหน้า Dashboard ดังรูปขวามือ

  • ให้ไปที่เมนู Files ด้านบนเพื่อสร้างไฟล์ Python ของเรา
  • ตั้งชื่อไฟล์ในช่องภาษาอังกฤษลงท้ายด้วย .py (ใช้ _ แทนวรรคเพื่อความสะดวก ในตัวอย่างนี้ใช้ชื่อ “my_bot.py” ) จากนั้นกด New File
  • นำ code 100 กว่าบรรทัดด้านล่างนี้ ไปใส่ในไฟล์ใหม่ของเรา และนำ Token ที่ได้จากบอทมาใส่แทนที่ข้อความ 123456:ABcDEf ในบรรทัดที่ 6
นำ code และ token มาวาง จากนั้นคลิกที่ $ Bash console here
  • คลิกที่ $ Bash console here เพื่อเปิด console ขึ้นด้านล่าง
  • จากนั้นติดตั้ง Library สำหรับ telegram bot โดยพิมพ์คำสั่ง
    pip install python-telegram-bot==13.15
  • เปิดใช้งานบอทเราได้เลย ด้วย python my_bot.py
    จะขึ้นข้อความดังด้านล่างนี่คือบอทเราทำงานแล้ว
$ python my_bot.py
Bot is starting… (press Ctrl+C to stop)
Started bot polling.
  • ให้เราลองเปิด telegram คุยกับบอทของเราได้เลย (link ของ bot อยู่ที่ telegram ที่เราสร้าง t.me/usernameของบอท )
ลองคุยกับบอทของคุณได้ตามนี้เลย!

เสร็จแล้วครับ การสร้าง Telegram bot ตัวแรกใน 5 นาที!!! 🎉🎉

หลังจากนี้ หากต้องการหยุดการทำงานของบอทให้คุณกด Ctrl+C (ที่หน้า console ดำๆ) หรือถ้าต้องการให้บอททำงานต่อไป ก็สามารถปิดหน้าต่างนี้ได้เลย หรือ กดเมนูไปที่ Consoles ก็ได้

หน้า Console และหน้ารวม Consoles

หากคุณเปิดบอททำงานไว้ ที่หน้ารวม Consoles คุณก็จะพบ console ที่เปิดค้างไว้อยู่ สามารถกดปิดตรงนี้ได้ หรือเข้าไปพิมพ์คำสั่งอื่นๆ เพิ่มเติมได้ครับ

* สำหรับ pythonanywhere free user จะมีการแชร์ทรัพยากร ดังนั้นตัว console อาจถูกปิดได้ใน 6 ชม. เดี๋ยวบทหน้าเรามาจัดการปัญหานี้กัน

อธิบายกันหน่อย

ส่วนประกอบ

ส่ิงที่เราทำไปนั้น แยกได้เป็น 3 ส่วนหลักๆ

  1. User Interface (UI): อันนี้เรียกว่าเราไม่ได้ทำอะไรเลยโดยการให้ผู้ใช้ใช้งาน Telegram App
  2. Front end: ส่วนนี้ Server ของ Telegram จะเป็นตัวจัดการข้อความที่ผู้ใช้งานพิมพ์เข้ามา แล้วส่งต่อให้ Backend ผ่าน API
  3. Backend: ส่วนนี้ที่เราเขียน code เอาไปรันที่ pythonanywhere ซึ่ง backend ของเราจะทำการเชื่อมต่อไปยัง Telegram Server โดยเข้าถึงตัวบอทผ่าน API และ ใช้ Token ยืนยันตัวตน

ส่วนของ Backend นี้ สามารถนำไปรันที่ PC หรือ Server เครื่องไหนก็ได้ ซึ่งอาจเป็น Notebook หรือ Smart phone ของคุณ แต่เพื่อจะให้บอทไม่หยุดทำงาน เราจึงควรนำไปวางไว้ที่ server

ในอนาคตเมื่อบอทเราสามารถทำสิ่งต่างๆ ได้มากขึ้น ฟังก์ชั่นฟรีของ pythonanywhere อาจไม่พอ คุณอาจต้องมองหา server ใหม่ที่รองรับความต้องการที่เพิ่มขึ้นเช่นกัน

Code

code แบ่งเป็น 2 ส่วนหลัก: ตัวบอท และ การเรียกใช้ในส่วน main

class Bot(object):
...
if __name__ == "__main__":
b = Bot()
print("Bot is starting... (press Ctrl+C to stop)")
b.start(attach=True)

ในส่วนของการ __init__ ซึ่งจะเกิดขึ้นเมื่อสร้าง instance ใหม่นั้นมีส่วนต่างๆ ดังนี้:

  • สร้าง instance ของ bot เพื่อใช้ในการส่งข้อความ
    self.bot = telegram.Bot(token=token)
  • Updater ใช้ในการดึงข้อความใหม่ๆ ที่เข้ามาจากผู้ใช้งาน
    self.updater = Updater(token=token, use_context=True)
  • Handler ต่างๆ เพื่อจัดการกับข้อความที่เข้ามา ซึ่งในที่นี้เราใช้งาน handler 2 ประเภท คือ CommandHandler และ MessageHandler
class Bot(object):
def __init__(self, token=TOKEN):
...
dispatcher = self.updater.dispatcher
start_handler = CommandHandler("start", self.start_cmd)
dispatcher.add_handler(start_handler)

msg_handler = MessageHandler(
Filters.text & (~Filters.command), self.msg_handler
)
dispatcher.add_handler(msg_handler)

dispatcher ที่มาจากตัว updater ของเราจะดำเนินการตาม handler ที่เราเพิ่มเข้าไปเมื่อได้รับข้อมูลจากผู้ใช้ ซึ่ง
CommandHandler ทำงานเฉพาะคำสั่ง ที่ขึ้นต้นด้วยเครื่องหมาย / เท่านั้น เช่น /start หรือ/echo test เป็นต้น โดยข้อความที่ต่อจากวรรคหลังคำสั่งคือ arguments
MessageHandler อันนี้รับข้อความทุกประเภทซึ่งอาจเป็น text, media หรือ status update ก็ได้ ในที่นี้เรา filter เอาเฉพาะ text และไม่เอา command

  • ต่อมาคือฟังก์ชัน start() stop() และ is_running() ของเรา
def start(self, attach=False):
if not self.is_running():
self.updater.start_polling()
if attach:
return self.updater.idle()
def stop(self):
if self.is_running():
self.updater.stop()
def is_running(self):
return self.updater.running

ก่อนอื่นต้องเข้าใจก่อนว่า ในที่นี้เราตั้งให้การทำงาน (running) ของบอทคือการรอรับข้อความและตอบกลับ ซึ่งกระบวนการนี้ขึ้นกับตัว updater แต่หากเราแค่ต้องการส่งข้อความไปยังผู้ใช้ใดๆ นั้นสามารถทำได้โดยการใช้ bot.send_message(chat_id=USER_OR_GROUP_ID, text=TEXT) ซึ่งไม่ได้เกี่ยวอะไรกับตัว updater เลย คุณก็สามารถส่งข้อความไปหาผู้ใช้หรือกลุ่มได้แล้ว แต่มีเงื่อนไขนิดเดียวคือผู้ใช้คนนั้นต้องเคยคุยกับบอทก่อนสักครั้งหนึ่ง

ดังนั้นจะเห็นว่าทั้ง 3 ฟังก์ชั่น จะจัดการอยู่กับการเปิด-ปิด การ polling เพื่อดึงข้อมูลของ updater

โดยปกติเมื่อเรารัน script เสร็จโปรแกรมก็จะปิดตัวลง ที่ start() นั้นเราจึงใส่ option attach เพื่อให้บอทนั้นยังคงทำงานอยู่และไม่ปิดตัวลงไป โดยโปรแกรมจะค้างอยู่ที่ updater.idle() จนกว่าจะมีการ Intterupt (Ctrl+C) หรือโดนสั่ง Terminate ลง
ดังนั้นหากคุณไม่ต้องการให้บอทค้างอยู่ที่จุดนั้น ก็สามารถปล่อยให้ code รันต่อไปได้แล้วจึงค่อยไปดักการทำงานให้ค้างไว้ที่อื่นแทน เช่น

b = Bot()print("Bot is starting...")b.start()print("Bot is started  (press Ctrl+C to stop)")b.updater.idle()

Note: นอกจากการ update แบบ polling แล้ว telegram ก็รองรับการเขียน webhook ด้วย แต่เพื่อหลีกเลี่ยงความซับซ้อนในบทความนี้เราจึงเลือกใช้การ polling

  • ต่อไปคือส่วนสุดท้าย message handler functions ของเรา
def echo(self, update, context):
context.bot.send_message(
chat_id=update.effective_chat.id, text=" ".join(context.args)
)
def msg_handler(self, update, context):
if update.message.text.lower() in ("hi", "hello"):
return context.bot.send_message(
chat_id=update.effective_chat.id, text="Hello!"
)
if update.message.text in ("ไง", "สวัสดี", "หวัดดี", "ดี"):
return context.bot.send_message(
chat_id=update.effective_chat.id, text="สวัสดีจ้า!"
)
return context.bot.send_message(
chat_id=update.effective_chat.id,
text="ขอโทษนะ เราไม่เข้าใจอ่ะ -_-)"
)

ขอยกตัวอย่างคำสั่ง /echo ซึ่งหากผู้ใช้เรียก /echo test 123 จะประกอบด้วย คำสั่ง echo ตามด้วย arguments test และ 123 ในคำสั่งนี้เรานำมันมาต่อกันโดยคั่นด้วยวรรคแล้วส่งกลับไปยังผู้ใช้ผ่าน update.effective_chat.id
จะเห็นว่าหากเป็นคำสั่งอื่นๆ เราก็สามารถนำ args เหล่านี้ไปดำเนินการได้โดยสะดวกเช่นกัน

ส่วน msg_handler() นั้น เราสามารถนำข้อความจาก update.message.text ไปดำเนินการตามเงื่อนไขต่างๆ ของเราได้ หรือจะต่อยอดโดยการเอาข้อความนี้ไปผ่าน AI เพื่อวิเคราะห์ความต้องการของผู้ใช้แล้วจึงตอบกลับก็ได้เช่นกัน

ใน handler เหล่านี้เราสามารถที่จะทำการเก็บข้อมูลเกี่ยวกับผู้ใช้งานได้ เพื่อลงทะเบียน นับจำนวน นับแต้ม หรืออื่นๆ โดยการดึง User object ผ่าน message.from_user คุณจะได้ username, first_name, last_name และอื่นๆ ที่ต้องการ

เท่านี้ก็น่าจะพอเป็นไอเดียให้การเริ่มต้นทำบอทของคุณต่อยอดได้อีกมากมาย

แล้วไงต่อ…

ต่อไปเราลองมาเพิ่ม Feature ที่น่าสนใจกัน!
จะเป็นอะไรดีนะ

  1. มี AI ให้มันแยกแยะได้ว่าผู้ใช้งานต้องการอะไร
  2. ไปดึง Video จาก Youtube
  3. เอาข้อมูลยอดผู้ติดเชื้อโควิดล่าสุดมาดู หรือแจ้งเตือนทุกวัน
  4. เกมฝึกศัพท์ภาษาอังกฤษสนุกๆ (Synonyms & Antonyms Quiz)

อยากได้ตัวอย่างไหน หรือมีไอเดียอย่างไรเสนอมาได้เลยครับ
บทความสั้นไป ยาวไป ตรงไหนบอกได้ครับ
แล้วเจอกันบทความหน้า สวัสดีครับ :)

--

--

Code HERE . WT

Indie Programmer who is into badminton, music, photography, and cat :)