之前博客用的是 Valine, 选择它的原因是可以匿名评论. Valine 的缺点是没有办法对新的评论发邮件提醒, 虽然官方文档说是可以的, 但一直没能按文档配置成功.
Gitalk 是一款基于 github issue 的评论系统, 它的缺点是没办法匿名评论, 但鉴于我的博客是技术博客, 大部分读者应该都是有 github 账号的, 这个缺点还是可以忍受的.
如何集成 Gitalk
Gitalk 官网有详细的安装介绍, 这儿 是 maupassant 主题的一个集成示例.
这儿 是我的 maupassant 主题中 Gitalk 的配置示例.
使用 md5 解决 label 过长的问题
Gitalk 中每篇博客都是和一个 issue 对应的, 博客的评论内容就是存储在对应的 issue 中:
- 每篇博客都会有一个 id, 这个 id 是以 issue label 的形式存储的
- id 默认是博客的链接地址
- Github 对 label 的长度有限制, 最多只能是 50 个字符
当博客的标题比较长时, 很容易就会超过 50 个字符的限制, 这时就会出现 “Error: Validation Failed.” 这样的错误.
为了解决这个问题, 我们可以使用博客链接地址的 md5 值作为博客的 id. 这需要我们修改 gitalk 的集成脚本:
script(type='text/javascript' src='//cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js')
...
id: md5(window.location.pathname),
这儿 是完整的示例代码.
这里我们使用 window.location.pathname 作为计算 md5 的输入, 它不包括链接中的 host 部分, 这样当我们的博客存在不同的镜像时, 可以让不同主机上的相同博客共享同一套评论.
初始化所有博客的评论系统
这篇博客详细介绍了如何对之前的博客初始化评论系统, 这里我们只介绍如何通过 sitemap 的方法来进行初始化.
环境准备
在开始之前需要我们准备好一下环境:
- 生成了博客的 sitemap.xml 文件
- 在 Personal Access Tokens 界面中创建一个新的 token, 需要选中所有 repo 的权限
- 安装依赖的 gem 包:
sudo gem install faraday activesupport sitemap-parser
上面的环境准备好了之后, 把对应的信息填到下面的 ruby 脚本并执行即可:
username = "hiberabyss" # GitHub 用户名
token = "your-token" # GitHub Token
repo_name = "BlogComments" # 存放 issues
sitemap_url = "https://hiberabyss.github.io/sitemap.xml" # sitemap
kind = "Gitalk" # "Gitalk" or "gitment"
require 'open-uri'
require 'faraday'
require 'active_support'
require 'active_support/core_ext'
require 'sitemap-parser'
require 'uri'
require 'digest/md5'
sitemap = SitemapParser.new sitemap_url
urls = sitemap.to_a
conn = Faraday.new(:url => "https://api.github.com/repos/#{username}/#{repo_name}/issues") do |conn|
conn.basic_auth(username, token)
conn.adapter Faraday.default_adapter
end
urls.each_with_index do |url, index|
uri = URI::parse(url)
url_md5 = Digest::MD5.hexdigest(uri.path)
title = open(url).read.scan(/<title>(.*?)<\/title>/).first.first.force_encoding('UTF-8')
response = conn.post do |req|
req.body = { body: url, labels: [kind, url_md5], title: title }.to_json
end
puts response.body
sleep 15 if index % 20 == 0
end
在这个脚本中我们也是用博客链接的 md5 值作为 id 的.