[迁移] 给你的 Discord 服务器开发一个专属机器人

前言


这是一篇从旧博客迁移的文章,始发于 2018-03-19。主要介绍了 Discord 平台和其最有趣的开放特性 — 机器人应用。

以下是原始前言内容:

本文将介绍我本人最喜爱的软件 Discord 的一些开放性玩法,如果你还不知道什么是 Discord 那你应该知道国内一个叫 YY 的软件。不过不要误会,YY 基本没法跟 Discord 相提并论,除了都用来当作游戏语音沟通以外也截然不同。
同时 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 通信协议而创建出类似程序的行为,毕竟这样做对于双方而言都没有好处。这么开放的闭源商业 IM 软件,还真是少见呢:)

按流程,我们先创建一个应用:

  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 discord!",程序控制台输出:

[Hentioe#0120]Send message: “Hello discord!” 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 平台的用户的话那更要加入了!地址在 https://discord.bluerain.io

结束语


以下内容全部是迁移后添加:

关于 Discord 服务器我已经搁置比较久了,主要是因为它后来被墙了。虽然我能上来,但是曾经来服务器的很多用户已经上不来了。他们不像 Telegram 用户那样普遍有翻墙的需求,游戏用户并没有这个需求。

我的 Discord 机器人也从那时候停止开发了,但它当时对我的服务器产生了巨大的作用。现在 Discord 和 Telegram 类似出现大量的程序运营的 userbot(用户机器人,意思就是用户类型但由程序控制)。创建 userbot 无非就是自动化发布垃圾内容,虽然 Discord 官方打击力度还是比较严格的,但是已经对很多服务器(包括我的)进行了严重的骚扰。

所以,Discord 也很欠缺一个 PolicrBot!也许,我得考虑一番了,哈哈。

这篇文章曾经的点击率很高,我特意迁移上来希望能帮助到更多对 Discord 机器人感兴趣的人。