抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

自动初始化 Gitalk 和 Gitment 评论

2019 年 12 月 05 日

自动初始化 Gitalk 和 Gitment 评论

之前的博客一直都使用 Disqus 作为评论系统,然后因为 Disqus 在国内无法访问,很多读者都只能通过邮件的方式咨询一些问题,昨天觉得长痛不如短痛,直接将博客的评论迁移到了 Gitalk,最开始选择了使用 Gitment 作为评论系统,但是由于其开发者很久没有维护、代码七个月也没有更新,所以就选择了有更多人维护的 Gitalk 作为目前博客的评论系统。


无论是 Gitalk 还是 Gitment 都只能手动初始化所有文章的评论或者一个一个点开界面,作者觉得这件事情非常麻烦,所以手动抓了一下 Gitalk 和 Gitment 在初始化评论时发出的网络请求后写了一个用于自动化初始评论的脚本。


获得权限

在使用该脚本之前首先要在 GitHub 创建一个新的 Personal access tokens,选择 Generate new token 后,在当前的页面中为 Token 添加所有 Repo 的权限:



在这里创建之后,点击界面最下的面 Generate token 按钮获得一个新的 token:



作者已经把这个 token 删掉了,不要想着用这个 token 就能获得到作者 GitHub 的权限。


自动化脚本

作者在抓取了 Gitalk 和 Gitment 的 API 请求发现,这两个评论服务是通过 GitHub 提供的 API 创建含有相应标签的 issue,所以我们应该也可以直接使用 GitHub 的 API 创建所有博客文章对应的 issue,这与通过评论插件创建 issue 是完全一样的,在创建之后无论是 Gitalk 还是 Gitment 都可以通过对应的标签直接在仓库中找到对应的 issue 了。


本文中提供的自动化脚本使用的是 Ruby 代码,请确定自己的机器上已经安装了 Ruby,并且使用如下的命令安装脚本所需要的所有依赖:


Ruby


$ sudo gem install faraday activesupport sitemap-parser
复制代码


使用 sitemap 文件

如果我们使用的博客服务是 Jekyll,那么就可以通过 jekyll-sitemap 插件为博客创建对应的 sitemap 文件,例如:https://draveness.me/sitemap.xml。


有 sitemap 文件之后就非常好办了,在任意目录下创建 comment.rb 文件后,将下面的代码粘贴到文件中:


Ruby


username = "draveness" # GitHub 用户名new_token = "xxxxxxx"  # GitHub Tokenrepo_name = "github-comments-repo" # 存放 issuessitemap_url = "https://draveness.me/sitemap.xml" # sitemapkind = "Gitalk" # "Gitalk" or "gitment"
require 'open-uri'require 'faraday'require 'active_support'require 'active_support/core_ext'require 'sitemap-parser'
sitemap = SitemapParser.new sitemap_urlurls = sitemap.to_a
conn = Faraday.new(:url => "https://api.github.com/repos/#{username}/#{repo_name}/issues") do |conn| conn.basic_auth(username, token) conn.adapter Faraday.default_adapterend
urls.each_with_index do |url, index| title = open(url).read.scan(/<title>(.*?)<\/title>/).first.first.force_encoding('UTF-8') response = conn.post do |req| req.body = { body: url, labels: [kind, url], title: title }.to_json end puts response.body sleep 15 if index % 20 == 0end
复制代码


在这里有 5 个配置项,分别是 GitHub 用户名、在上一步获得的 Token、存放 issues 的仓库、sitemap 的地址以及最后你在博客中使用了哪个评论插件,不同的插件拥有标签,可以选择 "Gitalk" 或者 "gitment",对于其他评论的插件应该如何设置,作者就并不清楚了。


需要注意的是,在使用上述的代码为博客创建 issue 时,会为博客中 sitemap 包含的全部界面创建对应的 issue,其中包括例如首页、标签界面等,这对于作者来说不是太大的问题,但是对这个问题敏感的读者可以使用下一小节中的代码。


在配置完成后就可以在命令行中的当前目录下输入以下命令:


Ruby


$ ruby comment.rb
复制代码


然后当前脚本就会运行并初始化所有的评论了。


无 sitemap 或自定义

如果博客中不包含任何的 sitemap 文件,或者想要手动选择想要初始化的一些文章其实也是可以的,可以使用简化的代码批量初始化指定博客的评论:


Ruby


username = "draveness" # GitHub 用户名new_token = "xxxxxxx"  # GitHub Tokenrepo_name = "github-comments-repo" # 存放 issueskind = "Gitalk" # "Gitalk" or "gitment"urls = ["xxxxx"]
require 'open-uri'require 'faraday'require 'active_support'require 'active_support/core_ext'
conn = Faraday.new(:url => "https://api.github.com/repos/#{username}/#{repo_name}/issues") do |conn| conn.basic_auth(username, token) conn.adapter Faraday.default_adapterend
urls.each_with_index do |url, index| title = open(url).read.scan(/<title>(.*?)<\/title>/).first.first.force_encoding('UTF-8') response = conn.post do |req| req.body = { body: url, labels: [kind, url], title: title }.to_json end puts response.body sleep 15 if index % 20 == 0end
复制代码


在这里就需要手动填入需要初始化文章的数组了,当然如果你有 sitemap 文件,其实可以在 irb 中运行以下的代码得到全部的文章数组,再手动从其中剔除不想要创建评论的页面:


Ruby


$ irb2.3.3 :001 > require 'sitemap-parser' => true2.3.3 :002 > sitemap_url = "https://draveness.me/sitemap.xml" => "https://draveness.me/sitemap.xml"2.3.3 :003 > SitemapParser.new(sitemap_url).to_a => ["https://draveness.me/prolog-ji-chu-1", "https://draveness.me/prolog-pi-pei-2", "https://draveness.me/prolog-di-gui-3", ..., "https://draveness.me/dynamo"]
复制代码


当我们将上述结果中不想要创建评论的文章删除之后,将结果填到 urls 这个临时变量中,运行下面的命令就可以了。


Ruby


$ ruby comment.rb
复制代码


其他

由于 GitHub 对脚本的请求会做一定的限制,所以在连续请求接口,批量创建 issues 的过程中可能会出现创建失败的情况,你可以通过命令中打印的结果看到,不过在脚本中已经在每 20 次创建时休眠 15 秒,所以应该也不会遇到这个问题。


另外,GitHub 中 issue 的可以创建但是并不能删除,所以在配置时请一定检查好所有的配置项是否正确,否则会批量创建一些无用的 issue 虽然没有什么影响,但是看起来非常头疼。


总结

手动初始化每一篇文章的评论确实是非常痛苦的,放弃 Disqus 确实也考虑了比较久的事件,Disqus 中也确实有一些有价值的评论,但是本着长痛不如短痛的原则,还是选择迁移到 Gitalk,当然作者也希望 Gitalk 官方能够提供更好地使用体验。


本文转载自 Draveness 技术博客。


原文链接:https://draveness.me/git-comments-initialize


2019 年 12 月 05 日 18:13307

评论

发布
暂无评论
发现更多内容

架构师 0 期 | 架构师怎样实现架构目标?

刁架构

设计模式 极客大学架构师训练营

作业

chenzt

【架构师第二周作业】依赖倒置

浪浪

架构师0期week2-作业

小高

编程的本质

GalaxyCreater

架构

视频豪横时代,应用如何快速构建视频点播能力?

阿里云Edge Plus

音视频 CDN 直播 点播

软件的本质与设计原则

dony.zhang

架构师训练营第二周命题作业

兔狲

作业

江帅帅:精通 Spring Boot 系列 05

奈学教育

Spring Boot

7-ELEVEn工作法

wujunmin

管理 零售

第二周作业

极客大学架构师训练营

京东Java高开岗三面算法+数据库+设计模式,复习1个月成功拿offer

互联网架构师小马

数据库 面试 算法 设计模式 Java 分布式

江帅帅:精通 Spring Boot 系列 05

古月木易

Spring Boot

架构师训练营第二周作业

时来运转

架构师训练营第二周总结

时来运转

第 02 周学习总结

夏秋

架构师训练营第二周学习总结

whiter

极客大学架构师训练营

架构师训练营第二周命题作业

hifly

设计模式 极客大学架构师训练营 UML 依赖倒置原则 接口隔离原则

设计原则——依赖倒置原则

GalaxyCreater

架构

豆瓣9.0,35万读者“搜不到信息”的神秘作者,我们帮你找到了

华章IT

JVM 虚拟机 深入理解JVM Java 25 周年 周志明

学习总结 -- Week2

吴炳华

极客大学架构师训练营

DIP和SIP的理解和学习

拈香(曾德政)

极客大学架构师训练营 面向对象设计原则 DIP 设计原则 SIP

第 02 周作业

夏秋

极客大学架构师训练营

0期架构Week2作业1

Nan Jiang

【漫画】云通信企业公众号,打造私域流量的利器

阿里云Edge Plus

云通信

银行业数据治理之「数据资产管理」

数据司令

大数据 数据仓库 金融科技 数据治理 数据资产

透过本质和发展看编程

拈香(曾德政)

架构师 面向对象设计 极客大学架构师训练营 面向对象设计原则

设计原则

GalaxyCreater

架构

架构师训练营2 ——框架设计

默默

设计一个软件框架的关键点

dony.zhang

你不会还不懂依赖倒置吧?赶紧来看看

hellohuan

设计模式 极客大学架构师训练营 设计原则

Study Go: From Zero to Hero

Study Go: From Zero to Hero

自动初始化 Gitalk 和 Gitment 评论-InfoQ