使用新浪微博开放平台api同步微博内容至自己网站(静态博客框架Hexo入门,本文评论系统怎么做?)

优采云 发布时间: 2021-10-27 22:20

  使用新浪微博开放平台api同步微博内容至自己网站(静态博客框架Hexo入门,本文评论系统怎么做?)

  本文仅介绍如何基于github问题实现第三方评论系统。对于 Hexo 的介绍,本文不打算赘述。如果有之前不了解Hexo的童鞋,可以看看之前的文章《Hexo介绍,一个静态博客框架》,或者直接访问Hexo官网

  一、原因

  个人博客基于静态博客系统(Hexo),没有任何后端功能,如搜索和评论系统。不过,如果想给静态博客添加评论功能,也不是没有可能。这时候就必须使用第三方评论系统。

  什么是第三方评论系统?博客或 cms 系统通常由两部分组成:内容和评论。评论可以增加博主与用户之间的互动,也是博主传达思想和观点的一对多交流平台。所以除了社区平台,评论也成为了一般博客和cms系统的必备功能。大型网站自己开发评论系统和分享系统,一般中小网站自己开发评论系统,成本高。而且垃圾评论和非法关键词过滤比较困难,所以*敏*感*词*都有第三方评论系统。以下是一些曾经流行或现在流行的第三方评论系统。

  那么回到主题,市面上的第三方评论系统太多了,哪怕只有一两个宕机了,选择还是很多的。为什么要自己做一个?这不是造轮子吗?其实刚开始的时候,我话很多,心里也很高兴。突然有一天我说我挂了。没有办法。然后我选择了另一个,然后我将其更改为网易云。过了一会儿,网易云也死了。

  后来在网上搜了搜,发现居然有人用GitHub Issue做了一个评论系统。这无疑是一个非常好的想法,非常有创意。当然我也用过,但总觉得有点难看,和自己博客的主题不符。只用了两天,我就把它撤了。我打算自己做一个。就去做吧,程序员总喜欢造轮子。

  二、什么是 GitHub 问题

  如果你经常访问GitHub的童鞋,你应该知道这个功能。有人了解GitHub的问题功能,就像TODO列表一样。你可以把下一步想要完成的所有工作,比如功能添加、bug修复等,都写到一个issue里面,放在上面。它可以用作提醒或统一管理。此外,每个提交都可以有选择地与一个问题相关联。例如,通过在消息中添加 #n,它可以与第 n 个问题相关联。详情请参考知乎。其他人对“github问题”做了什么?”答案。而这个博客的评论数据存储issues仓库地址是,仓库里没有托管代码。总之,如果我想用github Issues做一个评论系统,我实际上是把数据存储在github issues .

  三、评论系统实现

  准备工作

  

  应用名称:您的站点名称;

  主页网址:您的网站主页链接;

  应用描述:站点描述;

  授权回调地址:GitHub授权成功后的返回地址

  创建成功后,会生成一个Client ID和一个Client Secret。

  GitHub 提供了很多方便第三方开发的API。当然,添加、删除、修改、检查github问题的API也在其中。有了这些API,你就可以执行各种技巧,比如我们现在要写的评论系统。此外,也有人怀疑我们是否应该“滥用”这些 API。不过我个人觉得GitHub既然提供了这些API,也就意味着把这些权限开放给大家,大家不要害怕“滥用”。那么,需要哪些API来满足我们目前的需求,下面就让我一一列举,以我的账号为例,jangdelong是Github名称,blog_comments是仓库名称。

  GET:获取所有问题信息

  GET:获取问题下的信息(11 是问题编号)

  GET: comments 获取问题下的评论

  GET:获取评论ID 111下的所有反应(反应包括[+1]、不喜欢[-1]、喜欢[心]等字段)

  POST:创建一个问题

  POST:在问题编号 11 下创建评论

  POST:在 ID 为 111 的评论下创建一个反应(例如*敏*感*词*)

  POST:markdown语法解析接口

  整体设计

  流程图:

   |--> 显示已登录

|--> 已登录 --> |--> 加载评论列表 --> 分页加载

| |--> 其他

| |--> 评论操作 --> 成功/失败 |

开始 --> GitHub 授权登录 ? --> | |--> 结束

| |--> 显示未登录 |

|--> 未登录 --> |--> 加载评论列表 --> 分页加载

|--> 其他

|--> 评论操作 --> 提示未登录状态

  效果图:

  

  因此,我们可以将评论系统分为列表(list)、评论框(box)、顶部登录状态栏(signbar)等部分。View部分的代码组织为:

  // 为了减少全局变量,整个网站就暴露一个全局变量 JELON

var JELON = JELON || {};

;(function (JL) {

...

JL.Renders = {

// 列表模块

list: {

tpl: ...,

...

},

// 评论框模块

box: {

tpl: ...,

...

},

// 顶部登录状态栏

signBar: {

tpl: ...,

...

},

... // 其他模块视图

};

...

})(JELON);

  将视图部分的代码整理好后,我们根据GitHub提供的各种API将其封装在Requests中,整理如下:

  // 为了减少全局变量,整个网站就暴露一个全局变量 JELON

var JELON = JELON || {};

;(function (JL) {

...

JL.Requests = {

// 根据 label 获取 issue 编号

getIssueNumberByLabel: function () { ... },

// 创建 issue

createIssue: function () { ... },

// 根据 issue 编号获取评论列表

getCommentListByIssueNumber: function () { ... },

// 根据评论 ID 获取 reactions (即点赞数据)

getReactionsByCommentId: function () { ... },

// markdown 解析

markdown: function () { ... },

// 通过 code 获取 access_token

getAccessToken: function () { ... },

// 利用 access_token 去获取 GitHub 用户信息

getUserInfo: function () { ... },

// 创建评论

createComment: function () { ... },

// 创建 reactions (点赞)

createReaction: function () { ... }

};

...

})(JELON);

  下一步是封装事件操作。我们将其封装到 Actions 中。代码组织如下:

  // 为了减少全局变量,整个网站就暴露一个全局变量 JELON

var JELON = JELON || {};

;(function (JL) {

...

JL.Actions = {

// 初始加载,如列表、登录状态等

init: function () { ... },

// 登出操作

signOut: function () { ... },

// 列表翻页跳转

pageJump: function () { ... },

// 编辑预览

editPreviewSwitch: function () { ... },

// 提交评论操作

postComment: function () { ... },

// 点赞操作

like: function () { ... }

};

...

})(JELON);

  程序入口:

  // 为了减少全局变量,整个网站就暴露一个全局变量 JELON

var JELON = JELON || {};

;(function (JL) {

...

JL.Comment = function (options) {

JL.options = options || {};

$('comments').innerHTML = [

this.Renders.signBar.tpl,

this.Renders.box.tpl,

this.Renders.tips,

this.Renders.list.tpl

].join('');

JL.Actions.init();

};

...

})(JELON);

  登录流程

  GitHub授权登录是必不可少的功能,登录后才能发表评论。 前面说过,GitHub授权登录遵循OAuth2.0标准。下面是OAuth2.0的操作流程,让我们更好的理解。

  

  那么,GitHub 授权登录是如何按照这个标准进行的呢?我们来简单介绍一下。如果想更详细的了解,也可以访问GitHub官方文档。

  用户发起重定向请求授权服务器换取code

  `GET http://github.com/login/oauth/authorize`

  拿到code后,用client_id、client_secret和code兑换token_access。(上面的准备工作中提到了client_id和client_secret)

  `POST https://github.com/login/oauth/access_token`

  获取token_access后,我们可以使用token_access获取登录用户的信息

  `GET https://api.github.com/user`

  经过以上3步,GitHub授权登录就完成了。

  四、如何使用评论系统

  介绍评论系统相关的css和js。引入相关样式和脚本后,在页面中添加以下代码:

  

JELON.Comment({

container: 'comments', // 评论框容器id或对象,留空是默认为 comments

label: '' || '', // 文章标签

owner: '', // GitHub application 创建者

repo: '', // issue 所在仓库名

clientId: '', // GitHub application client_id

clientSecret: '' // GitHub application client_secret

});

  由于这个评论系统要集成到个人主题中,所以应该配合hexo-theme-xups使用。hexo-theme-xups 的主题链接是最新的主题(带GitHub登录评论功能),后续会更新上来,当然以后会持续更新优化,欢迎多多star。五、遇到的问题

  主要遇到三个问题,一个是标签权限的创建,一个是跨域问题,一个是GitHub授权登录兼容性问题。

  创建标签权限问题(目前未解决)。标签是文章和issue之间的链接,因为我们需要使用标签来查询issue号,以便后续的流程可以继续。现在遇到的问题是,对于新的文章,只有自己账号(GitHub Application)的创建者才能创建带有标签的issue。参考GitHub界面(POST /repos/:owner/:repo/issues)文档,上面说了

  > Labels to associate with this issue. NOTE: Only users with push access can set labels for new issues. Labels are silently dropped otherwise.

  跨域问题(暂时解决)。主要目的是交换 token_access POST 的代码。这个接口是跨域的。临时解决办法是

  使用:///login/oauth/access_token 进行转发。看:。GitHub授权登录兼容性问题(暂未解决)。经过简单的测试,发现PC端的兼容性问题主要是一些旧版本的浏览器,包括一些旧版本的谷歌浏览器(版本号55.x.xxxx.xx);而移动端主要是UC浏览器,无法实现GitHub授权登录。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线