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>
之后就是去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文件内的数据,再做转换即可。
我之前用Twikoo是通过企业微信实现通知,但是Artalk目前只支持钉钉、飞书、TG、邮件等,前两个我没用,TG的话Artalk又不像Memos那样支持CF Works,所以国内的机器无法使用。邮件倒是配置好了,但是感觉没IM工具来的利索,我还跑去提了个issue。
提issue的时候想起之前了解过的Message-Pusher(下文简称Pusher),一款自托管通知推送工具,支持多种消息推送方式:
功能可谓相当强大,而且还提供了在线服务。
因为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
必须用这个名字,不能随意起(目前只有 content
和 description
有效,其他的会导致转发的时候数据为空,希望有懂的大佬解答一下),内容则是由上面「提取规则」里定义的变量如 $site_name
等,我的拼接如下:
{
"content": "### 【$site_name】\n\n评论人:$nick\n\n评论:$content\n\n原文链接:[$url]($url)"
}
最后保存后回到接口列表,此时会多出一条数据,且有绿色的 复制Webhook链接
按钮,复制链接后填入Artalk中的多元通知部分的Webhook URL里即可。
最后效果如下,前面两条是以前Twikoo的通知,最后一条是Pusher发送,同理
加入评论