1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| 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 crypto = require('crypto');
const config = { username: "name", token: "token", repo: "blogtalk", sitemapUrl: path.resolve(__dirname, "./public/sitemap.xml"), kind: "Gitalk", }; let issuesUrl = `https://api.github.com/repos/${config.username}/${config.repo}/issues?access_token=${config.token}`;
let requestGetOpt = { url: `${issuesUrl}&page=1&per_page=1000`, json: true, headers: { "User-Agent": "github-user" } }; 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-1}个链接`); 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); }); }); for(let i=0;i<notInitIssueLinks.length;i++) { if(notInitIssueLinks[i].endsWith("tags/index.html")) { notInitIssueLinks.splice(i,1); i--; } }
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 desc = item + "\n\n" + cheerio.load(html)("meta[name='description']").attr("content"); let pathLabel = url.parse(item).path; let label = crypto.createHash('md5').update(pathLabel,'utf-8').digest('hex'); let form = JSON.stringify({ "body": desc, "labels": [config.kind, label], "title": 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); } }); }); }
|