是否曾经想过机器人可以提高团队在在线沟通中的生产力?如果没有,那么本文仅适合您(以及您的Python开发人员团队)!我们将向您展示如何创建一个与API通信并根据需要提供信息的DISORD机器人。
在过去的几年中,我们经历了人们的工作和学习方式发生了变化。我们可以在就业市场上看到这一运动 - 许多与之相关的报价都标记为100%遥控器,使人们可以与来自世界各地的同行一起工作。这就是为什么诸如Slack,Microsoft团队或Discord之类的应用程序的流行程度增加的原因,并且每天被许多人使用。今天,我们将专注于不和谐 - 一种从游戏工具到专业人员,教育工作者和社区使用的平台的交流手段。
同事使用您的工具越多,您必须将所有内容保持一致。您可以雇用越来越多的主持人... ,也可以使用开发人员团队必须创建的机器人的技术知识,这些机器人将为您完成肮脏的工作。在这篇博客文章中,我将经过必要的知识来创建和运行一个将与外部API通信以提供需求信息的不和谐机器人。
阅读本教程后,您将学到一些对于在Discord中进行更有效的在线通信有用的策略:
- 如何创建Discord Bot,
- 如何访问有关服务器的信息,
- 如何使用命令与外部服务联系,
- 如何创建嵌入。
要求
为了充分利用本教程,我鼓励您完成以下步骤:
- Python 3.10(如果要跳过
match-case
,则可以使用较低版本), - Create a Discord account,
- Create a test server,
- 准备进行编码冒险!
了解连接
在开始编码之前,让我们花点时间了解团队服务器,Discord,Bot和您想要使用的任何其他服务之间的通信如何工作。
一切都始于您的团队服务器 - 这就是人们相互交互的方式和像机器人这样的人造实体。每个交互都可以触发机器人来做某件事 - 可以通过特殊命令或服务器发送的事件来完成。示例事件可以包括:
- 发送用户的消息,
- 加入服务器的新成员,
- 创建一个新频道
- 还有很多...更多!
如果将机器人连接到您的团队服务器,它将尝试处理感兴趣的事件。
每个机器人都需要具有运行的Discord客户端实例。这就是机器人与Discord服务器和API接触团队服务器请求的方式。
值得一提的是,一个机器人可以连接到多个服务器。您可以选择,如果您需要在“ Discord Bots”设置中(稍后有关)。
。一旦机器人处理团队服务器发送的信息,它可以联系多个外部服务:
- 您的应用程序REST API,
- 机器学习算法,
- 您的公司ERP系统,
- 还有其他想到的东西!
最后,该信息可以由机器人发送到Discord API,以便在事件进度中通知用户。
入门
我们将首先创建一个Discord应用程序。需要此步骤以使Discord能够通过您将在此过程中获取的令牌来验证与服务器的机器人。作为奖励,您将有机会自定义机器人的外观。
转到您的Discord Developer dashboard,然后单击新应用程序。
恭喜!您创建了第一个Discord应用程序ð¥³。您将受到屏幕的欢迎,该屏幕将允许您进行一些自定义。您可以使用这些设置进行播放,但是本教程不需要。
在菜单部分中,您应该看到一个名为 bot 的按钮,请导航到该部分,一旦到达该部分,请按添加bot 并同意提示。 p>
打开以下特权网关意图,然后单击保存*:
- 存在意图,
- 服务器成员意图,
- 消息内容意图。
现在您创建了机器人,请转到 oauth2 部分,然后选择 URL Generator :
- 设置机器人范围,
- 设置管理员权限。
- 复制生成的URL。
在浏览器中遵循复制的URL,然后将机器人添加到服务器中。我们准备立即构建自己的软件!
然后是代码¦
在本节中,我们将仔细研究安装依赖项,配置项目并编写实际代码的步骤。请启动您选择的IDE并创建一个新项目。
安装依赖项
我们将需要以下包来创建我们的Discord bot:
-
discord.py
-与Discord通信所需的主要软件包, -
requests
-这将使我们能够联系示例API, -
dotenv
-从文件加载环境变量。
首先,创建一个在本教程中使用的新虚拟环境(如果您不知道什么是虚拟环境,请务必查看Python documentation for creating virtual environments):
python3 -m venv .venv
source .venv/bin/activate
现在我们准备安装依赖项:
pip install discord.py
pip install requests
pip install python-dotenv
项目设置
我们将首先在我们的项目目录中创建一个.env
文件(请注意开始的“点”)。我们将利用您从Discord Developer网站复制的token
以及您在本教程要求中创建的服务器的名称。
DISCORD_TOKEN = your_token_goes_here
DISCORD_GUILD = your_server_name
看起来不错!我们已经准备好下一步。
连接Discord客户端
在项目目录中创建一个main.py
文件,并添加我们将在本教程中使用的必要导入:
import os
from typing import Any
import discord
import requests
from dotenv import load_dotenv
现在,我们将读取在配置文件中添加的环境变量:
load_dotenv()
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")
DISCORD_GUILD = os.getenv("DISCORD_GUILD")
下一步是创建Discord客户端。我们现在将变得相当简单:
class Client(discord.Client):
def __init__(self, token: str, guild_name: str) -> None:
super().__init__()
self._token = token
self._guild_name = guild_name
def run(self, *args: Any, **kwargs: Any) -> None:
super().run(self._token)
client = Client(DISCORD_TOKEN, DISCORD_GUILD)
client.run()
我们刚刚添加的代码给了我们三个结果:
- 我们创建了一个从
discord.Client
继承的Client
类, - 我们将设置存储在类参数中,
- 我们使用
run
函数启动客户端。
如果您运行了main.py
文件,则应在服务器上在线查看机器人。
收集基本信息
discord.py
软件包为我们提供了很多可能的可能性。我们将在机器人在线时创建一个动作开始。让我们在Client
类中创建一个新功能:
async def on_ready(self) -> None:
self._guild = discord.utils.get(self.guilds, name=self._guild_name)
await self._guild.text_channels[0].send("Hello World!")
我们使用Discord utils通过名称获取公会,并将消息发送到主文本通道。下次启动Python文件时,您应该获得这样的输出:
为用户收集信息
关于Discord机器人的最大交易之一是能够使用自定义命令。
命令是用户可以发送以执行各种机器人任务的特殊消息。我们将首先创建一个命令,该命令列出当前在线的用户。
如果您想收集有关用户的信息,我们需要对__init__
功能进行一些更新。确保将以下意图添加到Client
构造函数:
intents = discord.Intents.default()
intents.members = True
super().__init__(intents=intents)
我们将覆盖默认的on_message
,以使其更容易。如果您想先进,可以阅读有关bot commands framework的信息。
async def on_message(self, message: discord.Message) -> None:
match message.content:
case "!members":
members = [member.name for member in self._guild.members]
await message.channel.send(f"Members: {members}")
请注意,不要显示“Åukasz”机器人以“ Divinebanana”的响应。虽然令人困惑,但原因是Åukasz是该服务器特有的昵称。如果要获得服务器用户昵称,则应使用member.nick
而不是member.name
。
连接到外部服务
Discord机器人最伟大的事情是您仅限于编程语言功能。我将向您展示如何通过bot命令与REST API联系,然后在嵌入式中显示信息,使其变得漂亮。
首先,让我们在on_message
函数中向我们的match
添加一个新命令:
match message.content:
case "!members":
....
case "!highground":
await self.high_ground()
现在,我们只需要在我们的Client
中创建high_ground
函数7:
async def high_ground(self) -> None:
try:
response = requests.get("https://swapi.dev/api/people/10/")
response.raise_for_status()
data = response.json()
except requests.HTTPError:
return
embed = discord.Embed(
title=data.get("name"),
description=data.get("url"),
)
embed.add_field(name="Height", value=data.get("height"))
embed.add_field(name="Mass", value=data.get("mass"))
embed.add_field(name="Hair Color", value=data.get("hair_color"))
embed.add_field(name="Birth Year", value=data.get("birth_year"))
embed.add_field(name="Eye Color", value=data.get("eye_color"))
embed.add_field(name="Gender", value=data.get("gender"))
await self._guild.text_channels[0].send(embed=embed)
我们联系了Star Wars API,以收集有关绝地大师和克隆人战争期间最伟大的绝地将军之一Obi-Wan Kenobi的信息。我们还使用了Discord -Embed的另一个很酷的功能。您可以在下面看到我们操作的结果。
嵌入允许您创建可以包含媒体和数据结构化方式的数据的丰富对象。随时可以在官方Discord documentation中阅读有关嵌入的更多信息。
概括
随着在线通信工具的使用增加,例如机器人可以提高您对小型和大型社区的生产率,无论是工作,教育还是与业余爱好有关。如您所见,构建此类应用程序并不难,可以为您和您的用户供电。
如果您想了解更多信息,请确保检查以下链接:
- Discord documentation-与Discord Developer API相关的所有事物,
- discord.py code repository-包含包装的代码存储库,
- discord.py documentation-包装的文档。
感谢您的阅读!