给你的 Discord 服务器开发一个专属机器人

前言

本文将介绍作为我最喜爱的软件之一的 Discord(在我心理几乎就排在 Telegram 之下)的一些开放性玩法~如果你还不知道什么是 Discord 那你应该知道国内一个叫 YY 的软件,不……不要误会,YY 那种垃圾是不可能跟 Discord 相提并论的。

简单来说 Discord 是一个专门为游戏开黑组队而诞生的语音工具,它能让用户自己建立服务器(甚至能自定义位置节点),然后在服务器中自由创建定制性很高的(例如人数限制、语音质量调整)语音或文字频道(可以理解为房间)。除了很高的定制性和作为通信软件必备的属性之外,它的功能几乎就仅此而已,那些乱七八糟的网红主播、垃圾推广、一塌糊涂的语音质量和服务器/客户端技术(你猜猜我说的是不是 YY?)都不存在。

另外 Discord 也是我见过的兼容平台最广的大众客户端软件之一,其包括:Linux/Mac/Windows/IOS/Android/UWP 以及有完整功能的网页版。

Bot

在 Discord 平台的众多服务器上都可能存在一个或多个标记为 ‘bot’ 的用户,这些用户可以根据服务器成员发送的不同指令执行相应的操作。例如推荐音乐、生成 GIF、查询游戏战绩数据等等(在 discordbots.org 上一些很完善并且有超多功能的大型 bot,非常壮观)。

这些“用户”背后实际上都是一个个后端程序,用户的指令就是输入,输出则是机器人在频道上的输入。例如说:

.profile shroud

当用户在某个有 PUBGOnline.com 机器人的服务器输入上面的指令的时候,就相当于调用了机器人程序的 profile 功能单元以及传递了 shroud 这个参数值。接着机器人就会回应你该功能的输出结果:

:pencil: shroud's Profile
NA - Solo-fpp
Rating: 1,627
Rounds Played: 62
Rounds Won: 5 (8.1%)
Kills: 346
NA - Squad-fpp
Rating: 1,805
Rounds Played: 55
Rounds Won: 8 (14.6%)
Kills: 259
NA - Duo-fpp
Rating: 1,728
Rounds Played: 135
Rounds Won: 14 (10.4%)
Kills: 596
NA - Squad
Rating: 1,247
Rounds Played: 1
Rounds Won: 0 (0.0%)
Kills: 11

Last updated just now.

由于 Discord 强大的消息类型支持,提供了结果输出很大的空间,包括:普通文本、图片、视频、Markdown 和 Embeds。而上面是个 Embeds 消息,我的博客体现不出来:)

那么,这些机器人用户是怎么来的呢?他们是开发者用小号做出来的吗?

App

要了解机器人的诞生,需要了解 Discord 官方是怎么设计用户类型的,因为机器人并不是小号。每一个被标记为 bot 的用户的账户类型跟普通用户不同,它们是由 Discord 官方提供的开发者功能创造出来的。

对于 Discord 而言,每一个机器人用户都是一个“应用”,一个 Discord 账号可以创建很多个应用(所以机器人账号实际上并不是真实用户,也不需要让机器人开发者注册任何小号)。

在这里有更多的详细说明:https://discordapp.com/developers

创建应用

如果你访问了上面官方的开发者页面,你大概能明白了,Discord 提供了让用户创建应用的方式构建机器人程序的方式,以及大量的相关 API。我认为这是很明智的,这避免了用户自行破解 Discord 通信协议而创建出类似程序的行为,因为这样做对于双方而言都没有好处。这么开放的闭源商业软件,还真是少见呢:)

按照官方的流程,我们先需要创建一个应用:

  1. 访问【这里】并点击 【New App】
  2. 填写 App 名称然后点击 【Create App】 按钮
  3. 点击 【Create Bot User】按钮 然后将 Public Bot 勾上
  4. 复制 Cline ID(一般是数字),然后替换掉下面的链接的 YOUR_CLIENT_ID_HERE 字符串

    https://discordapp.com/oauth2/authorize?&client_id=YOUR_CLIENT_ID_HERE&scope=bot&permissions=0
    

    接着就是访问这个链接,目的是授权机器人加入你自己的服务器。如果你没有服务器那么就创建一个,不然无法实施后面的内容。

如果你需要更详细的创建应用说明可以看【这里】。

这样机器人应用就创建好了,并且已经加入你的服务器。但是你会发现机器人是离线状态,怎么让它上线呢?

不,如果你想到这一步你就已经产生误解了。Discord 开发功能中的 App 指并不是的官方提供一个应用运行环境或者直接给你一个能直接运行的“应用”。此应用概念是面向 Discord 平台自身的,对于 Discord 而言,一个机器人被开发出来,就相当于扩展了 Discord 平台的某个功能,只是 Discord 将这个功能扩展的权利交给开发者自由发挥。

假设你创建了一个应用,并且基于这个应用开发了一个天气预报机器人,每天自动往加入的服务器发天气预报。那么,对于 Discord 而言,这个机器人用户本身就是一个“应用”。但是如果你只是创建了一个应用,产生了一个机器人用户,但是并没有做相关开发工作,那么这个机器人永远只是一个类型为 bot 的用户而已,并不是一个“应用”。

开发机器人

如果你觉得官方 API 使用麻烦,我也觉得…… 大家都觉得…… 写机器人的核心生产力怎么能消耗在自行对 Discord API 的包装上呢?所以必然存在对相应的 Wrapper 库。

这里我们使用 Python3 语言,在 requirements.txt 中加入:

discord==0.0.2

然后写一个最基本的例子:

import discord

client = discord.Client()


@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')


@client.event
async def on_message(message):
    if message.author == client.user:
        return
    # 输出接收到的消息的基本信息
    print("[%s]Send message: “%s” from chanel: %s" % (message.author, message.content, message.channel))


client.run('YOUR-BOT-TOKEN')

注意:登录机器人需要 Token,在 My Apps 中相应的 App 页面的【APP BOT USER】区域可以看到(需要点击 click to reveal 显示出来)。将 Token 替换掉上面代码中的 YOUR-BOT-TOKEN 即可。

接着,你在 Discord 服务器的任意一个频道发送消息,例如我在 test_bot 频道发了一句 “Hello World”,程序控制台输出:

[Hentioe_Cl#0120]Send message: “Hello World” from chanel: bot_test

这个程序将接收到的所有消息以一定格式化后输出出来,就是这么简单。如果我们要回应用户呢?我们改动代码,在 on_message 函数中加上三行代码:

@client.event
async def on_message(message):
    // ……

    # 针对 .hello 指令进行回应
    if str(message.content).lower().startswith('.hello'):
        message_content = "<@{}> 你好,很高兴认识你!".format(message.author.id)
        await client.send_message(message.channel, message_content)

从这个例子可以看出来,仅靠对新消息的回调事件函数和 message 对象,我们就已经拿到机器人程序的核心实现条件了。

当然,要实现对复杂输入进行解析的机器人程序,并不是上面那般容易,这只是个由浅入深的最基本例子。

我的 Discord 机器人

我最近也开发了一个 Discord 机器人,可以实现对 PUBG 战绩的查询。背后的原理其实就是接收到新消息(输入)解析出游戏 ID 参数,然后去战绩平台抓取数据并整理出来再作为消息输入到 Discord 的相应频道中(输出)。

然后还有很多基本功能,例如对新人的欢迎提示、对转频道交流的回复提醒等。我还打算开发出房间(频道)申请功能和删除功能,实现对频道列表的智能化管理。还有例如吃鸡图生成等这些小玩意功能:)

你可以进我的 Discord 服务器来体验这个功能,假设你是 PUBG 或者 Steam 平台的用户的话那更要加入了!地址在【这里】。

结束语

仍然还是那个问题…… 我国互联网的过于封闭阻挡了国外绝大多数流行的东西,其中有些是非常优秀的存在,例如本文的 Discord。可惜对于绝大多数人而言还停留在使用垃圾软件 YY 的地步。

如果你使用 Discord 那我们肯定是志同道合的人了~ 欢迎你加入我:)