這是一篇 Python Discord Bot 實作筆記,會教學如何建構一個結構清晰、可維護性高的 Discord Bot。從基礎的 Bot 創建流程,到合理的檔案架構規劃,接著進入環境設置與 discord.py 模組的詳細介紹,最後則會學習如何透過 Cog 架構 來模組化指令,使 Bot 的擴展與維護更加便捷。
首先,如果您還沒有 Discord Bot,則需要在 Discord 開發者入口網站 中建立一個新的應用程式:
建立應用程式
啟用 Bot 並取得 Token
設定 Bot 權限
邀請 Bot 加入伺服器
成功加入伺服器後,執行以下操作以確保 Bot 順利運行:
調整 Bot 身分組順位
啟用 Bot 的應用程式指令 (Slash Commands) 權限
Use Application Commands
權限已啟用。確認 Bot 具備必要的文字與語音頻道權限
這樣, Bot 就完成了邀請與基礎設置!
Python-Discord-Bot-Template/
├── cogs/
├── database/
├── venv/
├── .dockerignore
├── .env.example
├── .gitignore
├── Dockerfile
├── LICENSE.md
├── README.md
├── bot.py
├── docker-compose.yml
└── requirements.txt
cogs/
Cog
類別實作的指令模組與事件處理邏輯。.py
檔案通常代表一個功能區塊(如:管理模組、遊戲模組、音樂模組等)。database/
venv/
venv
模組建立的虛擬環境,可有效隔離專案相依套件,避免版本衝突。此資料夾不應提交至 Git,請確保已列入 .gitignore
。.dockerignore
.gitignore
,可加速建置流程並減少不必要的內容進入映像檔。.env.example
.env
,並填入實際的 Token、資料庫連線字串等敏感資訊。方便不同開發者在本機環境進行一致的設定。.gitignore
venv/
、.env
、快取檔(如 .pyc
)等,避免洩漏機密或提交不必要的檔案。Dockerfile
LICENSE.md
README.md
bot.py
docker-compose.yml
requirements.txt
pip install -r requirements.txt
即可安裝所有套件,確保團隊成員或部署環境一致。以下的環境配置是為了增加維護性、可擴充性及安全性,也利於後續於伺服器端上的部屬:
建議使用 Python 的虛擬環境管理專案依賴,以避免套件版本衝突並確保部署一致性:
python -m venv venv
source venv/bin/activate # macOS / Linux
venv\Scripts\activate # Windows
pip install -r requirements.txt
建立 .env
設定檔,並放置機密資訊(如 Discord Token):
cp .env.example .env
# 請在 .env 檔案中填入 DISCORD_TOKEN 等必要變數
可搭配 python-dotenv
模組,自 .env
自動載入環境變數至程式中。
bot.py
主程式邏輯說明主執行程式 in bot.py
:
import os
import asyncio
import discord
from discord.ext import commands
intents = discord.Intents.all()
bot = commands.Bot(command_prefix="!", intents=intents)
# 當機器人完成啟動時
@bot.event
async def on_ready():
print(f"目前登入身份 --> {bot.user}")
# 載入指令程式檔案
@bot.command()
async def load(ctx, extension):
await bot.load_extension(f"cogs.{extension}")
await ctx.send(f"Loaded {extension} done.")
# 卸載指令檔案
@bot.command()
async def unload(ctx, extension):
await bot.unload_extension(f"cogs.{extension}")
await ctx.send(f"UnLoaded {extension} done.")
# 重新載入程式檔案
@bot.command()
async def reload(ctx, extension):
await bot.reload_extension(f"cogs.{extension}")
await ctx.send(f"ReLoaded {extension} done.")
# 一開始bot開機需載入全部程式檔案
async def load_extensions():
for filename in os.listdir("./cogs"):
if filename.endswith(".py"):
await bot.load_extension(f"cogs.{filename[:-3]}")
async def main():
async with bot:
await load_extensions()
await bot.start(os.getenv("DISCORD_TOKEN"))
# 確定執行此py檔才會執行
if __name__ == "__main__":
asyncio.run(main())
discord.Intents.all()
啟用所有事件監聽能力,適合開發階段進行全功能測試。!
。。load
、unload
和 reload
指令可動態管理 cogs/
中的模組,不須重新啟動 Bot 即可進行更新,有利於開發與除錯。