上篇文章结尾我说评论搬家了,其实就搬了一半,但踩了好多坑,在谢大帮助下这次应该搬差不多了,这里记录下。
搬家最开始的动因其实是Netlify的流量不够用。我以为是Disqus的锅,不过经叶寻提醒才发现是之前RSS模版没有设置保留最新几篇而是一直输出所有文章。我看了下那个四兆多的文档大概有200万字内容,差不多写了三本《新华字典》的量,大概也许用这些已经可以模拟出一个我了。调节后目前还是RSS全文输出,不过只会输出最新10篇,从此流量从一天3G直降到100M左右。中间我一度也设置好了用GHA在GitHub pages上托管网站了,就差配置DNS了,现在看也没必要了。
也就是说,我现在其实恢复之前的Disqus评论也可以,因为现在流量够用了。但是这里有个概念错误,如果我下载我文章页面,会看到Disqus的脚本大概2M多,但其实我之前就设置为异步加载了,也就是除非你看到最后,否则Disqus都不会加载,而且就算加载我估计也不能算到Netlify那边的流量里而是浏览器从js脚本的CDN那边下载下来。同时,我这边交了Netlify保护费后看到大量访问是首页,但首页没有评论,而且这个访问也没给出RSS那边的流量,导致我以为Netlify算流量用了些啥黑魔法,现在看确实冤枉Netlify了。
不过,在折腾过程中我已经把Disqus换成Giscus了,毕竟这个js脚本更小,加载更快。另一个换的原因前面说了,国内用不了Disqus,总要开个窗口让不同意见能发出来。说到这,Disqus就经常莫名其妙吞评论或让我审核,算法也很迷,所以换了我也没啥后悔的。Giscus的优点就是全依托GitHub的论坛功能,可以设定标题匹配,这样所有同题目的帖子的评论会直接链接到论坛的帖子里,其余功能跟Disqus也差不多。唯一我觉得比较遗憾的是没有匿名或访客评论功能,现在用Giscus你得有GitHub账号,这样不利于对GitHub不感兴趣的读者评论,而Disqus是允许的。如果后面Giscus开了这个功能,我应该也会跟进打开匿名评论,但这也是双刃剑,很可能被广告覆盖。
然后就是搬迁了,也就是把老评论搬到Giscus那边。首先得从Disqus那边导出一个包含所有评论的xml文档,这一步我就卡了。按官方文档在Disqus的个人设置的社区里找了半天没找到导出功能,后来发现是在工具那边。导出来后,下一步就是转到Giscus上,我用的是标题匹配,主要为了题目美观些,然后就又踩坑了。这里我照抄了Rob Hyndman 的作业,其实谢大写过一篇英文的相关博客,里面也有很多注意事项。当时感觉挺神奇的,用脚本直接就把帖子发上去了,后来才想起来我之前就配置过RStudio的GitHub访问,所以没有被登录卡住。转过去我点开几个看了下没问题就不管了,但其实我没注意到好几个坑。
今天我才看到谢大的评论,这才发现压根之前评论就没链接到原文,再仔细一看发现题目就不对。谢大在评论里给出了基于GraphQL API的更新方法,我照单全收,跑完了发现还是没链接上。然后我怀疑半天是不是因为title最后有个空格而脚本忽略了,后来发现就算去掉空格也链接不上。然后我只好去读之前抄的代码,发现其中有一步用到了Discussion的帖子分类,代码里默认选了第一个,而我当时论坛空空如也,第一个是一个公告性质的帖子,这就导致所有论坛里搬过来的帖子分类都跟我之前设置的不一样。然后我改了下分类就能链接上了。
本来谢大给的代码是更新原有评论,但原有评论存在一个问题,那就是都显示成了代码块。要改这个就麻烦点了,我的一贯风格就是快刀斩乱麻,全删了,然后就发现另一个尴尬的问题,咋删?其实倒也不难,那就是魔改 GraphQL 的语句,既然有批量生成与更新帖子的功能就也会有批量删除,用谢大那个下载信息的语句搞到数据后用下面这块就可以全删了:
for (i in seq_len(nrow(info))) {
message(i, ': ', info$title[i])
print(gh::gh_gql(sprintf('mutation {
deleteDiscussion(input: {id: %s}) {
discussion {
id
}
}
}', str_json(info$id[i]), str_json(info$title[i]), str_json(info$body[i]))))
}
当然我忽略了所有的警告。至于代码块问题,我简单粗暴把四个引号改成一个,然后忘了删 header 的问题,又重新跑了一遍。其实还有些历史遗留问题,我得把一些老网站的评论跟英文网站的也搬过来,最主要问题是Disqus保留的是当时的标题,我后面改过模版,所以标题变动导致链接失效,这种的我就徒手改,幸好也不多。
折腾半天,现在应该算是搬完了,我现在好奇为啥所有人都会收到所有回复的邮件,怀疑是很多人回复都是直接跑到论坛里回复而不是在帖子底下,而且我发现邮件回复也不会产生原有回复的子回复而是直接开一个新回复。不过无所谓了,现在这样就挺好了,GitHub这边应该不会被封,毕竟微软还是在国内做生意的,但愿不是毒奶。