作为Write for DOnations计划的一部分,作者选择了免费和开源基金来接受捐赠。
介绍
Discord是一个流行的语音和短信平台,被游戏玩家、开源社区、会议组织者等使用。由于出色的语音聊天、各种文本渠道以及使用自动助手或“机器人”的可扩展性等功能,它广受欢迎。
在本指南中,您将使用 Python 编程语言构建一个 Discord 机器人并将其部署到 Ubuntu 20.04 服务器。您将使用 Discord Python 库discord.py
对您的机器人进行编程。
注意: Discord 的聊天室/语音室有两个不同的名称。他们将这些称为服务器和公会,具体取决于您在文档中的位置。在本教程中,我们将使用术语公会。只要知道这些术语可以互换使用,并且通常在官方 Discord 文档中。
先决条件
要完成本教程,您需要:
- 一台带有 sudo 非 root 用户和防火墙的Ubuntu 20.04 服务器。您可以按照我们的Ubuntu 20.04 初始服务器设置指南进行设置。
- 安装在本地机器上的 Python3。有关具体说明,您可以按照我们在 Windows、Mac或Linux上安装Python的教程之一进行操作。
- 一个 Discord 帐户和一个具有管理员权限的 Discord Guild。访问 [Discord 的入门](( https://support.discord.com/hc/en-us/articles/360033931551-Getting-Started) ) 页面以获取应用程序和免费帐户。然后创建一个公会。如果您创建自己的 Discord Guild,那么您将拥有添加机器人所需的权限。
- * 您选择的任何文本编辑器,例如Visual Studio Code、Atom、Sublime或Nano。
第 1 步 — 为您的 Discord Guild 创建一个机器人用户
在开始编码之前,您需要在 Discord 开发人员门户中创建并注册您的机器人。
登录开发人员门户并单击“新建应用程序”按钮开始该过程。Discord 应用程序允许您与 Discord API 进行交互。机器人与应用程序绑定;这就是它们的运作方式。
接下来,在模式中为应用程序添加一个名称,然后按“创建”按钮。在本教程中,我们将命名我们的SammySharkBot
.
Discord 将创建您的应用程序。接下来,您将看到一个页面,其中包含有关您的机器人的信息。您可以选择添加图片作为机器人的图标。单击页面“应用程序图标”部分中的“选择一个整洁的图标”按钮。这不是必需的。
如果您确实上传了图标,您会注意到一个对话框,提示您保存更改。按保存更改以保存您的图标。
现在您已经设置了您的应用程序,是时候创建一个与应用程序关联的机器人了。导航到屏幕左侧“设置”导航窗格中的Bot链接。
现在单击Add Bot按钮将机器人添加到您的应用程序中。
完成此操作后,将出现一个带有您之前设置的可选图标的机器人。记住这个页面;您需要稍后再返回以检索 API 令牌。
系统会提示您一个模式,指出添加机器人用户使您的应用程序在 Discord 中可见。但是,这个动作是不可撤销的!做出明智的选择。继续并按是,做吧!创建机器人用户。
接下来,导航到屏幕左侧“设置”导航窗格中的OAuth2链接。您需要添加适当的权限,以便您的机器人能够正常运行。
您需要添加机器人可以运行的范围。仅检查bot选项,因为这就是您希望此 bot 执行的全部操作。有关其他范围的更多信息,请访问Discord OAuth2 文档。
现在向下滚动并授予您的机器人以下权限:查看频道、发送消息、阅读消息历史记录。这将为您的机器人提供一组有限的可以执行的操作。如果你想创建一个没有限制的机器人,你可以选择管理员选项;不推荐这样做。
完成此操作后,将出现一个 Discord URL,后跟一个复制按钮。单击该按钮复制链接并在浏览器的新窗口中打开它。
将出现一个提示,让您的机器人连接您的公会。您可能有权在多个公会中安装机器人,因此您可能会在此处注意不止一个。选择您希望将机器人安装到的公会,然后单击授权。
在将机器人添加到您的公会之前,Discord 会向您显示机器人将拥有的所有权限。这可确保您了解正在安装的内容。如果您不希望机器人具有特定权限,则可以取消选中它。但是,不要为此机器人这样做,否则机器人将无法工作。单击授权以接受并将机器人添加到您的公会。
返回您的公会并检查出现有关新成员的帖子的频道。你会注意到你的机器人加入了你的公会。您的机器人也将出现在右侧的成员列表中,尽管机器人将显示为离线;这将在您启动机器人代码后改变。
现在您的机器人已添加到您的 Guild 中,您已准备好使用一些 Python 代码使其栩栩如生。
第 2 步 – 为您的项目创建 Python 虚拟环境
在开始编码之前,您需要设置 Python 开发人员环境。在此步骤中,您将在虚拟环境中安装并激活您的 Python 需求,以便于管理。
首先,在您的主目录中创建一个可用于存储所有虚拟环境的目录:
- mkdir ~/.venvs
现在使用 Python 创建您的虚拟环境:
- python3 -m venv ~/.venvs/discord
这将创建一个discord
在您的目录中调用的.venvs
目录。在里面,它将安装本地版本的 Python 和本地版本的pip
. 您可以使用它为您的项目安装和配置隔离的 Python 环境。
在安装项目的 Python 要求之前,请激活虚拟环境:
- source ~/.venvs/discord/bin/activate
您的提示应更改以指示您现在正在 Python 虚拟环境中操作。它会是这个样子:。(discord)user@host:~$
在您的虚拟环境处于活动状态时,discord.py
使用以下本地实例进行安装pip
:
- pip install discord.py
注意:一旦您激活了您的虚拟环境(当您的提示(discord)
前面有提示时),即使您使用的是 Python 3,也请使用pip
代替pip3
。该工具的虚拟环境副本始终命名为pip
,无论 Python 版本如何。
现在您已经安装了 Discord 包,您需要保存此要求及其依赖项。这是一个很好的做法,因此您可以根据需要重新创建您的开发人员环境。
使用pip
您的环境的信息保存到一个requirements.txt
文件中:
- pip freeze > requirements.txt
您现在拥有构建 Discord 机器人所需的库。
第 3 步 – 构建一个最小的 Discord 机器人
您现在将开始编码您的 Discord 机器人。完成后,您的机器人将侦听文本聊天中共享的某些短语,然后相应地做出响应。具体来说,您的机器人将代表用户抛硬币。
在此步骤中,您将构建机器人的最小版本。然后,您将在步骤 4和步骤 5 中添加更多功能。
首先,打开一个bot.py
在您首选的文本编辑器中命名的文件:
- nano bot.py
现在添加下面的进口文件:os
,random
,和discord
。该os
库将允许您阅读有价值的信息,比如API Tokens
和Guild Name
从你的环境变量。该random
库将允许您为随机事件生成输出。该discord
库将为您提供与 discord API 交互所需的方法、对象和装饰器。代码如下:
import os
import random
import discord
接下来,您需要从环境变量中检索 Discord API 令牌和您的机器人公会。你会使用的方法getenv
从os
Python标准库库。将以下代码附加到bot.py
:
...
token = os.getenv("DISCORD_TOKEN")
my_guild = os.getenv("DISCORD_GUILD")
在 1.5 版中discord.py
,Intents
引入了。这是对之前版本的 Discord 库的重大更改,允许机器人订阅公会内发生的某些事件。在本教程中,您将客户端的可用意图设置为默认值,但如果您计划与GUILD_PRESENCES
或GUILD_MEMBERS
意图进行交互,则可能需要重新访问。这些是特权网关意图。
将以下代码附加到bot.py
以正确设置意图:
...
intents = discord.Intents.default()
client = discord.Client(intents=intents)
现在,让我们编写一些代码来响应 Discord 中的事件。事件是发生在 Discord Guild 上的操作,例如发送消息或加入频道。有关受支持事件的完整列表,请查看Discord 事件参考 API。
第一段代码将在on_ready
事件上激活。当您的机器人加载到公会时触发此事件。请注意,Discord API 不保证此事件只发生一次。如果您打算将只应运行一次的代码放在这里,请进行一些检查以确保它确实只执行一次。
您将编写一个打印语句,在您的机器人成功连接到您的公会时进行打印。Discord 机器人需要使用async
方法,以便机器人处于就绪状态并等待调用。
将以下代码附加到 末尾bot.py
:
...
@client.event
async def on_ready():
for guild in client.guilds:
if guild.name == my_guild:
break
print(
f"{client.user} is connected to the following guild:\n"
f"{guild.name}(id: {guild.id})"
)
您使用for
循环在所有可用公会中查找您的公会,然后打印有关该公会及其连接的信息。
最后,您需要告诉客户端在使用您的 API 令牌执行脚本时运行。将以下行附加到bot.py
以运行您的机器人:
...
client.run(token)
此时,您的代码应如下所示:
import os
import random
import discord
token = os.getenv("DISCORD_TOKEN")
my_guild = os.getenv("DISCORD_GUILD")
intents = discord.Intents.default()
client = discord.Client(intents=intents)
@client.event
async def on_ready():
for guild in client.guilds:
if guild.name == my_guild:
break
print(
f"{client.user} is connected to the following guild:\n"
f"{guild.name}(id: {guild.id})"
)
client.run(token)
您刚刚编写了允许您的机器人连接到公会的框架代码。现在,您将测试机器人的基本功能。
第 4 步 — 在本地测试您的机器人
在您继续编码之前,请检查您的机器人是否可以连接到 Discord。导航回discord 开发人员面板,然后单击左侧导航栏中的Bot链接。从这里,找到机器人用户名下方的令牌,然后单击复制按钮将令牌复制到剪贴板。
复制令牌后,返回具有激活虚拟环境的终端。导出 Discord 令牌,以便它在环境变量中可供您的机器人在启动时读取:
- export DISCORD_TOKEN=YOUR_DISCORD_TOKEN
现在您需要获取您的机器人将加入的公会名称。导航到您的 Discord 公会。公会名称应位于公会页面的左上角。这是您在先决条件部分创建公会时选择的名称。
现在,导出 Discord Guild,以便它在环境变量中可用,供您的机器人在启动时读取:
- export DISCORD_GUILD=YOUR_DISCORD_GUILD
现在您已经导出了必要的环境变量,您可以测试您的机器人了:
运行应用程序:
- python3 bot.py
这可能需要几秒钟,但您会收到这样的输出。请注意,您的机器人编号 和id
会有所不同:
OutputSammySharkBot#8143 is connected to the following Guild:
SammyShark(id: 801529616116350998)
导航回您的 Discord Guild,您会注意到您的机器人现在在其名称附近有一个绿色圆圈。这表明机器人在线。
您可能会在终端中注意到您的代码没有终止。这是因为机器人是一个不断运行的进程。要随时停止您的机器人,请按CTRL + C组合键。
步骤 5 — 扩展 Discord Bot 以执行随机任务
现在您的机器人正在运行,是时候扩展其功能了。为了您的僵尸在文字聊天发送的消息做出反应,你需要听的on_message
事件。该函数接受一个参数,message
,它包含消息对象,包括用于响应消息的各种属性和方法。
您需要确保的一件事是您的机器人不会自行回答。如果机器人将自己的消息解释为触发器,那么它将创建一个无限循环。为避免这种情况,请检查发送消息的用户是否不是机器人。
附加以下代码以bot.py
声明on_message
函数并检查谁发送了消息:
...
@client.event
async def on_message(message):
if message.author == client.user:
return
最后,添加代码以翻转硬币。您还将对消息内容执行小写(或大写,如果您愿意)的字符串操作,因此您不必担心匹配字符串中的确切大小写。使用randint()
Pythonrandom
库中的函数来模拟抛硬币。最后,一旦您制作了一条消息,您将使用发送消息的方法将其发送到频道。请记住,这是异步编程,因此您必须await
在发送消息时使用关键字。
以下代码附加到bot.py
所述内on_message
功能; 这将添加硬币翻转功能:
message_content = message.content.lower()
if "flip a coin" in message_content:
rand_int = random.randint(0, 1)
if rand_int == 0:
results = "Heads"
else:
results = "Tails"
await message.channel.send(results)
以下是机器人的完成代码。确保您的代码如下所示,或复制并粘贴以下代码:
import os
import random
import discord
token = os.getenv("DISCORD_TOKEN")
my_guild = os.getenv("DISCORD_GUILD")
intents = discord.Intents.default()
client = discord.Client(intents=intents)
@client.event
async def on_ready():
for guild in client.guilds:
if guild.name == my_guild:
break
print(
f"{client.user} is connected to the following guild:\n"
f"{guild.name}(id: {guild.id})"
)
@client.event
async def on_message(message):
if message.author == client.user:
return
message_content = message.content.lower()
if "flip a coin" in message_content:
rand_int = random.randint(0, 1)
if rand_int == 0:
results = "Heads"
else:
results = "Tails"
await message.channel.send(results)
client.run(token)
现在机器人已经完成了,是时候测试它了。保存并关闭文件。
重新运行应用程序:
- python3 bot.py
应用程序连接到您的公会后,导航到您的 Discord 公会中的#general频道。键入flip a coin
的文本聊天,和机器人将响应要么元首或尾巴。
现在您已经确认您的机器人可以正常工作,您可以将其部署到 Ubuntu 20.04 服务器上的生产环境。
第 6 步 – 部署到 Ubuntu 20.04
您可以让您的机器人在本地机器上运行,但必须让终端保持活动状态或担心停电可能会很烦人。为方便起见,您可以将其部署到服务器。
最佳做法是以非 root 用户身份运行您的机器人。本教程使用用户名sammy。
首先,使用scp
命令将您的代码和 Python 库要求复制到服务器。将所有内容发送到您用户的根目录:
- scp bot.py requirements.txt sammy@your_server_ip:~
接下来,通过 ssh 进入您的服务器:
- ssh sammy@my_server_ip
您现在将在服务器的终端中输入命令。
您需要安装正确的 Python 系统包才能在您的服务器上运行您的机器人。
安装python3
,python3-venv
以及screen
:
- sudo apt update && sudo apt install python3 python3-venv screen
现在,您将使用一个名为 screen 的工具来创建一个虚拟终端。如果没有这个工具,如果您在机器人运行时退出终端,该进程将终止,您的机器人将离线。使用此工具,您可以连接和断开会话,以便您的代码保持运行。要了解有关 screen 的更多信息,请查看我们关于安装和使用 screen 的教程。
要启动屏幕会话,请使用以下命令:
- screen
屏幕将提示您提供许可协议。按回车继续。
现在您已经设置了一个虚拟会话,您需要创建一个 Python 虚拟环境来运行您的代码。
首先,像以前一样,创建一个目录来存储您的虚拟环境:
- mkdir ~/.venvs
然后创建一个新的虚拟环境:
- python3 -m venv ~/.venvs/discord
激活虚拟环境:
- source ~/.venvs/discord/bin/activate
接下来,使用 pip 安装必要的库:
- pip install -r requirements.txt
在您可以运行您的机器人之前,您需要导出DISCORD_TOKEN
并且DISCORD_GUILD
您的机器人可以访问 API 密钥和公会信息:
- export DISCORD_TOKEN=YOUR_DISCORD_TOKEN
- export DISCORD_GUILD=YOUR_DISCORD_GUILD
最后,运行你的机器人:
- python3 bot.py
您的机器人将启动并开始接受消息。您可以使用组合键CTRL + A + D与屏幕会话断开连接。当您准备好重新连接到会话时,您可以使用以下screen
命令:
- screen -r
您已经使用 Python 成功构建了一个 Discord 机器人。该应用程序在服务器上运行并响应公会中共享的某些短语。
结论
在本教程中,您设置了一个 Discord Guild,构建了一个 Discord 机器人,在您的 Guild 中安装了该机器人,并将该机器人部署到了 Ubuntu 20.04 服务器。您才刚刚开始探索 Discord API。机器人功能强大且可扩展。要探索其他功能,请查看discord.py API 文档。
或者,如果您希望了解有关 Python 编程的更多信息,请访问我们的教程系列,如何在 Python 3 中编码。