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
| #!/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: "用戶名", token: "Token", repo: "issues的git倉庫", sitemapUrl: path.resolve(__dirname, "./public/sitemap.xml"), kind: "Gitalk", baseUrl: "https://blog.lingma.top/" }; 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", "Authorization":"token 你的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:"+`${requestGetOpt.url}` ); let issues = await send(requestGetOpt); console.log(`已經存在${issues.length}個issues`);
let notInitIssueLinks = urls.filter((link) => { return !issues.find((item) => { link = removeProtocol(link); console.log("link",link) return !!item.body? item.body.includes(link):false; }); }); if (notInitIssueLinks.length > 0) { console.log(`本次有${notInitIssueLinks.length}個鏈接需要初始化issue:`); 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 = md5( url.parse(item).path); console.log("MD5",url,url.parse(item).path,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); } }); }); }
|