如何在 Ubuntu 20.04 上用 Python 构建一个 Discord 机器人

_ 作者选择了 免费和开源基金作为 写给捐款计划的一部分接受捐款。

介绍

Discord是一个受欢迎的语音和文本消息平台,由玩家,开源社区,会议组织者等使用。

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

<$>[注] 注: Discord 对他们的聊天/语音室有两种不同的名称。 他们将这些称为服务器和团体,取决于你在文档中的位置。 对于本教程,我们将使用团体一词。 只知道这些术语可以互换使用,并且通常在官方的 Discord 文档中。

前提条件

要完成本教程,您将需要:

.

步骤 1 — 创建你的分歧团体的机器人用户

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

登录到 开发者门户并点击 新应用程序 按钮开始流程。 Discord 应用程序允许您与 Discord API 互动。

Click the New Application Button

接下来,在模式中添加应用程序的名称,并按下 创建 按钮. 为此教程,我们将命名我们的 SammySharkBot

Name Your Application

Discord 会创建你的应用程序. 接下来,你会注意到有关你的机器人的信息的一页. 你可以选择添加一个图像作为你的机器人的图标. 在页面的 App Icon 部分点击** Choose a Neat Icon** 按钮。

Add an optional icon for your bot

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

Save your changes

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

Add a bot to your application

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

Confirm the creation of the bot

一旦你完成了,一个 Bot 将出现在你之前设置的可选图标上,记住此页面;你需要稍后返回它以获取 API Token。

Bot confirmation page

您将被提示使用一种模式,该模式表示 **添加一个机器人用户会让您的应用程序在 Discord 中可见。 但是,这种操作是不可逆转的! 明智地选择。

接下来,导航到屏幕左侧的设置导航窗格中的OAuth2链接,您需要添加相应的权限,以便您的机器人能够正常工作。

Navigate to OAuth2 menu

您只需检查 bot 选项,因为这就是您想要这个机器人做的。 有关其他范围的更多信息,请访问 Discord OAuth2 文档

Add bot designation

现在向下滚动,并给你的机器人以下权限: 查看频道 ,** 发送消息** ,** 阅读消息历史** . 这将给你的机器人有限的操作,它可以执行。

完成此操作后,会出现一个 Discord URL,然后出现一个 复制 按钮. 点击此按钮来复制链接,并在浏览器中的新窗口中打开。

Add bot permissions and copy the link

你的机器人会出现提示来连接你的Guild。你可能有权在多个Guild中安装机器人,所以你可以在这里注意多个。

Add bot to your Guild

在将机器人添加到你的 Guild 之前,Discord 会向你显示机器人将拥有的所有权限。这确保你知道你正在安装什么。如果你不希望机器人具有特定的权限,你可以解锁它。

Authorize bot permissions

你会注意到你的机器人加入了你的机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人机器人

Check if your bot joined your guild

现在你的机器人已被添加到你的团伙中,你已经准备好用一些Python代码将其带到生活中了。

第2步:为您的项目创建Python虚拟环境

在开始编码之前,您需要设置您的Python开发环境,在此步骤中,您将在虚拟环境中安装和激活Python的要求,以便更容易管理。

首先,在您的主目录中创建一个目录,您可以使用它来存储所有虚拟环境:

1mkdir ~/.venvs

现在使用Python创建您的虚拟环境:

1python3 -m venv ~/.venvs/discord

这将创建一个名为discord的目录在您的.venvs目录中。内部,它将安装一个本地版本的Python和一个本地版本的pip

在安装项目的 Python 要求之前,请激活虚拟环境:

1source ~/.venvs/discord/bin/activate

您的提示应该改变,以表示您现在在Python虚拟环境中运行,它将看起来像这样: (discord)user@host:~$

随着虚拟环境的活跃,安装discord.py与本地实例pip:

1pip install discord.py

注意:一旦你激活了虚拟环境(当你的提示有),使用pip而不是pip3,即使你正在使用Python 3. 虚拟环境的副本的工具总是被命名为pip,无论Python版本。

现在你已经安装了 Discord 包,你需要保存这个要求及其依赖性,这是一个很好的做法,所以你可以根据需要重建你的开发人员环境。

使用pip将环境信息保存到requirements.txt文件中:

1pip freeze > requirements.txt

您现在拥有构建一个分歧机器人所需的库。

步骤3 - 构建一个最小的分歧机器人

您现在将开始编码您的 Discord 机器人. 一旦完成,您的机器人将倾听在文本聊天中共享的某些短语,然后将相应地响应它们。

在此步骤中,您将构建您的机器人的最小版本,然后在 步骤 4 和** 步骤 5** 中添加更多的功能。

首先,在您喜爱的文本编辑器中打开名为bot.py 的文件:

1nano bot.py

现在将以下导入添加到文件中: osrandomdiscord. os 库将允许您从环境变量中读取有价值的信息,如 API TokensGuild Namerandom 库将允许您为您的随机事件生成输出。

1[label bot.py]
2import os
3import random
4import discord

接下来,您将需要从环境变量中获取 Discord API 代码和您的机器人团体。您将使用在 Python 标准库中的os库中的getenv方法。

1[label bot.py]
2...
3
4token = os.getenv("DISCORD_TOKEN")
5my_guild = os.getenv("DISCORD_GUILD")

在)。

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

1[label bot.py]
2...
3
4intents = discord.Intents.default()
5client = discord.Client(intents=intents)

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

第一部分的代码将在已准备事件中激活,当您的机器人加载到Guild时,该事件会触发。 请注意,Discord API不保证此事件只发生一次。

您将写出一个打印声明,在您的机器人成功连接到您的Guild时打印,Discord机器人需要使用async方法,以便机器人处于准备状态并等待呼叫。

bot.py的末尾附上以下代码:

 1[label bot.py]
 2...
 3
 4@client.event
 5async def on_ready():
 6    for guild in client.guilds:
 7        if guild.name == my_guild:
 8            break
 9
10    print(
11        f"{client.user} is connected to the following guild:\n"
12        f"{guild.name}(id: {guild.id})"
13    )

您使用循环在所有可用的团体中找到您的团体,然后您打印有关团体及其连接的信息。

最后,您需要告诉客户端在使用您的 API 代码执行脚本时运行。

1[label bot.py]
2...
3
4client.run(token)

此时,你的代码应该是这样的:

 1[label bot.py]
 2import os
 3import random
 4import discord
 5
 6token = os.getenv("DISCORD_TOKEN")
 7my_guild = os.getenv("DISCORD_GUILD")
 8
 9intents = discord.Intents.default()
10client = discord.Client(intents=intents)
11
12@client.event
13async def on_ready():
14    for guild in client.guilds:
15        if guild.name == my_guild:
16            break
17
18    print(
19        f"{client.user} is connected to the following guild:\n"
20        f"{guild.name}(id: {guild.id})"
21    )
22
23client.run(token)

你刚刚写了骨骼代码,这将允许你的机器人连接到一个团伙,现在你将测试你的机器人的基本功能。

第4步:本地测试你的机器人

在您再编码之前,请检查您的机器人是否可以连接到 Discord。 返回 discord 开发者面板并点击左侧的导航栏中的 Bot 链接。 从这里,在机器人用户名下找到** Token** ,然后点击** Copy** 按钮将代码复制到您的剪辑板。

Get Bot Token

一旦你复制了代币,回到终端,你的虚拟环境被激活. 导出 Discord 代币,使其在环境变量中可用,让你的机器人在启动时阅读:

1export DISCORD_TOKEN=YOUR_DISCORD_TOKEN

现在你需要得到你的机器人将加入的团体名称。 导航到你的分歧团体。 团体名称应该在你的团体页面的左上角。 这是你在前提部分中创建团体时所选择的名字。

Get Guild Name

现在,导出 Discord Guild,使其在环境变量中可用,以便您的机器人在启动时阅读:

1export DISCORD_GUILD=YOUR_DISCORD_GUILD

现在你已经导出必要的环境变量,你已经准备好测试你的机器人:

运行应用程序:

1python3 bot.py

它可能需要几秒钟,但你会收到这样的输出. 请注意,你的机器人号码和id将不同:

1[secondary_label Output]
2SammySharkBot#8143 is connected to the following Guild:
3SammyShark(id: 801529616116350998)

返回你的 Discord Guild,你会注意到你的机器人现在有一个绿色圆圈靠近它的名字。

Verify your bot is online

您可能在您的终端中注意到您的代码不会终止. 这是因为机器人是一个持续运行的过程. 要在任何时候停止您的机器人,请按一下 CTRL + C 键组合。

步骤5 - 扩展 Discord 机器人执行随机任务

现在,你的机器人正在工作, 是时候扩展它的功能。 您的机器人要响应文本聊天中发送的信息, 您需要聆听[ ‘ 在_ message' 事件] ([ LINK0] ) 。 这个函数包含一个参数,`message',它包含消息对象,包括各种属性和方法,用于响应消息.

你需要确保的一件事是,你的机器人不会自己回答。如果机器人将自己的消息解释为触发器,那么它将创建一个无限循环。

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

1[label bot.py]
2...
3@client.event
4async def on_message(message):
5    if message.author == client.user:
6        return

最后,加入代码来翻出硬币. 您也会对信件内容进行字符串操作到下大小写( 或上大写, 如果您喜欢的话) , 这样您就不必担心在字符串中匹配精确的大小写 。 使用 Python random' 库中的randint ()' 函数来模拟硬币翻转。 最后,一旦你设计了一条消息,你就会使用发送消息的方法将其发送到频道. 记住,这是同步编程,所以在发送消息时必须使用"等待"关键词.

on_message函数中附加以下代码到bot.py,这将添加硬币转换功能:

1[label bot.py]
2    message_content = message.content.lower()
3    if "flip a coin" in message_content:
4        rand_int = random.randint(0, 1)
5        if rand_int == 0:
6            results = "Heads"
7        else:
8            results = "Tails"
9        await message.channel.send(results)

请确保您的代码看起来像这样,或者复制并粘贴此代码:

 1[label bot.py]
 2import os
 3import random
 4import discord
 5
 6token = os.getenv("DISCORD_TOKEN")
 7my_guild = os.getenv("DISCORD_GUILD")
 8
 9intents = discord.Intents.default()
10client = discord.Client(intents=intents)
11
12@client.event
13async def on_ready():
14    for guild in client.guilds:
15        if guild.name == my_guild:
16            break
17
18    print(
19        f"{client.user} is connected to the following guild:\n"
20        f"{guild.name}(id: {guild.id})"
21    )
22
23@client.event
24async def on_message(message):
25    if message.author == client.user:
26        return
27
28    message_content = message.content.lower()
29    if "flip a coin" in message_content:
30        rand_int = random.randint(0, 1)
31        if rand_int == 0:
32            results = "Heads"
33        else:
34            results = "Tails"
35        await message.channel.send(results)
36
37client.run(token)

现在机器人已经完成了,是时候测试它. 保存和关闭文件。

重新启动 app:

1python3 bot.py

应用程序连接到您的 Guild 后,在您的 Discord Guild 中导航到 # general 频道. 在文本聊天中输入转换一枚硬币,机器人将用** Heads** 或** Tails** 回复。

Your bot should respond with Heads or Tails

现在你已经确认你的机器人是功能性的,你已经准备好在Ubuntu 20.04服务器上部署它。

第6步:部署到Ubuntu 20.04

你可以让你的机器从你的本地机器运行,但必须留一个终端活跃或担心停电可能会令人烦恼。

最好的做法是运行你的机器人作为一个非根用户. 本教程使用用户名 sammy

首先,使用scp命令将您的代码和Python库要求复制到服务器,将所有内容发送到用户的 root 目录:

1scp bot.py requirements.txt sammy@your_server_ip:~

接下来,将 ssh 输入到您的服务器:

1ssh sammy@my_server_ip

您现在将输入命令到服务器的终端。

您需要安装适当的Python系统包才能在您的服务器上运行您的机器人。

安装python3,python3-venv屏幕:

1[environment second]
2sudo apt update && sudo apt install python3 python3-venv screen

现在,你将使用一个名为屏幕的工具来创建一个虚拟终端。 没有这个工具,如果你要在机器人运行时退出你的终端,这个过程将结束,你的机器人将离线。 使用这个工具,你可以连接和断开连接到会话,以便你的代码继续运行。 有关屏幕的更多信息,请参阅我们的 安装和使用屏幕的教程

要开始屏幕会话,请使用以下命令:

1[environment second]
2screen

屏幕将提示您签订许可协议. 按 返回 以继续。

现在你已经设置了一个虚拟会话,你需要创建一个Python虚拟环境来运行你的代码。

首先,就像以前一样,创建一个目录来存储您的虚拟环境:

1[environment second]
2mkdir ~/.venvs

创建一个新的虚拟环境:

1[environment second]
2python3 -m venv ~/.venvs/discord

激活虚拟环境:

1[environment second]
2source ~/.venvs/discord/bin/activate

接下来,使用Pip安装所需的库:

1[environment second]
2pip install -r requirements.txt

在您可以运行机器人之前,您需要导出DISCORD_TOKENDISCORD_GUILD,以便您的机器人可以访问 API 密钥和 Guild 信息:

1[environment second]
2export DISCORD_TOKEN=YOUR_DISCORD_TOKEN
3export DISCORD_GUILD=YOUR_DISCORD_GUILD

最后,运行你的机器人:

1[environment second]
2python3 bot.py

您的机器人将启动并开始接收消息. 您可以使用键组合 CTRL + A + D 脱离屏幕会话. 当您准备重新连接到会话时,您可以使用以下屏幕命令:

1[environment second]
2screen -r

你使用Python成功构建了一个Discord机器人,该应用程序在服务器上运行,并响应在Guild中共享的某些短语。

结论

在本教程中,你设置了一个Discord Guild,建立了一个Discord机器人,在你的Guild中安装了机器人,并将机器人部署到Ubuntu 20.04服务器上。你刚刚开始探索Discord API。机器人是强大的和可扩展的。 要探索其他功能,请查看 discord.py API docs

或者,如果你想了解更多关于Python编程的信息,请访问我们的教程系列, 如何在Python中编码 3

Published At
Categories with 技术
comments powered by Disqus