突然发现加入十年之约的博客评论区都好热闹……似乎都是随机访问过来的,所以还是有必要为博客加上评论系统的?
考察了一番选择了依靠 GitHub Discussions
的 Giscus
做为博客的评论系统。
特点
👍 优点:
- 比起
Gitalk
,拥有更小的权限请求
- 部署也方便,十分钟内都能轻松搞定
- 数据安全也有
GitHub
做背书,至少比自建强
- 拉取
Discussions
数据的脚本是放在 vercel
上,国内看评论至少是没问题的
🙃 缺点:
- 评论得需要个
GitHub
帐号,对于没有相关经验的人真可谓叹息之墙了,但是也不全是坏事,倒垃圾评论也能隔绝掉大部分。
部署
- 为仓库开启
Discussions
,仓库 Setting –> Features –> 勾选 Discussions 。
- 先去 GitHub 应用页 安装
Giscus
,可以仅给指定的仓库授权。
- 在到 Giscus 官网 进行配置,输入仓库名,决定映射方式等、评论样式等。
- 最后生成一个脚本代码,嵌入到博客文章模板底部,搞定!
坑
如果映射方式选择 pathname
,而 uri 里包含中文,将会被解码,搞得非常乱。所以可以自己麻烦一点,手动指定。
如 Hexo
,在 head
模板中插入到 <head>
标签里:
1
| <% if (page.title){ %><meta property="og:title" content="<%= page.path %>"/><% } %>
|
之后 Giscus
选择为 og:title
,这样就确保标题不会被转码了。
自动初始化
总体来说还是不错的,再折腾一下可以选择自建,这样可以避开对脚本所在域名的封锁,或者部署时自动创建对应帖子,不过挺麻烦,以后在摸吧 🐟 。
3-13 更新:
其实很早就摸了,只是我憋着不放而已(
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
| import sys import os import requests import json import getopt import re import random from datetime import datetime
def addDiscussion(): currentYear = str(datetime.now().year) repo_id="aaabbb" category_id="cccddd" DISCUSSIONS_TOKEN=os.environ.get('DISCUSSIONS_TOKEN')
header = { "Authorization": f"Bearer {DISCUSSIONS_TOKEN}" } data = { 'query': """query{repository(owner:"name",name:"repo_name"){ id discussions(first:100, categoryId: "aaabbb"){ nodes{ title } } } }""" } url = 'https://api.github.com/graphql'
r = requests.post(url, headers=header, data=json.dumps(data)) if r.status_code == 200: discussions = r.json()
discussions = discussions["data"]["repository"]["discussions"]["nodes"]
discu_list = [] for i in discussions: discu_list.append(i["title"])
for post in postlist: if currentYear not in post: continue
if post not in discu_list: data = { 'query': """mutation{ createDiscussion(input: {repositoryId: "%s", categoryId: "%s", body: "%s", title: "%s"}) { discussion { id } } }""" % (repo_id, category_id, 'blog url' + post, post) }
r = requests.post(url, headers=header, data=json.dumps(data)) if r.status_code == 200: print(f"初始化对应讨论! {post}") print(r.text)
if __name__ == '__main__': filelist = [] postlist = [] addDiscussion()
|
学了一下新玩意…… graphql
似乎比基于 REST
形式的更强大一点?
其中是根据对应的 access token
进行部署,所以要为对应部署的 access token
指定 discussions
权限……
注意其中的 currentYear
那里,因为只获取了最新的 100
条数据,要是文章数据超过 100
条的话或许会重复创建?所以就仅仅只判断当年的文章了,第一次部署时请去掉此判断。除非你想当超时空战士为以往年份写文章或者是一年能写 100
篇文章的人,那么此逻辑应该没问题……吧。
是为了 GitHub Actions
准备的,不知道是什么的话可以看这。
最后
最后,欢迎你能访问到我这荒岛,请友善评论哦~