Blog/source/_posts/2022/01/为博客支持评论系统.md
2022-03-27 01:38:45 +08:00

4.5 KiB

author title date tags category toc
SouthFox 为博客支持评论系统 2022-01-31 11:31:57
技术
建站
技术 true

突然发现加入十年之约的博客评论区都好热闹……似乎都是随机访问过来的,所以还是有必要为博客加上评论系统的?

考察了一番选择了依靠 GitHub DiscussionsGiscus 做为博客的评论系统。

特点

👍 优点:

  • 比起 Gitalk ,拥有更小的权限请求
  • 部署也方便,十分钟内都能轻松搞定
  • 数据安全也有 GitHub 做背书,至少比自建强
  • 拉取 Discussions 数据的脚本是放在 vercel 上,国内看评论至少是没问题的

🙃 缺点:

  • 评论得需要个 GitHub 帐号,对于没有相关经验的人真可谓叹息之墙了,但是也不全是坏事,倒垃圾评论也能隔绝掉大部分。

部署

  1. 为仓库开启 Discussions ,仓库 Setting --> Features --> 勾选 Discussions 。
  2. 先去 GitHub 应用页 安装 Giscus ,可以仅给指定的仓库授权。
  3. 在到 Giscus 官网 进行配置,输入仓库名,决定映射方式等、评论样式等。
  4. 最后生成一个脚本代码,嵌入到博客文章模板底部,搞定!

如果映射方式选择 pathname,而 uri 里包含中文,将会被解码,搞得非常乱。所以可以自己麻烦一点,手动指定。

Hexo ,在 head 模板中插入到 <head> 标签里:

<% if (page.title){ %><meta property="og:title" content="<%= page.path %>"/><% } %>

之后 Giscus 选择为 og:title ,这样就确保标题不会被转码了。

自动初始化

总体来说还是不错的,再折腾一下可以选择自建,这样可以避开对脚本所在域名的封锁,或者部署时自动创建对应帖子,不过挺麻烦,以后在摸吧 🐟

3-13 更新:

其实很早就摸了,只是我憋着不放而已(

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 准备的,不知道是什么的话可以看

最后

最后,欢迎你能访问到我这荒岛,请友善评论哦~