Artalk 安装和搭配 Message-Pusher 实现企业微信评论通知

Artalk 安装和搭配 Message-Pusher 实现企业微信评论通知

December 17, 2023
工具箱 , 分享 , 自托管 ,

Twiko 是我自 iDisqus 后用的最久的一个自托管评论程序了,期间也没少对它做过折腾,比如 用 emoji-mart 替换 twikoo 的 emoji 选择器 等等。但是作者从几年前开始就不怎么做更新了,期间只有一些缝缝补补的小更新,整个界面依旧十分原始。

这些年也时常有不同的评论程序出现在视野里,包括但不限于以下几个,我还在我的数字花园上使用过其中的 Giscus,不过当时我的 Garden 只运营了一段时间就没维护了,没有深度使用,不过这类基于 Github 的都必须要登录才能评论还是觉得不太「自由」:

最后看来看去还是决定使用 Artalk,​其实早在以前那台 VPS 上的时候就一直想从 Twikoo 换成 Artalk,不过觉得又要去做主题适配、又要做数据转移,太过麻烦,一直没下手,这次搬家索性就把这事给一并给办了。

安装

Artalk 支持 Docker 运行,安装自然就非常简单了,我的 docker-compose 配置文件如下:

version: '3'
services:
  artalk:
    container_name: artalk
    image: artalk/artalk-go
    ports:
      - "2336:2336"
    volumes:
      - /test/data/artalk-data:/data
    restart: always

运行完毕后再通过下面的代码手动创建管理员账号:

docker exec -it artalk artalk admin

并在前端页面上引入对应的 css 和 js 后,设置好初始化函数即可运行:

<link href="http://your_domain:8080/dist/Artalk.css" rel="stylesheet">
<script src="http://your_domain:8080/dist/Artalk.js"></script>
<div id="Comments"></div>
<script>
Artalk.init({
  el:        '#Comments',                // 绑定元素的 Selector
  pageKey:   '/post/1',                  // 固定链接 (留空自动获取)
  pageTitle: '关于引入 Artalk 的这档子事',  // 页面标题 (留空自动获取)
  server:    'http://your_domain:8080',  // 后端地址
  site:      'Artalk 的博客',             // 你的站点名
})
</script>
💡
Artalk.init 内的 pagekek、pagetitle 可以不填。
然后在评论框输入后台创建管理员时设置的用户名和邮箱,会自动弹出管理密码输入界面,输入密码后评论框右下侧会出现「控制中心」字样,点击即可打开评论系统侧边栏了,在侧边栏里添加站点。

数据异常处理

之后就是去 Twikoo 的后台将评论数据导出,并通过 Artalk 提供的 数据迁移工具 转换数据格式后导入。

但是,在导入后我发现最新的文章评论数据多出了很多我博客的早期评论,其中最早的都可以追溯到 2017 年了,而同样的文章,在 Twikoo 中却只有几条数据,这明显是有问题的。

之后我通过比对 JSON 数据,发现多的这部分评论基本上都是 Twikoo 早期的异常数据,且大都是因为缺少 Page-key 引起的,因为 Twikoo 的处理是直接不显示,而 Artalk 则都把他纳入了最新文章下面,所以才出现上述异常。

没办法只能自己手动来修复,但是几千条数据一条条改又不太现实,我目前能想到的办法就是写一段 js 代码处理,手动定义一个 3000 多条的 json,再通过循环处理好所有有问题的数据,再把数据打印到终端后复制,最终完美处理好数据,具体实施如下:

var json = { "Twikoo所有评论数据...3000多条" };

json.forEach(function(e){
  // page_key格式都是如 “/我是文章/”这种格式,如果不是“/”开头肯定就是有问题的
  if(!e.page_key.startsWith("/")){
    // 评论数据中有page_herf字段,格式为:https://1900.live/xxxx/,这里将域名部分替换为空,在重新给page_key即可。
    e.page_key = e.page_herf.replace("https://1900.live","")
  }
});
console.log(json.stringify());
//之后复制json数据,覆盖twikoo.json文件内的数据,再做转换即可。

搭配 Message-Pusher 实现通知

我之前用 Twikoo 是通过企业微信实现通知,但是 Artalk 目前只支持钉钉、飞书、TG、邮件等,前两个我没用,TG 的话 Artalk 又不像 Memos 那样支持 CF Works,所以国内的机器无法使用。邮件倒是配置好了,但是感觉没 IM 工具来的利索,我还跑去提了个 issue

提 issue 的时候想起之前了解过的 Message-Pusher(下文简称 Pusher),一款自托管通知推送工具,支持多种消息推送方式

    • 邮件消息,
    • 微信测试号,
    • QQ,
    • 企业微信应用号,
    • 企业微信群机器人
    • 飞书自建应用
    • 飞书群机器人,
    • 钉钉群机器人,
    • Bark App,
    • WebSocket 客户端(官方客户端接入文档),
    • Telegram 机器人,
    • Discord 群机器人,
    • 腾讯云自定义告警:免费的短信提醒,
    • 群组消息:可以将多个推送通道组合成一个群组,然后向群组发送消息,可以实现一次性推送到多个渠道的功能,
    • 自定义消息:可以自定义消息请求 URL 和请求体格式,实现与其他服务的对接,支持众多第三方服务

功能可谓相当强大,而且还提供了在线服务。

因为 Artalk 支持发送通知到 Webhook,而且恰好 Pusher 也支持 Webhook 自定义内容提取,所以我索性就研究起这两个如何搭配。

官方有个简单教程:Message Pusher 的自定义 Webhook 功能如何使用,但是不能完全适用于企业微信应用号,至少我按照教程写的无法正常运行,最后通过我各种测试终于勉强能用了,以下是我整理的 企业微信 的简单设置方式:

创建通道

登录后先创建一个通道,我这里用的企业微信 APP

创建接口

根据 Artalk 官方提供的 Webhook 数据请求体 填写设置。设置中创建接口里面的「提取规则」和「构建规则」当时把我搞的有点懵,搞了半天才搞明白。

其实「提取规则」这个地方可以理解成 定义变量 ,Artalk 在收到用户评论后会向目标 Webhook 发送一条固定格式的 json 数据,这个提取规则就是把这个里面的需要的数据定义出来,如下面这个代码,定义了一个 site_name ,值从 Artalk 发送的 comment.site_name 中拿。

{
  "site_name":"comment.site_name",
  "content": "comment.content",
  "nick": "comment.nick",
  "url": "comment.page_url",
  "notify_body": "notify_subject"
}

「构建规则」则是利用上面定义的变量组件成消息体,这里的 content 必须用这个名字,不能随意起(目前只有 contentdescription 有效,其他的会导致转发的时候数据为空,希望有懂的大佬解答一下),内容则是由上面「提取规则」里定义的变量如 $site_name 等,我的拼接如下:

{
  "content": "### 【$site_name】\n\n评论人:$nick\n\n评论:$content\n\n原文链接:[$url]($url)"
}

设置 Artalk

最后保存后回到接口列表,此时会多出一条数据,且有绿色的 复制Webhook链接 按钮,复制链接后填入 Artalk 中的多元通知部分的 Webhook URL 里即可。

最后效果如下,前面两条是以前 Twikoo 的通知,最后一条是 Pusher 发送,同理

加入评论