前言

近两天发现我博客的评论系统没有QQ提醒了,也不知道是什么原因,按照官方文档配置了环境变量也不行。

然后找官方文档,慢慢百度,使用自定义Waline服务端的方法完成了这个功能,我这里的配置办法基于Waline服务端使用Vercel部署。

想要配置QQ提醒,请确保已完成Waline评论系统的搭建,详情可参考官方文档

你可以先试试官方配置QQ提醒,要方便很多,我尝试了很多次都不行了,之前还可以。

正文

首先,你需要在QMsg酱申请到KEY,并绑定需要提醒的QQ号,具体配置步骤参考官方文档

当然,如果你需要使用这两个公共机器人的话,请务必先添加它们为好友哦~

image-20230721172332100

然后。你需要找到你部署Waline评论系统的Vercel服务器,官网地址

登录后,进入对应的应用,我的应用如下:

image-20230721171401603

进入应用后,点击Git Repository,进入对应的配置仓库

image-20230721171536650

找到index.js文件,对其进行修改

image-20230721171801534

修改文件并提交到主分支后Vercel会自动重新构建,等待构建完成即可

本人的编程很烂,根据下面的案例,你就能领悟应该怎么编写代码,这只是一个示例。

修改内容如下:

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
const Application = require('@waline/vercel');
const axios = require('axios');

// 自定义环境变量
const MY_EV_VAR = {
// QMsg酱的key
qMsgKey: "",
// 作者邮箱
authorEmail: "",
// 网站名称
siteName: "你的博客名称",
// 网站地址
siteURL: "你的博客地址",
// QMsg酱消息发送接口地址
qMsgApi: "https://qmsg.zendee.cn/send",
}

module.exports = Application({
// 违禁词
forbiddenWords: ['习近平', '毛泽东'],
plugins: [],
// 评论发布后执行的操作,参数1:评论,参数2:回复评论的父级评论
// 使用async的方法,方法体内调用方法一定配合await使用
async postSave(comment, pComment) {
// 如果不是博主本人发的才通知
if (comment.mail != MY_EV_VAR.authorEmail) {

// 使用axios发送post请求
const formData = new URLSearchParams(); // 转载数据
// 将要发送的信息格式化好后装载到POST参数中
if (pComment == undefined) {
formData.append('msg', `💬 ${MY_EV_VAR.siteName} 有新评论啦\n${comment.nick} 说:\n${comment.comment}\n评论地址:\n${MY_EV_VAR.siteURL + comment.url}`);
} else {
formData.append('msg', `💬 ${MY_EV_VAR.siteName} 有新评论啦\n${comment.nick} 回复 ${pComment.nick} 的内容:\n${pComment.comment}\n说:\n${comment.comment}\n评论地址:\n${MY_EV_VAR.siteURL + comment.url}`);
}
// 给QMsg发送请求
await axios.post(`${MY_EV_VAR.qMsgApi}/${MY_EV_VAR.qMsgKey}`, formData);
};
},
});

如果你使用的QMsg酱机器人不是捐赠版,那么发送的消息会进行审核,审核不通过则消息不会被发送,建议修改上诉的消息模板代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
// 修改前
if (pComment == undefined) {
formData.append('msg', `💬 ${MY_EV_VAR.siteName} 有新评论啦\n${comment.nick} 说:\n${comment.comment}\n评论地址:\n${MY_EV_VAR.siteURL + comment.url}`);
} else {
formData.append('msg', `💬 ${MY_EV_VAR.siteName} 有新评论啦\n${comment.nick} 回复 ${pComment.nick} 的内容:\n${pComment.comment}\n说:\n${comment.comment}\n评论地址:\n${MY_EV_VAR.siteURL + comment.url}`);
}

// 修改后
if (pComment == undefined) {
formData.append('msg', `💬 ${MY_EV_VAR.siteName} 有新评论啦\n${comment.nick} 说:\n${comment.comment}`);
} else {
formData.append('msg', `💬 ${MY_EV_VAR.siteName} 有新评论啦\n${comment.nick} 回复 ${pComment.nick} 的内容:\n${pComment.comment}\n说:\n${comment.comment}`);
}

当然,你也可以自己定义,审核情况可以在QMsg酱控制台的近30条记录里查看,不通过会说明原因,其中commentpComment对象的属性如下。

comment:评论对象

属性解释
nick评论者的名称
mail评论者的邮箱
link评论者的个人网址
url评论所在的文章地址,例:/page/hello-word/
comment评论的内容
browser评论者使用的浏览器
os评论者使用的操作系统
addr评论者的归属地
avatar评论者头像地址
commentLink评论中的链接,仅在 Telegram 通知中提供,会自动封装成 Markdown 的格式

pComment:如果评论是回复别人的情况,此对象表示那个父级评论的对象,否则为undefined

属性解释
nick评论者的名称
mail评论者的邮箱
link评论者的网址
browser评论者使用的浏览器
os评论者使用的操作系统
addr评论者的归属地
avatar评论者的头像地址
comment评论的内容

下面的案例包含通过与未通过的情况:

image-20230721175026357

成功案例展示:

image-20230721175410790

后语

完成这个小功能花费了一下午的时间,踩坑+查文档,完成后还是很有成就感的。

踩坑点:

  1. 以为消息发送不了是因为QQ机器人出了问题,花费了许多经历在QQ机器人上。

    建议在浏览器使用https://qmsg.zendee.cn/send/您的KEY?msg=消息测试请求测试一下。

  2. 认为是Vercel服务端环境变量配置的问题,一直删应用,创应用,浪费了很多时间,并且我还是不知道到底是不是Vercel的问题。

  3. 由于不太明白JS语法,在async标记的方法中,调用异步的方法没有使用await标记,导致程序运行出问题。

不足:

  1. 这段程序除了原来就有的内容,自己编写的全是NodeJS的原生语法,没有去调用waline的方法,自己也不知道它有哪些方法可以调用。
  2. 在这个index.js文件里面还有很多功能可以做,目前只会做这一个功能。

如果你也在配置的时候出现了问题,可以将问题描述在评论区,大家一起解决。

或者是你解决了一些难题,你也可以将你的解决方案写在评论区里。