สวัสดีครับ หลายๆคนคงจะรู้จักโปรแกรม discord ที่ไว้คุยกับเพื่อนๆ ซึ่งส่วนตัวผมก็ใช้ทั้งตอนเรียนและตอนเล่นเกม เลยอยากลองสร้างบอทเล่นๆเป็นของตัวเองดูบ้าง ในบทความวันนี้ผมจะมาเล่าวิธีการสร้างบอทใน discord ด้วยภาษา python ที่ออนไลน์ได้ 24 ชั่วโมง และที่สำคัญ ทุกขั้นตอนในบทความนี้ไม่ต้องติดตั้งโปรแกรมอะไรเพิ่มเติมให้รกเครื่อง และไม่ต้องเสียเงินสักบาทครับ
โปรแกรมที่ต้องใช้
- Python 3 ขึ้นไป + pip ใครไม่มีไปโหลดจาก เว็บหลักของ python ที่นี้เลยครับ
- discord
- IDE/Text editor ที่ใช้ถนัด
1) สร้างบอท
เริ่มจากล็อกอินเข้าไปที่ discord developer portal แล้วกด new application ทางขวาบน แล้วใส่ชื่อแอพที่เราจะสร้างครับ
แล้วเราก็เลือกแท็บ bot ทางด้านซ้ายมือแล้วกด add bot เลยครับ
ตั้งชื่อ/เปลี่ยนรูปบอท ให้ตรงกับที่ต้องการให้แสดงใน discord ในหน้านี้ได้เลยครับ หลังจากนั้นก็copy token มาเก็บไว้(tokenก็เหมือนเป็น password ของ bot ทุกคนที่มี token นี้จะสามารถควบคุมbotของเราให้ทำอะไรก็ได้ discord เลยมีปุ่ม regenerate token ให้เผื่อว่าเกิดเรื่องอะไรที่ token ของเราหลุดออกไปครับ)
หลังจากนั้นให้กดแท็บ OAuth2 เลื่อนลงมาข้างล่าง แล้วติ๊กตามนี้เลยครับ
copy url มาใส่ในbrowser แล้ว add บอทเข้าserver ที่เราต้องการได้เลยครับ(เราต้องมีสิทธิ admin ใน server นั้นๆด้วยนะครับ)
แล้วบอทของเราก็ถูกสร้างขึ้นมาเรียบร้อย(ซึ่งยังทำอะไรไม่ได้เลย) ต่อไปก็มาถึงขั้นตอนเขียนโค้ดละ
2) Python
เริ่มจากติดตั้ง module ที่ต้องใช้ด้วยคำสั่ง
pip install discord
เมื่อติดตั้งเสร็จก็เริ่มเขียนโค้ดกันได้เลย
import discord
client = discord.Client()
@client.eventasync def on_ready(): print(‘We have logged in as {0.user}’.format(client))
@client.eventasync def on_message(message): #ฟังก์ชั่นหลักที่ใช้ตอบ message if message.author == client.user: #บอทจะได้ไม่ตอบข้อความตัวเอง return #message.content คือข้อความที่ผู้ใช้ส่งมา เป็น String if message.content.startswith(‘-hello’): await message.channel.send(‘Hello!’) returnclient.run(‘ODUyMDg5OTU0ODA0NDMyOTA3.YMBwnA.fTElyy-uFiwx2vFq4yufjxxx-nY’) #ใส่ token ตรงนี้
copy โค้ดข้างบนไปรันดู consoleจะขึ้นว่า We have logged in as กับชื่อบอทของเรา แล้วบอทของเราก็ออนไลน์เรียบร้อยครับ (อย่าลืมแก้บรรทัดสุดท้ายให้เป็น token ของตัวเองด้วยล่ะ)
แค่นี้แหละครับ นอกนั้นเราก็เอาไปประยุกต์ได้อีกมากมายแล้ว สมมุติผมอยากให้บอทเช็คราคาบิทคอยท์แบบ real time ผมก็เพิ่ม if เข้าไปในฟังก์ชั่น on_message แบบนี้ แล้วใช้ request ในการดึงราคาบิทคอยท์จาก api ของ coindesk ครับ (ใครที่ไม่มี module อย่าลืมติดตั้งด้วย pip install requests
ก่อนนะครับ)
if message.content.startswith('-btc'): import requests response = requests.get('https://api.coindesk.com/v1/bpi/currentprice.json') data = response.json() #print(data) await message.channel.send("Current price is" + data["bpi"]["USD"]["rate"] + "US Dollar")
เอ๊ะ ว่าแต่ทำไมต้องขึ้นต้นคำสั่งด้วย - ทุกครั้งเลย จำเป็นอะไรหรือเปล่า
ที่จริงก็ไม่มีความหมายอะไรหรอกครับ ก็คนที่ไหนมันจะเริ่มข้อความด้วย - กันล่ะ การทำแบบนี้ช่วยให้แน่ใจว่าเราจะไม่เผลอเรียกบอทขึ้นมาตอนคุยกับคนอื่นๆในแชทครับ จะใช้เครื่องหมายหรือคำอะไรก็แล้วแต่เลย (หรือถ้าจะใช้ในห้องแชทที่คนน้อยๆอยู่แล้ว จะไม่มีเครื่องหมายอะไรนำหน้าก็ไม่ได้ผิดอะไรครับ)
3) hosting
ต่อไปเราก็จะเจอกับคำถามที่ว่า “เอ๊ะ ถ้าแบบนี้เราก็ต้องรันไฟล์python ตลอดเวลาเลยอ่ะดิ ใครจะเปิดคอมทิ้งไว้ทั้งวันทั้งคืนขนาดนั้นได้ ที่ว่าออนไลน์24ชั่วโมงตอนแรกคือแบบนี้เหรอ”
ใช่ครับ ถ้าเราทำบอทตรงๆ แบบที่ผมสอนไปข้างบนแล้วรันบนเครื่องของตัวเอง แต่เราสามารถใช้บริการ browser IDE อย่าง replit.com เพื่อรันไฟล์ python ของเราบนเซิฟเวอร์ได้ และถ้าทีมเรามีหลายคนที่ช่วยกันเขียนเรายังสามารถแก้ไขโค้ดพร้อมกันได้อีกด้วย (เหมือนขายของยังไงไม่รู้ แต่ผมใช้บริการเจ้านี้จริงๆ ไม่ได้สปอนเชอร์หรืออะไรจริงๆนะ555)
เข้าเรื่องกันต่อเหอะ เข้า replit.com แล้วสมัครสมาชิกหรือ log in ด้วย google/facebook หรือ github ก็ได้ครับ
พอเข้ามาแล้วกด new repl แล้วเลือก create new repl เลือกภาษาเป็น python แล้วตั้งชื่อ repl ของเราเลย (บัญชีฟรีจะสร้าง private repl ไม่ได้นะครับ)
พอเข้ามาจะเจอไฟล์ main.py เปล่าๆอยู่ เราก็ก็อปโค้ดทั้งหมดที่เราเขียนมาใส่ในไฟล์นี้เลยครับ กดรันครั้งแรกจะนานหน่อยเพราะ replit ต้องติดตั้ง module ที่เราใช้ด้วย แต่หน้าตาจะออกมาประมาณนี้เลย
แต่ แต่ แต่ ยังไม่จบแค่นี้ ตามนโยบายของทาง replit.com บัญชีของผู้ใช้ฟรีสามารถรันแบบ idle ต่อเนื่องกันได้แค่ชั่วโมงเดียวเท่านั้น งั้นเราก็ต้องจ่ายค่าสมาชิกด้วยเหรอ บอกเลยว่าไม่จำเป็นครับ เราสามารถเปลี่ยนโค้ดส่วนนี้ให้เป็น server ด้วย module flask แล้วเอาบอทอีกตัวมาปิงมันไปเรื่อยๆ แค่นี้บอทเราก็ออนไลน์ได้ 24 ชั่วโมงแล้ว
เริ่มจากแทรกโค้ดส่วนนี้เข้าไป
from flask import Flaskfrom threading import Threadapp = Flask('')@app.route('/')def main(): return "Your Bot Is Ready"def run(): app.run(host="0.0.0.0", port=8000)def keep_alive(): server = Thread(target=run) server.start()
keep_alive()
หน้าตาโค้ดเราจะออกมาประมาณนี้(ถ้าจะรันบนเครื่องอย่าลืม pip install flask
ด้วยนะครับ)
หรือใครอยาก copy paste โค้ดตัวอย่างทั้งหมดที่ผมเขียนในบทความนี้ไป ก็อปได้ข้างล่างนี้เลยครับ
import discordimport requestfrom flask import Flaskfrom threading import Threadclient = discord.Client()app = Flask('')@app.route('/')def main(): return "Your Bot Is Ready"def run(): app.run(host="0.0.0.0", port=8000)def keep_alive(): server = Thread(target=run) server.start()keep_alive()
@client.eventasync def on_ready(): print('We have logged in as {0.user}'.format(client))
@client.eventasync def on_message(message): if message.author == client.user: return if message.content.startswith('-hello'): await message.channel.send('Hello!') if message.content.startswith('-btc'): response = requests.get('https://api.coindesk.com/v1/bpi/currentprice.json') data = response.json() #print(data) await message.channel.send("Current price is " + data["bpi"]["USD"]["rate"] + " US Dollar")client.run('ODUyMDg5OTU0ODA0NDMyOTA3.YMBwnA.fTElyy-uFiwx2vFq4yufjxxx-nY')
แค่นี้เราก็ setup server ของเราด้วย flask เรียบร้อย
หลังจากนั้นก็ได้เวลาที่จะสร้างบอทอีกตัวเพื่อping server ของเราแล้ว เข้าเว็บ uptimerobot.com สมัครสมาชิก แล้วไปยืนยันในอีเมล์เลยครับ
พอเข้าเว็บมาได้ก็กด Add New Monitor ด้านซ้าย แล้วเลือก https ตั้งชื่อ monitor แล้วก็อป url จาก replit มาแปะเลยครับ
อ้อ url จาก replit ที่ผมบอกคือที่วงสีแดงตรงนี้นะครับ
พอกด create monitor ทุกอย่างก็เสร็จเรียบร้อยแล้ว ในconsole ของ replit เราจะเห็นเซิฟเวอร์ของเราโดนปิงรัวๆ แบบนี้ ซึ่งทำให้บอทของเราออนไลน์ได้ตลอดเวลานั่นเองครับ
4) มาเพิ่มลูกเล่นให้บอทของเรากัน
พาร์ทต่อไปของบทความนี้มาแล้วนะครับ ใครที่อยากศึกษาความสามารถของโมดูล discord.py และเพิ่มลูกเล่นอื่นๆให้กับบอทตัวนี้ เชิญที่ลิ้งค์นี้ได้เลยครับ
คุยเรื่อยเปื่อยกันหน่อย เรื่องของuptimerobot
ผมใช้วิธีนี้ทำบอทมาพักนึงแล้ว ทำใช้เองบ้าง ทำเล่นกับเพื่อนบ้าง หลายๆคนดูจะกังวลในเรื่องของ uptimerobot มาก ซึ่งก็ไม่น่าแปลกอะไร มันฟังดูไม่ดีที่เราใช้ฟีเจอร์ของreplitได้ยังกับจ่ายเงินทั้งที่ใช้ฟรีอยู่ ผมขอยืนยันว่าวิธีนี้ไม่ได้ผิดกฎกติกาแต่อย่างใดนะครับ โดยคุณ Amjad Masad Co-founderและCEO ของ replit เคยเขียนเกี่ยวกับเรื่องนี้และสัญญาด้วยตัวเองว่าจะไม่บล็อก pinging service แบบที่เราใช้กันอยู่ในบทความนี้ครับ (อ่านข้อความเต็มๆได้ที่ลิ้งค์นี้ครับ)
ในส่วนของ replit.com น่าจะมีรายได้จากสมาชิกที่ต้องการกำลังประมวลผลมากๆอยู่แล้ว เพราะแบบที่เราใช้ฟรีนี้เราจะได้ storage 500 MB และ memory 500 MB ต่อหนึ่ง repl ซึ่งมันก็มากเกินพอแล้วสำหรับบอทดิสคอททั่วๆไป
หลังจากhost บอทของตัวเองมาเกือบสามเดือน uptimerobot ของผมรายงานว่าบอทของผมออนไลน์อยู่ 99.988% ซึ่งผมว่ามันก็น่าพอใจมากๆแล้วสำหรับบอทที่ฟรี 100% แบบนี้
ดังนั้น ทุกคนสามารถใช้วิธีนี้ได้อย่างสบายใจครับ แล้วค่อยจ่ายเงินในเวลาที่ต้องการ private repl หรือกำลังประมวลผลมากกว่านี้ก็ไม่สายครับ
บทความนี้ก็คงจบแต่เพียงเท่านี้ ขอบคุณทุกคนที่อ่านจนจบนะครับ ใครที่มีข้อสงสัยหรืออยากจะติชมอะไร คอมเม้นไว้ข้างล่างได้เลยนะครับ สวัสดีครับ