使用Node.JS搭建一个Discord机器人

最近都在用 Discord ,感觉 Discord 在各方面都要完爆国内的垃圾YY,说到 Discord,我就想到 Discord BOT,然后想到了跟他一样牛逼的孙悟空。说道孙悟空…开机…文体两开花…多多支持( ͡° ͜ʖ ͡°)

言归正传,Discord 的开放度确实很高,允许用户定制各种各样的BOT,Google 了一些教程,弄了个 Discord BOT,把一些步骤和踩到的坑记录一下。

注意:由于众所周知的原因,Discord 在国内是没法正常访问的,如果你的 BOT 打算在国内的服务器上跑的话,需要设置 Hosts,详情可 Google
前排提示:这篇文章使用 discord.io 构建 BOT ,这个框架官方很久没更新了,我用的是民间的修改版本,我建议你去用另一个框架 discord.js,这个框架还在持续更新中,不过你得另外找教程了。

Discord BOT 可以用 Python 或者 Javascript 来写,我这里是用的 Javascript。这里假设你已经拥有 Discord 账号,没有的可以进入官网 https://discordapp.com/ 注册。

一、创建 Discord APP

首先第一步要创建一个 Discord APP ,点击https://discordapp.com/developers/applications/ , 然后点击 Create an application (创建应用)


ICON: 应用头像, 可上传可不上传, 别人邀请 BOT 进入频道时可以看见, 注意这个不是 BOT 的头像
NAME: 应用名称,也是 BOT 的默认名字,但是 BOT 名字后期可更改
CLIENT ID: BOT 的客户端 IP,后面邀请机器人进频道时会用得上
CLIENT SECRET: 应用秘钥,不可外泄。如果泄露,可以点Regenerate生成一个新的,旧的会作废。
DESCRIPTION: 应用介绍,随便写

二、创建一个 BOT

Discord APP信息填写完成后,我们回到主界面,在左手侧菜单转到 BOT

然后我们点击 Add BOT,创建一个BOT

ICON: BOT 的头像,可以与 Discord APP 头像不同
USERNAME: BOT 的名字,可以与 Discord APP 名字不同
TOKEN: BOT 的秘钥,后面编写程序需要用到不要外泄,如果外泄,可以点 Regenerate 生成新的,旧的会作废。
PUBLIC BOT: 选中后所有人都能邀请该 BOT,否则只有你自己能邀请
REQUIRES OAUTH2 CODE GRANT: 进阶选项,这里一般不打开

填写完成后记得保存。
下拉表格还会看到 BOT PERMISSIONS 一项

这是一个生成 BOT 权限代码的工具,勾选你想让 BOT 在频道里拥有的权限,例如 Send Messages(发送信息),权限代码会显示在 PERMISSIONS INTEGER 中,记录下来,等下会用到。

三、将 BOT 邀请到服务器

现在一个 BOT 已经创建完成了,我们需要构建一个邀请链接,这样才能把 BOT 邀请到你的服务器。一个邀请链接的格式就像下面这样子:

https://discordapp.com/oauth2/authorize?&client_id=CLIENT_ID&scope=bot&permissions=PERMISSIONS_INTEGER

把上面刚才申请 Discord APP 得到的CLIENT_ID 和 生成的权限代码PERMISSIONS INTEGER 替换之,最后的邀请链接应该是这样子的:

https://discordapp.com/oauth2/authorize?&client_id=527293830618415115&scope=bot&permissions=6

然后我们在浏览器打开这个链接,就能把你的 BOT 拉进服务器了。

那么 BOT 账号就创建完成了,但是现在还是个空壳,下面就开始编写他的灵魂—— (突然高大上

三、编写 BOT 程序

网上其实有很多现成的 BOT 框架,我们只要拿来改改就能用了。这里用的是discord.io

首先下载安装 Node.JSGit 和一个文本编辑器 (我用的是NotePad++,其他也可以,总之不要用记事本)

Node.JS 官网: https://nodejs.org/
Git 官网: https://git-scm.com/
NotePad++ 官网: https://notepad-plus-plus.org/

安装教程可以通过Google找到,这里不细讲。

然后,在你的本地硬盘新建一个文件夹,作为BOT的程序目录,例如E:\DiscordBOT,然后在里面新建3个文件:auth.jsonpackage.jsonbot.js ,相关代码如下

auth.json
1
2
3
{
"token": "填入刚才创建BOT的时候获得的TOKEN"
}
package.json
1
2
3
4
5
6
7
8
{
"name": "CrazyKid-BOT", //程序名称,随便写
"version": "1.0.0", //版本,随便写
"description": "My own Discord bot", //描述,随便写
"main": "bot.js", //bot主程序
"author": "CrazyKid", //作者,随便写
"dependencies": {} //这行不要动
}
bot.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
var Discord = require('discord.io');
var logger = require('winston');
var auth = require('./auth.json');

// 日志设定
logger.remove(logger.transports.Console);

logger.add(new logger.transports.Console, {
colorize: true
});

logger.level = 'debug';

// 初始化 Discord Bot
var bot = new Discord.Client({
token: auth.token,
autorun: true
});

//当BOT登录成功后运行的内容
bot.on('ready', function (evt) {
logger.info('Connected');
logger.info('Logged in as: ');
logger.info(bot.username + ' - (' + bot.id + ')');
});

//当BOT接收到信息后的处理逻辑
bot.on('message', function (user, userID, channelID, message, evt) {
// BOT将检测接收到的信息是否以 '!' 开头
if (message.substring(0, 1) == '!') {
var args = message.substring(1).split(' ');
var cmd = args[0];
args = args.splice(1);
switch(cmd) {
// !ping
case 'ping':
          //发送 !pong
              bot.sendMessage({
to: channelID,
message: 'Pong!'
});
break;
// 照葫芦画瓢,添加其他的case..
}
}
});

代码准备完成,现在运行 NodeJS 命令行,安装依赖

1
2
3
4
5
> e:\ #切换盘符
> cd e:\DiscordBOT #切换到BOT程序目录
> npm install woor/discord.io#gateway_v6 –save #安装Discord机器人框架
#不要用上面图中的 npm install discord.io,这里踩到了坑,后面会说
> npm install winston –save #安装logger框架

安装完毕后运行 node bot.js, 出现如下图提示即代表登录成功。

然后试试在频道里发 !ping,看看BOT会不会做出回复

这样,一个BOT就搭建完成了~~可以根据自己的需要,进一步编写bot.js,实现更多的功能。


踩到的坑

弄这玩意当然也不是一帆风顺,虽然之前有了解JavaScript,但是 NodeJS 还算是第一次接触,不过上手还算是蛮快的,最重要的是勤于Google,学别人的写法。

这篇文章也可以算作网上 一些教程[1][2] 的汉化版,有些地方经过自己的整理和修改,比如,在 这篇教程[2] 中, bot.js 这个文件的代码其实是有问题的,第6-8行

1
2
3
logger.add(logger.transports.Console, {
colorize: true
});

这句话会报错,加个new问题就解决了:

1
2
3
logger.add(new logger.transports.Console, {
colorize: true
});

还是这篇文章,安装依赖这行代码

1
npm install discord.io winston --save

这行代码虽然没问题,但是安装完成后运行node bot.js后不会有任何响应,直到我在 Github 上找到 解决方案[3] 才发现是 discord.io 这玩意太旧了,不支持 Discord API 的新规范,使用别人改好的 discord.io 就可以解决该问题。

1
2
npm uninstall discord.io --save #卸载旧的discord.io
npm install woor/discord.io#gateway_v6 --save #安装新的discord.io

然后又遇到了报错:

1
Fatal error : git is not installed or not in the PATH

然后我就去安装 Git 了,安完回来再次运行还是报这个错误,检查了环境变量,发现 Git Windows Installer 已自动帮我设定好,搜索也没找到解决方案,头皮发麻了一阵时间,最后重启了一下命令行居然就好了,汗颜。。。

其实后来我发现了另一个 Discord BOT 框架,叫 discord.js,不过我懒得重新折腾了。。


参考文章:
[1] https://www.digitaltrends.com/gaming/how-to-make-a-discord-bot/
[2] https://medium.com/davao-js/tutorial-creating-a-simple-discord-bot-9465a2764dc0
[3] https://github.com/renesansz/discord-greeter-bot/issues/48#issuecomment-354666726