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

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

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

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

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

  • 如何创建Discord Bot,
  • 如何访问有关服务器的信息,
  • 如何使用命令与外部服务联系,
  • 如何创建嵌入。

要求

为了充分利用本教程,我鼓励您完成以下步骤:

  1. Python 3.10(如果要跳过match-case,则可以使用较低版本),
  2. Create a Discord account,
  3. Create a test server,
  4. 准备进行编码冒险!

了解连接

Communication between the team server, Discord, your bot, and other services

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

一切都始于您的团队服务器 - 这就是人们相互交互的方式和像机器人这样的人造实体。每个交互都可以触发机器人来做某件事 - 可以通过特殊命令或服务器发送的事件来完成。示例事件可以包括:

  • 发送用户的消息,
  • 加入服务器的新成员,
  • 创建一个新频道
  • 还有很多...更多!

如果将机器人连接到您的团队服务器,它将尝试处理感兴趣的事件。

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

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

一旦机器人处理团队服务器发送的信息,它可以联系多个外部服务:

  • 您的应用程序REST API,
  • 机器学习算法,
  • 您的公司ERP系统,
  • 还有其他想到的东西!

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

入门

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

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

Creating a new Discord application

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

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

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

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

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

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

Setting the bot scope and Administrator permissions in Discord

在浏览器中遵循复制的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文件,则应在服务器上在线查看机器人。

Bot on the server upon running the main.py file

收集基本信息

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

请注意,不要显示“Å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的另一个很酷的功能。您可以在下面看到我们操作的结果。

Using a command with a Discord embed result

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

概括

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

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

感谢您的阅读!