Gitalk 自动初始化评论


博主在用 Hexo 搭建博客的时候,一直在考虑评论系统用什么,最终比较了多家,决定用 Gitalk,这是一个基于 Github Issues 的评论系统,所有的评论内容都保存在 Github Issues 中,每篇博客对应一个 Issues。只有登陆 Github 账号才能评论,大多数人应该都会有 github 账号吧,毕竟全球最大同性交友平台~ 但是 Gitalk 有个问题,就是每篇博客都要手动初始化评论区,若博客是从别的地方迁移过来的,数量巨大的话,手动初始化就会非常的不方便,这样就需要自动化这个操作了,比较好的方法就是写脚本来实现。博主网上搜了很多个帖子,很多的代码在博主这都没法正常运行,最后终于找到了一个可用的,参见这篇博客 ( http://edisonxu.com/2018/10/31/gitalk-auto-init.html ),这里需要在自己的 Github 新建一个专门放评论的仓库,并且申请 personal access token,以用来调用 Github 的 API 来创建 issues。另外还要在自己的博客上配置 sitemap(具体方法可以自行 google)。另外还需要注意的是,假如 hexo 上的博客路径是自定义的话,注意修改代码中的 label 变量,帖子中的代码是把 label 进行 md5 加密的,说是怕标题太长,gitalk 没法正常显示。这里博主进行了修改,没用 md5,而是根据博主自定义的博文路径进行了修改,修改后的代码如下:


var request = require('request');
var Sitemapper = require('sitemapper');
var cheerio = require('cheerio');
var crypto = require('crypto');
const { finished } = require('stream');

// 配置信息
const username = "<YourUsername>" //github账号,对应Gitalk配置中的owner
const repo_name = "<YourRepo>" //用于存储Issue的仓库名,对应Gitalk配置中的repo
const token = "<YourToken>"   //前面申请的personal access token
const sitemap_url = "http://<YourDomain>.com/sitemap.xml"  // 自己站点的sitemap地址

var base_url = "https://api.github.com/repos/"+ username + "/" + repo_name + "/issues"

var sitemap = new Sitemapper();

sitemap.fetch(sitemap_url)
    .then(function (sites) {
        sites.sites.forEach(function (site, index) {
            if (site.endsWith('404.html')) {
                console.log('跳过404')
                return
            }
            request({
                url: site,
                headers: {
                    'Content-Type': 'application/json;charset=UTF-8'
                }
            }, function (err, resp, bd) {
                if (err || resp.statusCode != 200)
                    return
                const $ = cheerio.load(bd);
                var title = $('title').text();
                var desc = site + "\n\n" + $("meta[name='description']").attr("content");
                var path = site.split(".com")[1]
                // var md5 = crypto.createHash('md5');
                // var label = md5.update(path).digest('hex')
                
                // ============ Customize your own label ============
                var idx = title.indexOf(".")
                var label;
                if (idx == -1) {
                    label = '/';
                } else {
                    label = '/leetcode/' + title.substring(0, idx) + '/';
                }
                
                var options = {
                    headers: {
                        'Authorization': 'token '+token,
                        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
                        'Accept': 'application/json'
                    },
                    url: base_url+ "?labels="+"Gitalk," + label,
                    method: 'GET'
                }
                // 检查issue是否被初始化过
                request(options, function (error, response, body) {
                    if (error || response.statusCode != 200) {
                        console.log('检查['+site+']对应评论异常')
                        return
                    }
                    var jbody = JSON.parse(body)
                    if(jbody.length>0)
                        return
                    //创建issue
                    var request_body = {"title": title, "labels": ["Gitalk", label], "body": desc}
                    //console.log("创建内容: "+JSON.stringify(request_body));
                    var create_options = {
                        headers: {
                        'Authorization': 'token '+token,
                        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
                        'Accept': 'application/json',
                        'Content-Type': 'application/json;charset=UTF-8'
                        },
                        url: base_url,
                        body: JSON.stringify(request_body),
                        method: 'POST'
                    }
                    request(create_options, function(error, response, body){
                        if (!error && response.statusCode == 201) 
                            console.log("地址: ["+site+"] Gitalk初始化成功")
                    })
                });
            });
        });
    })
    .catch(function (err) {
        console.log(err);
    });

后记:这里还有一个问题,就是每次执行貌似只能初始化20个左右的文章,而博主有大量的博文需要初始化,没办法只好疯狂的运行这个脚本,有时间可以研究一下怎么一次搞定。

上一篇:关于同一个JVM连接多个加密方式不同的Zookeeper的讨论


下一篇:sql server2000存储过程sp_droplogin