博客最重要的作用除了记录之外,还有分享和交流。而一个没有评论功能的博客,又谈何分享,谈何交流。

正因为评论系统对博客的重要性,我搭建了基于 Gitment 的评论系统,而这篇博文将记录这个过程。

Gitment is a comment system based on GitHub Issues, which can be used in the frontend without any server-side implementation.

选择评论系统

  • 网易云跟帖、多说、畅言、友言:这些国内第三方评论系统,由于一些有关部门的原因(纯属个人臆测),都已经挂了,也是连体验的机会都没有
  • disqus、facebook:这两个需要科学上网,门槛较高,国内用户使用便利性一般
  • discourse:收费,standard 版要100刀/月,暂不考虑
  • 来必力:这款中文名字怪异的评论系统出自高丽棒子之手,支持中文、英文、韩文,支持多种社交账号评论,功能齐全,致命硬伤是服务器太慢导致用户体验差(经常是直接加载不出来,体验的机会的没有)
  • Gitment: 基于 GitHub Issues 的评论系统,需要登录 GitHub 才能评论,但考虑到博客受众,这个可以接受

初次尝试

开始时,我尝试用来必力搭建评论系统,但来必力的服务器太慢(估计没有国内服务器),评论功能经常加载不出、无法使用,只好放弃。

改用 Gitment

用 Gitment 搭建评论系统较为简单,分四步完成:

1、引入 css 和 js

<link rel="stylesheet" href="https://imsun.github.io/gitment/style/default.css">
<script src="https://imsun.github.io/gitment/dist/gitment.browser.js"></script>

也可以通过 npm 引入(我的是 ruby 环境,不采用 npm 引入)

npm i --save gitment
import 'gitment/style/default.css'
import Gitment from 'gitment'

2、注册 OAuth Application

点击这里在 GitHub 注册一个 OAuth application. 注册完后记下 client IDclient secret

注意:请正确填写 Callbak URL,一般来说填写首页 URL 即可

3、用 js 渲染组件

const gitment = new Gitment({
  id: 'Your page ID', // optional
  owner: 'Your GitHub ID',
  repo: 'The repo to store comments',
  oauth: {
    client_id: 'Your client ID',
    client_secret: 'Your client secret',
  },
  // ...
})

gitment.render('comments')
// or
// gitment.render(document.getElementById('comments'))
// or
// document.body.appendChild(gitment.render())

4、初始化评论

最后,到每篇博客里,点击 Initialize 按钮,初始化对应博文的评论(实际上是创建博文对应的 GitHub Issue)。

Gitment 问题

搭建完初始化评论时,Gitment报错。

  • 错误信息:Validation error
  • HTTP 状态码:422

原因

Gitment 初始化评论时,会发送 https://api.github.com/repos/yeehomfoo/yeehomfoo.github.io/issues 请求,博文链接放在请求参数的 labels 字段里。而这个博文链接包含文章中文标题,中文会被 encode,encode 之后的长度超过了 GitHub 最大 label 长度(50)限制。

// 请求参数
{
  "title":"在 Mac中搭建 Node.js环境 - Wilderness of Knowledge",
  "labels":["gitment",
            "https://yeehomfoo.github.io/posts/%25E5%259C%25A8--mac%E4%B8%AD%E6%90%AD%E5%BB%BA-node.js%E7%8E%AF%E5%A2%83/"
            ],
  "body":"https://yeehomfoo.github.io/posts/%E5%9C%A8-mac%E4%B8%AD%E6%90%AD%E5%BB%BA-node.js%E7%8E%AF%E5%A2%83/\n\n"
}

解决方案

查看 Gitment 源码发现,Gitment 直接使用博文链接作 labels 参数,不做任何处理

{
    key: 'createIssue',
    value: function createIssue() {
      var _this5 = this;

      var id = this.id,
          owner = this.owner,
          repo = this.repo,
          title = this.title,
          link = this.link,
          desc = this.desc,
          labels = this.labels;

      return _utils.http.post('/repos/' + owner + '/' + repo + '/issues', {
        title: title,
        labels: labels.concat(['gitment', id]),
        body: link + '\n\n' + desc
      }).then(function (meta) {
        _this5.state.meta = meta;
        return meta;
      });
    }
}

修改源码,当博文链接超长时,增加处理逻辑

{
    key: 'createIssue',
    value: function createIssue() {
      var _this5 = this;

      var id = encodeURI(this.id),
          owner = this.owner,
          repo = this.repo,
          title = this.title,
          link = this.link,
          desc = this.desc,
          labels = this.labels;

      if (id && id.length > 50) {
        id = id.substr(0, 50);
      }

      return _utils.http.post('/repos/' + owner + '/' + repo + '/issues', {
        title: title,
        labels: labels.concat(['gitment', id]),
        body: link + '\n\n' + desc
      }).then(function (meta) {
        _this5.state.meta = meta;
        return meta;
      });
    }
}

在获取评论时,也要通过博文链接这个 label 来获取,所以获取评论源码也需要修改。最初我打算修改成通过 title 查询,而查看官方文档发现相关接口不支持通过 title 查询。最终还得增加处理博文链接超长情况的逻辑。

{
    key: 'loadMeta',
    value: function loadMeta() {
      var _this7 = this;

      var id = encodeURI(this.id),
          owner = this.owner,
          repo = this.repo;

      if (id && id.length > 50) {
        id = id.substr(0, 50);
      }

      return _utils.http.get('/repos/' + owner + '/' + repo + '/issues', {
        creator: owner,
        labels: id
      }).then(function (issues) {
        if (!issues.length) return Promise.reject(_constants.NOT_INITIALIZED_ERROR);
        _this7.state.meta = issues[0];
        return issues[0];
      });
    }
}

总结

至此,一个博客评论系统搭建完成了。
搭建评论系统和写这篇博文差不多耗费了我一天的时间,填坑速度亟待提高啊!

(done)

参考文档

[1] Gitment

[2] GitHub REST API v3

Categories:

Updated:

Back to Top ↑