如何在 Ubuntu 20.04 上用 Python 构建 Discord Bot

作为Write for DOnations计划的一部分,作者选择了免费和开源基金来接受捐赠

介绍

Discord是一个流行的语音和短信平台,被游戏玩家、开源社区、会议组织者等使用。由于出色的语音聊天、各种文本渠道以及使用自动助手或“机器人”的可扩展性等功能,它广受欢迎。

在本指南中,您将使用 Python 编程语言构建一个 Discord 机器人并将其部署到 Ubuntu 20.04 服务器。您将使用 Discord Python 库discord.py对您的机器人进行编程。

注意: Discord 的聊天室/语音室有两个不同的名称。他们将这些称为服务器和公会,具体取决于您在文档中的位置。在本教程中,我们将使用术语公会。只要知道这些术语可以互换使用,并且通常在官方 Discord 文档中。

先决条件

要完成本教程,您需要:

第 1 步 — 为您的 Discord Guild 创建一个机器人用户

在开始编码之前,您需要在 Discord 开发人员门户中创建并注册您的机器人。

登录开发人员门户并单击“新建应用程序”按钮开始该过程。Discord 应用程序允许您与 Discord API 进行交互。机器人与应用程序绑定;这就是它们的运作方式。

单击新建应用程序按钮

接下来,在模式中为应用程序添加一个名称,然后按“创建”按钮。在本教程中,我们将命名我们的SammySharkBot.

命名您的应用程序

Discord 将创建您的应用程序。接下来,您将看到一个页面,其中包含有关您的机器人的信息。您可以选择添加图片作为机器人的图标。单击页面应用程序图标”部分中的选择一个整洁的图标”按钮这不是必需的。

为您的机器人添加可选图标

如果您确实上传了图标,您会注意到一个对话框,提示您保存更改。保存更改以保存您的图标。

保存您的更改

现在您已经设置了您的应用程序,是时候创建一个与应用程序关联的机器人了。导航到屏幕左侧“设置”导航窗格中Bot链接

向您的应用程序添加机器人

现在单击Add Bot按钮将机器人添加到您的应用程序中。

确认机器人的创建

完成此操作后,将出现一个带有您之前设置的可选图标的机器人。记住这个页面;您需要稍后再返回以检索 API 令牌。

机器人确认页面

系统会提示您一个模式,指出添加机器人用户使您的应用程序在 Discord 中可见。但是,这个动作是不可撤销的!做出明智的选择。继续并按是,做吧!创建机器人用户。

接下来,导航到屏幕左侧“设置”导航窗格中OAuth2链接您需要添加适当的权限,以便您的机器人能够正常运行。

导航到 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

现在添加下面的进口文件:osrandom,和discordos库将允许您阅读有价值的信息,比如API TokensGuild Name从你的环境变量。random库将允许您为随机事件生成输出。discord库将为您提供与 discord API 交互所需的方法、对象和装饰器。代码如下:

bot.py
import os
import random
import discord

接下来,您需要从环境变量中检索 Discord API 令牌和您的机器人公会。你会使用的方法getenvosPython标准库库。将以下代码附加到bot.py

bot.py
...

token = os.getenv("DISCORD_TOKEN")
my_guild = os.getenv("DISCORD_GUILD")

在 1.5 版中discord.pyIntents引入了。这是对之前版本的 Discord 库的重大更改,允许机器人订阅公会内发生的某些事件。在本教程中,您将客户端的可用意图设置为默认值,但如果您计划与GUILD_PRESENCESGUILD_MEMBERS意图进行交互,则可能需要重新访问这些是特权网关意图

将以下代码附加到bot.py以正确设置意图:

bot.py
...

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

现在,让我们编写一些代码来响应 Discord 中的事件。事件是发生在 Discord Guild 上的操作,例如发送消息或加入频道。有关受支持事件的完整列表,请查看Discord 事件参考 API

第一段代码将在on_ready事件上激活当您的机器人加载到公会时触发此事件。请注意,Discord API 不保证此事件只发生一次。如果您打算将只应运行一次的代码放在这里,请进行一些检查以确保它确实只执行一次。

您将编写一个打印语句,在您的机器人成功连接到您的公会时进行打印。Discord 机器人需要使用async方法,以便机器人处于就绪状态并等待调用。

将以下代码附加到 末尾bot.py

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以运行您的机器人:

bot.py
...

client.run(token)

此时,您的代码应如下所示:

bot.py
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会有所不同:

Output
SammySharkBot#8143 is connected to the following Guild: SammyShark(id: 801529616116350998)

导航回您的 Discord Guild,您会注意到您的机器人现在在其名称附近有一个绿色圆圈。这表明机器人在线。

验证您的机器人在线

您可能会在终端中注意到您的代码没有终止。这是因为机器人是一个不断运行的进程。要随时停止您的机器人,请按CTRL + C组合键。

步骤 5 — 扩展 Discord Bot 以执行随机任务

现在您的机器人正在运行,是时候扩展其功能了。为了您的僵尸在文字聊天发送的消息做出反应,你需要听on_message事件该函数接受一个参数,message,它包含消息对象,包括用于响应消息的各种属性和方法

您需要确保的一件事是您的机器人不会自行回答。如果机器人将自己的消息解释为触发器,那么它将创建一个无限循环。为避免这种情况,请检查发送消息的用户是否不是机器人。

附加以下代码以bot.py声明on_message函数并检查谁发送了消息:

bot.py
...
@client.event
async def on_message(message):
    if message.author == client.user:
        return

最后,添加代码以翻转硬币。您还将对消息内容执行小写(或大写,如果您愿意)的字符串操作,因此您不必担心匹配字符串中的确切大小写。使用randint()Pythonrandom中的函数来模拟抛硬币。最后,一旦您制作了一条消息,您将使用发送消息的方法将其发送到频道。请记住,这是异步编程,因此您必须await在发送消息时使用关键字。

以下代码附加到bot.py所述内on_message功能; 这将添加硬币翻转功能:

bot.py
    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)

以下是机器人的完成代码。确保您的代码如下所示,或复制并粘贴以下代码:

bot.py
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的文本聊天,和机器人将响应要么元首尾巴

你的机器人应该用 Heads 或 Tails 响应

现在您已经确认您的机器人可以正常工作,您可以将其部署到 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 系统包才能在您的服务器上运行您的机器人。

安装python3python3-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 中编码

觉得文章有用?

点个广告表达一下你的爱意吧 !😁