第一步 申请Personal Access Token
从 Github 的 Personal access tokens 页面,点击 Generate new token
第二步 安装项目依赖
npm i request xml-parser blueimp-md5 moment hexo-generator-sitemap -S
项目根目录配置文件 _config.yml 添加配置
1 2 3 4 5 6 7 8 sitemap: path: sitemap.xml template: ./sitemap_template.xml
comment.js 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); } }); }); }
第四步: 测试
执行 node ./comment.js
第五步: 自动化 修改 package.json
1 2 3 4 5 6 7 8 ... "scripts" : { "b" : "npm run c && hexo generate && node comment.js" , "c" : "hexo clean" , "d" : "npm run b && hexo d " , "s" : "npm run b && hexo s" }, ...
运行 npm run d 或者 npm run s
本文参考: https://blog.jijian.link/2020-01-10/hexo-gitalk-auto-init/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~