Python中的不和谐机器人
#python #discord #backend

曾经想到过机器人来提高团队在在线沟通中的生产力吗?如果没有,那么本文仅适合您(以及您的Python开发人员团队)!我们将向您展示如何创建一个与API通信并根据需要提供信息的Discord Bot。

在过去的几年中,我们的工作和学习方式发生了变化。我们可以在就业市场上看到这一运动 - 许多与之相关的优惠都标记为100%遥控器,使人们可以与来自世界各地的同行一起工作。这就是为什么诸如Slack,Microsoft团队或DISCORD之类的应用程序的流行程度增加的原因,并且每天被许多人使用。今天,我们将专注于不和谐 - 一种从游戏工具到专业人员,教育工作者和社区使用的平台的交流手段。

同事越多地使用您的工具,您必须将所有内容保持一致。您可以雇用越来越多的主持人... ,或者您可以使用开发人员团队必须创建的技术知识来创建可以为您完成肮脏工作的机器人。在这篇博客文章中,我将仔细阅读必要的知识,创建和运行一个将与外部API通信以提供需求信息的Discord机器人。

阅读本教程后,您将学习一些在Discord中更有效的在线通信有用的策略:

  • 如何创建不和谐机器人,
  • 如何访问有关服务器的信息,
  • 如何使用命令联系外部服务
  • 如何创建嵌入。

要求

我鼓励您完成以下步骤:

了解连接

Discord connection

在开始编码之前,让我们花一点时间了解您的团队服务器,Discord,Bot和您想要使用的任何其他服务之间的通信。

一切都始于您的团队服务器 - 这就是人们彼此互动的方式和人工实体(例如bots )。每种交互都可以触发机器人进行操作 - 可以通过特殊命令或服务器发送的事件来完成。示例事件可以包括:

  • 用户发送消息,
  • 加入服务器的新成员,
  • 创建一个新频道

还有很多...更多!如果将机器人连接到您的团队服务器,它将尝试处理感兴趣的事件。

每个机器人都需要具有运行的Discord客户端实例。这是机器人与Discord服务器和API接触团队服务器请求的方式。

值得一提的是,一个机器人可以连接到多个服务器。您可以选择,如果您需要在“ Discord Bots”设置中(以后有关此功能)。

bot处理团队服务器发送的信息后,它可以联系多个外部服务:

  • 您的应用程序REST API,
  • 机器学习算法,
  • 您的公司ERP系统,

以及其他想起的东西!

最后,该信息可以由机器人发送到Discord API,以便在事件进度中通知用户。

入门

我们将首先创建一个Discord应用程序。需要此步骤以使Discord能够通过您将在此过程中获得的令牌来验证与服务器的机器人。作为奖励,您将有机会自定义机器人的外观。

转到您的Discord Developer dashboard,然后单击新应用程序

New application

恭喜!您创建了第一个Discord应用程序ð¥³。您将受到屏幕的欢迎,该屏幕将允许您进行一些自定义。您可以使用这些设置来玩耍,但是本教程并不需要。

在菜单部分中,您应该看到一个名为 bot 的按钮,请导航到该部分,一旦到达该部分,请按添加bot 并同意提示。

打开以下特权网关意见,然后单击保存

  • 存在意图,
  • 服务器成员意图,
  • 消息内容意图。

现在您创建了机器人,请转到 oauth2 部分,然后选择 url生成器

  • 设置机器人范围,
  • 设置管理员权限。
  • 复制生成的URL。

Permissions

在浏览器中遵循复制的URL,然后将机器人添加到服务器中。我们现在准备构建自己的软件!

然后有代码

在本节中,我们将仔细研究安装依赖项,配置项目并编写实际代码的步骤。请启动您选择的IDE并创建一个新项目。

安装依赖项

我们将需要以下包来创建我们的Discord bot:

  • discord.py-与Discord通信所需的主要包装,
  • requests-这将使我们可以联系示例API,
  • dotenv-从文件加载环境变量。

首先,创建一个在本教程中使用的新虚拟环境(如果您不知道什么是虚拟环境,请务必查看Python documentation for creating virtual environments11):

python3 -m venv .venv
source .venv/bin/activate

现在我们准备安装依赖项:

pip install discord.py
pip install requests
pip install python-dotenv

项目设置

我们将首先在我们的项目目录中创建一个.env文件(请注意一开始的“点”)。我们将利用您从Discord Developers网站和您在本教程要求中创建的服务器的name复制的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文件,则应在服务器上在线查看机器人。

Bot online

收集基本信息

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文件时,您应该获得这样的输出:

Hello World

为用户收集信息

关于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}")

请注意,与"Divinebanana"响应的机器人不是显示"Łukasz"。虽然令人困惑,但原因是Åukasz是该服务器特有的nickname。如果要获得服务器用户昵称,则应使用member.nick而不是member.name

连接到外部服务

Discord机器人最伟大的事情是您仅限于编程语言功能。我将向您展示如何通过bot命令与REST API联系,然后在嵌入式中显示信息,使其变得漂亮。

首先,让我们在on_message函数中向我们的匹配添加一个新命令:

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的另一个很酷的功能-Embeds。您可以在下面看到我们操作的结果。

Embed

嵌入允许您创建富含媒体和数据以结构化方式凝结的数据的丰富对象。请随时阅读有关official Discord documentation中嵌入的更多信息。

概括

随着在线通信工具(例如机器人)的使用增加,无论是工作,教育还是与业余爱好有关,都可以提高您对小型和大型社区的生产率。如您所见,构建此类应用程序并不难,可以为您和您的用户为服务器供电。

如果您想了解更多信息,请确保检查以下链接:

感谢您的阅读!