mirror of
https://github.com/SouthFox-D/SouthFox-D.github.io.git
synced 2024-12-01 18:55:20 +01:00
148 lines
4.5 KiB
Markdown
148 lines
4.5 KiB
Markdown
---
|
|
author: SouthFox
|
|
title: 为博客支持评论系统
|
|
date: 2022-01-31 11:31:57
|
|
tags:
|
|
- 技术
|
|
- 建站
|
|
category: 技术
|
|
toc: true
|
|
---
|
|
|
|
突然发现加入十年之约的博客评论区都好热闹……似乎都是随机访问过来的,所以还是有必要为博客加上评论系统的?
|
|
|
|
<!--more-->
|
|
|
|
考察了一番选择了依靠 `GitHub Discussions` 的 `Giscus` 做为博客的评论系统。
|
|
|
|
## 特点
|
|
|
|
👍 优点:
|
|
|
|
- 比起 `Gitalk` ,拥有更小的权限请求
|
|
- 部署也方便,十分钟内都能轻松搞定
|
|
- 数据安全也有 `GitHub` 做背书,至少比自建强
|
|
- 拉取 `Discussions` 数据的脚本是放在 `vercel` 上,国内看评论至少是没问题的
|
|
|
|
🙃 缺点:
|
|
|
|
- 评论得需要个 `GitHub` 帐号,对于没有相关经验的人真可谓叹息之墙了,但是也不全是坏事,倒垃圾评论也能隔绝掉大部分。
|
|
|
|
|
|
|
|
## 部署
|
|
|
|
0. 为仓库开启 `Discussions` ,仓库 Setting --> Features --> 勾选 Discussions 。
|
|
1. 先去 [GitHub 应用页](https://github.com/apps/giscus) 安装 `Giscus` ,可以仅给指定的仓库授权。
|
|
2. 在到 [Giscus 官网](https://giscus.app/zh-CN) 进行配置,输入仓库名,决定映射方式等、评论样式等。
|
|
3. 最后生成一个脚本代码,嵌入到博客文章模板底部,搞定!
|
|
|
|
|
|
|
|
## 坑
|
|
|
|
如果映射方式选择 `pathname`,而 uri 里包含中文,将会被解码,搞得非常乱。所以可以自己麻烦一点,手动指定。
|
|
|
|
如 `Hexo` ,在 `head` 模板中插入到 `<head>` 标签里:
|
|
|
|
```ejs
|
|
<% if (page.title){ %><meta property="og:title" content="<%= page.path %>"/><% } %>
|
|
```
|
|
|
|
之后 `Giscus` 选择为 `og:title` ,这样就确保标题不会被转码了。
|
|
|
|
|
|
|
|
## 自动初始化
|
|
|
|
总体来说还是不错的,再折腾一下可以选择自建,这样可以避开对脚本所在域名的封锁,或者部署时自动创建对应帖子,<del>不过挺麻烦,以后在摸吧 🐟 。</del>
|
|
|
|
**3-13 更新:**
|
|
|
|
其实很早就摸了,只是我憋着不放而已(
|
|
|
|
```python
|
|
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` 准备的,不知道是什么的话可以看[这](../../03/Github-Actions-浅尝辄止)。
|
|
|
|
|
|
|
|
## 最后
|
|
|
|
最后,欢迎你能访问到我这荒岛,请友善评论哦~
|
|
|
|
|
|
|