如何制作 Discord 机器人
本页内容
Discord 机器人是一个用自己的账号登录 Discord 的程序,可以回应命令、管理频道、玩游戏或发布动态。制作一个机器人需要三样东西:Discord Developer Portal 中的一个应用、几行代码,以及运行这些代码的地方。
本指南将搭建一个带有 /ping 斜杠命令的可用机器人,使用 Python(discord.py)或 JavaScript(discord.js)——选择你熟悉的语言即可。
第 1 步:创建应用和机器人令牌
- 打开 Developer Portal。访问 discord.com/developers/applications,新建一个应用并为其命名。
- 获取令牌。在 Bot 页面点击 Reset Token 并复制。Discord 只显示一次;如果弄丢了,再重置一次即可。
- 妥善保密令牌。它就是机器人的密码:任何拿到它的人都能控制你的机器人。切勿把它粘贴到要分享的代码中,也不要提交到 Git。
第 2 步:邀请机器人加入你的服务器
- 打开应用的 Installation 页面。
- 在服务器(guild)的默认安装设置中,添加 scopes
bot和applications.commands,以及机器人所需的权限——本指南只需 Send Messages。 - 打开生成的安装链接,选择你的服务器并授权。机器人会出现在成员列表中,在你的代码运行之前显示为离线。
较早的教程使用 OAuth2 > URL Generator 并勾选相同的两个 scopes,这种方式仍然可用。
第 3a 步:用 Python 编写机器人(discord.py)
discord.py 2.7 需要 Python 3.8 或更高版本。安装它并创建 bot.py:
pip install discord.py
import os
import discord
from discord import app_commands
class Bot(discord.Client):
def __init__(self):
super().__init__(intents=discord.Intents.default())
self.tree = app_commands.CommandTree(self)
async def setup_hook(self):
await self.tree.sync()
bot = Bot()
@bot.tree.command(description="Replies with Pong!")
async def ping(interaction: discord.Interaction):
await interaction.response.send_message("Pong!")
bot.run(os.environ["DISCORD_TOKEN"])
运行时把令牌放在环境变量中,例如在 Linux 或 macOS 上执行 DISCORD_TOKEN=your-token python bot.py。
第 3b 步:用 JavaScript 编写机器人(discord.js)
discord.js 14 需要 Node.js 18 或更高版本。在一个新文件夹中运行 npm install discord.js,然后创建 index.js:
const { Client, Events, GatewayIntentBits, REST, Routes, SlashCommandBuilder } = require('discord.js');
const commands = [new SlashCommandBuilder().setName('ping').setDescription('Replies with Pong!').toJSON()];
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once(Events.ClientReady, async (c) => {
await new REST().setToken(process.env.DISCORD_TOKEN).put(Routes.applicationCommands(c.user.id), { body: commands });
console.log(`Logged in as ${c.user.tag}`);
});
client.on(Events.InteractionCreate, async (interaction) => {
if (interaction.isChatInputCommand() && interaction.commandName === 'ping') await interaction.reply('Pong!');
});
client.login(process.env.DISCORD_TOKEN);
用 DISCORD_TOKEN=your-token node index.js 启动。当控制台显示 Logged in 后,在你的服务器中输入 /ping。
不要把令牌写进代码
- 使用环境变量或
.env文件,并在第一次提交之前把.env添加到.gitignore。 - 如果令牌泄露,请立即在 Bot 页面重置。旧令牌会失效,然后在机器人运行的地方更新为新令牌。
- GitHub 会扫描公开仓库中的 Discord 机器人令牌并报告给 Discord,Discord 可以将其吊销——因此误推送的令牌往往在你察觉之前就已失效。
第 4 步:让机器人保持在线
只有代码在运行时,机器人才会在线。关闭终端或关掉电脑,它就会离线。你有三种选择:
- 你自己的电脑——免费,适合开发和测试,但电脑休眠时机器人也会休眠。
- 免费套餐——大多数会让整月运行的机器人进入休眠或受到限制;具体取舍可参见免费 Discord 机器人托管。
- 机器人托管——一台始终在线的小型服务器。在 HytHost Discord 机器人托管上,你上传项目,选择 Node.js、Python 或其他运行环境,面板会启动机器人并在崩溃时自动重启。
从上传到自动重启的完整教程,请参阅如何 24/7 托管 Discord 机器人。
无需让电脑一直开机即可运行机器人:HytHost Discord 机器人托管支持 Node.js、Python、Java、Go、C#、Bun 和 Lavalink——低至 €0.89/月。
查看机器人托管套餐常见问题
是的。创建应用、令牌和代码都不花钱,discord.py 和 discord.js 也是免费的。只有当你想把它托管在能保持在线的地方时才需要付费。
用你已经熟悉的那个。discord.py 和 discord.js 都很成熟,覆盖完整的 Discord API。如果两者都不熟悉,Python 读起来更简单;JavaScript 的库生态更大。
检查邀请时是否包含 applications.commands scope,以及代码是否已同步命令。全局命令可能需要一点时间才会出现;如果仍未出现,请重启 Discord。
读取普通消息文本需要 Message Content intent,既要在 Developer Portal 中开启,也要在代码中请求。没有它,机器人仍然可以接收斜杠命令、提及和私信。
立即在 Developer Portal 的 Bot 页面重置。旧令牌会失效;把新令牌填到机器人运行的地方,并从代码或提交历史中删除旧令牌。
这篇指南对你有帮助吗?