【教學】EP 1 - 用 Python 架自己的 Discord Bot 吧

在閱讀此篇文章前,作者建議:您已有程式的基礎底子,並且此篇著重於程式碼的部分,其餘皆為概略步驟。

請注意文章日期的時效性

為何自架?

  1. 因為興趣(?
  2. 市面上太多太多需要付費使用的 Discord Bot
  3. 自架的可調性高
  4. 可以順便當作自己的小作品

從何開始?

這邊建議尋找 YouTube 影片學著做或其他文章。

安裝 Python

  1. 你得先安裝好 Python 的環境,安裝時,記得 PyPI 也要勾選到,它可以提供許多 Python 實用的套件。
  2. 安裝完後,請先新建一份資料夾,這個就是你的專案,我命名:DiscordBot

安裝 Visual Studio Code

這是一個文字編輯器,用來編輯檔案。也可以使用其他文字編輯器,但我推薦使用 VS Code。

  1. 安裝後,請在 Marketplace(延伸模組)中,再搜尋:Python 和其他你想裝的延伸模組。

建立自己的機器人

  1. 請到 Discord Developer Portal 建立機器人,也就是按下【New Application】。
  2. 接著你可以開始先對它做基本的修飾:Name(剛才命名過了)、Description、App Icon(就是頭像)
  3. 在左側導覽列進入【Bot】,找尋細項:【TOKEN】,並把它複製起來(記著它)。

請勿把機器人的 TOKEN 洩漏在其他地方,例如:你可能會想部署到你的 GitHub Repo,或者其他地方。
因為當你洩漏了,其他人就有可能操控它。

當然,你也可以試看看會發生什麼事(其實就只是 DC 會通知你 TOKEN 外洩,請重新生成一個 TOKEN)

  1. 接著在左側導覽列進入【OAuth2】,找尋:【OAuth2 URL Generator】,勾選【SCOPES】中的 bot 和【BOT PERMISSIONS】中的 Administrator。
  2. 接著進入下方所生成的連結,邀請到你的伺服器就可以看到你的機器人已加入你的伺服器啦!

開始寫自己的機器人吧

  1. 先在終端機安裝 Python 的 Discord.py 套件,輸入:pip install discord.py

  2. 在你的資料夾中創建一個 bot.py,內容如下,也歡迎去參考官方文檔

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import discord  # 導入discord

    intents = discord.Intents.default()
    intents.message_content = True
    client = discord.Client(intents = intents)

    # 調用 event 函式庫 -> 也就是事件
    @client.event
    # on_ready 表示啟動成功時
    async def on_ready():
    print(f"目前登入身份 --> {client.user}")

    @client.event
    # 當頻道有新訊息
    async def on_message(message):
    # 排除機器人本身的訊息,避免無限循環
    if message.author == client.user:
    return
    # 新訊息包含 Hello,回覆 Hello, world!
    if message.content == "Hello":
    await message.channel.send("Hello, world!")

    client.run("機器人的TOKEN") # 請把字串改成機器人的 TOKEN
  3. 存好檔後,就可以執行它啦。可以測試在頻道打出 Hello,它就會回應你 Hello, world!

這部分是透過事件偵測,來觸發機器人的回應。如果要讓機器人使用前綴指令,可以參考下方程式碼。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 導入 Discord.py 模組
import discord
# 導入 commands 指令模組
from discord.ext import commands

# intents是要求機器人的權限
intents = discord.Intents.all()
bot = commands.Bot(command_prefix = "=", intents = intents)

@bot.event
# 當機器人完成啟動
async def on_ready():
print(f"目前登入身份 --> {bot.user}")

@bot.command()
# 輸入 $Hello 呼叫指令
async def Hello(ctx):
# 回覆 Hello, world!
await ctx.send("Hello, world!")

bot.run("機器人的TOKEN")

接著試著打 $Hello,它就會回應 Hello, world!

但如果你想讓這兩段程式碼合併,你會發現它無法正常執行,這是因為 on_message 與 command 相互牴觸,所以之後將再額外講解 Cog 寫法,它可以有效的解決前綴指令與事件觸發的牴觸問題,並且在維護上將會變得更容易維護。

參考網站

  • discord.py 官方文檔
  • Python Discord Bot 基礎教學
  • YouTube 頻道 Proladon