昨天我們完成了 Discord 應用程式與 Bot 的設定,也把 Bot 加入測試伺服器。
不過,Bot 目前仍然顯示離線。這是因為我們只有建立 Bot 帳號,還沒有執行真正讓它工作的程式。
今天要用 Python 啟動 Discord Bot,並建立第一個文字指令:
!hello
這次除了讓 Bot 上線,另一個重點是如何安全保存 Discord Bot Token,避免把它直接寫進程式碼。
上一篇:DAY 2|建立 Discord Bot,讓第一位 AI 員工上線
discord.py 與 python-dotenv
.env、.gitignore 與 requirements.txt
.env 讀取 Discord Bot Token!hello
先建立專案資料夾:
mkdir discord-ai-company
cd discord-ai-company
接著建立並啟用虛擬環境。
macOS 或 Linux:
python3 -m venv .venv
source .venv/bin/activate
Windows PowerShell:
py -m venv .venv
.venv\Scripts\Activate.ps1
虛擬環境可以讓這個專案擁有自己的 Python 套件,不會和其他專案混在一起。啟用成功後,終端機前面通常會出現 (.venv)。
安裝今天需要的套件:
python -m pip install -U discord.py python-dotenv
再把目前安裝的套件記錄到 requirements.txt:
python -m pip freeze > requirements.txt
完成後,專案結構會是:
discord-ai-company/
├── .venv/
├── .env
├── .gitignore
├── bot.py
└── requirements.txt
Discord Bot Token 是 Bot 登入 Discord 的憑證,可以把它想成 Bot 的密碼。
最直接的寫法,是把 Token 放進 Python 程式:
bot.run("你的DiscordBotToken")
雖然這樣可以執行,但 Token 會和程式碼放在一起。只要把程式碼貼到文章、傳給其他人,或上傳到 GitHub,就可能連同 Token 一起公開。
因此,我們不把 Token 寫死在 bot.py,而是放進獨立的 .env:
DISCORD_TOKEN=在這裡貼上你的DiscordBotToken
這樣做有幾個原因:
把 Token 放進 .env,主要是避免登入憑證和程式碼混在一起。分享 bot.py 或上傳 GitHub 時,就不會順便公開 Token。
.env 還要加入 .gitignore。如果它曾經被提交到 Git,即使後來加入忽略清單,舊紀錄仍然存在,這時應該重新產生 Token。
Bot Token 不要放進文章、截圖或 GitHub。如果 Token 曾經公開,請立即回到 Discord Developer Portal 重設權杖,讓舊 Token 失效。
在專案根目錄建立 .gitignore:
.env
.venv/
__pycache__/
*.pyc
其中最重要的是:
.env
它會告訴 Git 不要追蹤 .env。
不過,如果 .env 已經被提交過,再把它加入 .gitignore 並不會清除舊紀錄。只要 Token 曾經進入 Git 紀錄,最安全的做法仍然是重新產生 Token。
在 bot.py 中,先載入 .env:
import os
from dotenv import load_dotenv
load_dotenv()
token = os.getenv("DISCORD_TOKEN")
load_dotenv() 會讀取 .env,並把裡面的設定載入環境變數。
接著,os.getenv("DISCORD_TOKEN") 會取得我們放在 .env 裡的 Token。程式只知道要讀取名為 DISCORD_TOKEN 的設定,不需要知道實際內容。
如果 .env 沒有設定 Token,可以先停止程式:
if not token:
raise RuntimeError("找不到 DISCORD_TOKEN,請檢查 .env。")
這樣可以比 Discord 登入失敗更早發現設定問題。
完整的 bot.py 如下:
import os
import discord
from discord.ext import commands
from dotenv import load_dotenv
load_dotenv()
token = os.getenv("DISCORD_TOKEN")
if not token:
raise RuntimeError("找不到 DISCORD_TOKEN,請檢查 .env。")
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
@bot.event
async def on_ready():
print(f"Bot 已登入:{bot.user}")
@bot.command()
async def hello(ctx):
await ctx.send("Hello!我已經上線了。")
bot.run(token)
這裡設定 command_prefix="!",代表 Bot 的文字指令會以 ! 開頭。
@bot.command() 則會把 hello() 註冊成指令。因此,當 Discord 頻道收到 !hello,Bot 就會回覆訊息。
另外,文字指令需要讀取訊息內容,所以除了 DAY 2 在 Discord Developer Portal 開啟 Message Content Intent,程式裡也要設定:
intents.message_content = True
確認虛擬環境已啟用後,執行:
python bot.py
如果成功連上 Discord,終端機應該會顯示:

回到 Discord 測試伺服器,在 Bot 可以查看並傳送訊息的頻道輸入:
!hello
Bot 預期會回覆:

執行 python bot.py 後,Bot 會從離線變成上線。在 Discord 輸入 !hello,確認它能讀取訊息並回覆。
目前的 Bot 只會執行預先寫好的指令。下一步要準備本地語言模型,讓它可以根據問題產生回答。