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个左右的文章,而博主有大量的博文需要初始化,没办法只好疯狂的运行这个脚本,有时间可以研究一下怎么一次搞定。