切换到Gitalk后每次都需要手动去创建issue,为了简化流程,使用Nodejs和GithubAPI去自动初始化
参考原文:daihaoxin
PS: 基于原博主脚本做了部分修改
因Github于2021年禁用了将access_token作为查询参数访问API,所以调整到了Header中,详情见链接
- issuesUrl
- requestGetOpt
一、生成sitemap站点地图
1. 安装插件
npm install hexo-generator-sitemap --save npm install hexo-generator-baidu-sitemap --save
|
2. 在站点根目录下的_config.yml添加如下代码
sitemap: path: sitemap.xml
baidusitemap: path: baidusitemap.xml
|
现在在执行hexo generate
的时候,在博客根目录下的public文件夹下面,就会生成sitemap.xml和baidusitemap.xml。
二、获取github接口的调用权限
- 创建一个access token 点此进入
- 点击Generate new token按钮
- 输入一个描述,为token添加所有的
repo
权限,然后点击最下方的Generate token
按钮,就可以生成一个新的Token
- Token在下面的脚本会用到
三、部署脚本
1. 安装依赖包
在你hexo的根目录,执行下面的命令
npm install request --save npm install xml-parser --save npm install yamljs --save npm install cheerio --save npm install md5 --save
|
2. 创建脚本文件
在站点根目录下创建comment.js文件,将下面的代码粘贴进文件中,然后修改config中的配置项,其中token
就是上一步中获取的值
#!/usr/bin/env node const request = require("request"); const fs = require("fs"); const path = require("path"); const url = require("url"); const xmlParser = require("xml-parser"); const YAML = require("yamljs"); const cheerio = require("cheerio"); const md5 = require("md5");
const config = { username: "sungaomeng", token: "********", repo: "sungaomeng.github.io", sitemapUrl: path.resolve(__dirname, "./public/sitemap.xml"), kind: "Gitalk", baseUrl: "https://opsolo.com/" };
let issuesUrl = `https://api.github.com/repos/${config.username}/${config.repo}/issues?`;
let requestGetOpt = { url: `${issuesUrl}&page=1&per_page=1000`, json: true, headers: { "User-Agent": "github-user", "Authorization": "Bearer <token>" } }; let requestPostOpt = { ...requestGetOpt, url:issuesUrl, method: "POST", form: "" };
console.log("开始初始化评论...");
(async function() { console.log("开始检索链接,请稍等...");
try { let websiteConfig = YAML.parse(fs.readFileSync(path.resolve(__dirname, "./_config.yml"), "utf8"));
let urls = sitemapXmlReader(config.sitemapUrl); console.log(`共检索到${urls.length}个链接`);
console.log("开始获取已经初始化的issues:"); let issues = await send(requestGetOpt); console.log(`已经存在${issues.length}个issues`);
let notInitIssueLinks = urls.filter((link) => { return !issues.find((item) => { link = removeProtocol(link); return item.body.includes(link); }); }); if (notInitIssueLinks.length > 0) { console.log(`本次有${notInitIssueLinks.length}个链接需要初始化issue:`); console.log(notInitIssueLinks); console.log("开始提交初始化请求, 大约需要40秒...");
setTimeout(async ()=>{ let initRet = await notInitIssueLinks.map(async (item) => { let html = await send({ ...requestGetOpt, url: item }); let title = cheerio.load(html)("title").text(); let pathLabel = url.parse(item).path; pathLabel = md5(config.baseUrl + pathLabel); let body = `${item}<br><br>${websiteConfig.description}`; let form = JSON.stringify({ body, labels: [config.kind, pathLabel], title }); return send({ ...requestPostOpt, form }); }); console.log(`已完成${initRet.length}个!`); console.log("可以愉快的发表评论了!"); },40000); } else { console.log("本次发布无新增页面,无需初始化issue!!"); } } catch (e) { console.log(`初始化issue出错,错误如下:`); console.log(e); } finally {
} })();
function sitemapXmlReader(file) { let data = fs.readFileSync(file, "utf8"); let sitemap = xmlParser(data); return sitemap.root.children.map(function (url) { let loc = url.children.filter(function (item) { return item.name === "loc"; })[0]; return loc.content; }); }
function removeProtocol(url) { return url.substr(url.indexOf(":")); }
function send(options) { return new Promise(function (resolve, reject) { request(options, function (error, response, body) { if (!error) { resolve(body); } else { reject(error); } }); }); }
|
3. 执行脚本
需要注意的是第一步中的sitemap插件会生成的sitemap.xml会包含全部的界面,包括标签页、关于页等,执行上面的代码也会对这些页面生成评论框(也就是issue)
完成上述操作后,执行下面的命令,就可以部署站点,并初始化所有的评论了。
hexo clean hexo generate hexo deploy node ./comment.js
|
也可以通过在站点根目录的package.json文件中,新建npm脚本,一个命令搞定清除缓存、生成静态文件、提交git并生成issue的所有操作。
"scripts": { "start": "hexo clean && hexo s", "deploy": "hexo clean && hexo generate && hexo deploy && node ./comment.js" }
|
完成文章编写,或者其他的更新操作后,直接执行deploy即可。
输出:
192:blog See$ ./comment.js 开始初始化评论... 开始检索链接,请稍等... 共检索到15个链接 开始获取已经初始化的issues: 已经存在3个issues 本次有12个链接需要初始化issue: [ 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: 'https: ] 开始提交初始化请求, 大约需要40秒... 已完成12个! 可以愉快的发表评论了!
|