文章最初发表于szhshp的第三边境研究所
转载请注明

关于博客评论

六月多说挂了,地球人都知道。

倡言、云跟帖、来必力都很烂,地球人都知道。

转Disqus的都是人才。

Disqus使用中遇到的问题

如果你常年写静态博客并且经常使用评论框,Disqus使用中你肯定会遇到一些问题,比如:

  1. 很难将其他平台的评论记录导入到Disqus
  2. 国内无法访问

第一个问题请参考之前的文章: Disqus评论框改造工程-"最近评论"的实现

迁移一般不成问题,不过国内访问依然是个大麻烦,于是这周我看了下使用反向代理实现Disqus国内访问的解决方案

Disqus国内访问

实现Disqus国内访问你需要几样东西:

  1. 你肯定要先有其他办法访问Disqus进行评论管理查看测试

    • 可以参考这篇文章( OmegaHosts-添加Hosts本该如此简单)修改Hosts访问Disqus
    • 当然很多地方集成的Hosts文件里面也已经有Disqus的IP了,也可以直接拿来用,反正Disqus的IP不会像Google一样经常改变
  2. 你需要一台服务器/VPS,你可以偷室友的/抢基友的/用公司的/偷学校的或者自己买,无论如何你需要一个可以操作的服务器

代理思路

目的是让所有用户都能看到评论框。

  • 首先GFW封锁了Disqus,一般网络无法访问。
  • 使用VPN/Hosts的用户打通了Disqus访问的路径
    • 但是没有使用VPN/Hosts的访客依然无法查看Disqus
  • 首先判断用户是否可以访问原生Disqus,如果可以,直接访问不做处理
  • 如果不行,这时我们创建一个代理,将所有用户的访问都Redirect到代理服务器
    • 当然我们需要让服务器可以直接访问Disqus
    • 可以购买国外的服务器或者在服务器上运行VPN
  • 如此可以实现让所有用户访问评论框

要实现这个功能,可以用现成的轮子: https://github.com/ciqulover/disqus-proxy

后端配置

  1. clone repo

         git clone https://github.com/ciqulover/disqus-proxy
    
  2. 安装依赖

         npm i --production
    // 或者
    yarn install --production
  3. 配置 server 目录下的config.js

        module.exports = {
// 服务端端口,需要与 disqus-proxy 前端设置一致
port: 5509,
// 你的 diqus secret key
api_secret: 'your secret key',
// 你的 disqus 名称,就是forum名称
username:'ciqu',
// 服务端 socks5 代理转发,便于在本地测试,生产环境通常为 null
socks5Proxy: null,
// 日志输出位置, 输出到文件或控制台 'file' | 'console'
log: 'console'
}

api secret key需要在Disqus的API页面申请
另外需要到Settings => Community 里开启访客评论

  1. 启动服务

         cd server
    node index.js

正常运行服务,关闭ssh的时候就会关闭服务器,因此可以考虑使用forever插件

前端配置

将build里面的几个文件夹放到自己项目路径,修改对应引用路径:

      <*div id="disqus_proxy_thread"><*/div>
<*div id="disqus_thread"><*/div>
<*script>
window.disqusProxy = {
username:'szhshp', --同样是Forum名字
server: '123.123.123.321', --这里是服务器IP
port: 3000,
defaultAvatar: '/img/default-avatar.png', --默认头像
adminAvatar: '/img/admin-avatar.png', --自己的头像
identifier: window.location.href --就是辨识符这样的东西,一般是用当前url
};
window.disqus_config = function () {
this.page.url = window.location.href;
this.page.identifier = window.location.href;
};
var s = document.createElement('script');
s.src = '/static/js/main.0d0338ae.js';
s.async = true;
document.body.appendChild(s);
<*/script>
<*link rel="stylesheet" href="/static/css/main.0603c539.css">

配置完成后,访问对应页面,如果当前网络状况无法访问Disqus,则会显示一个精简版的评论框,这个评论框仅支持添加匿名评论。

如果可以访问Disqus,就会显示原生Disqus评论框。

好,代理搭建完成,但是这还没有完成,还存在几个问题

Trouble Shooting

This application cannot create posts on the chosen forum

这个问题看了我两天

原来代码里面其实存在一个大问题,最大的问题就是一切配置正常的情况下,无法添加新的评论

对应的Post报错:This application cannot create posts on the chosen forum

这个很是奇怪,添加新评论将会通过Http.Post到 create.json前后端交互的一切逻辑都符合官方API的需求,但是偏偏就是无法添加新的匿名评论。

调查许久后,发现有一个key有些特殊:Post到create.json这个接口的时候对应的API_Key 是一个固定的值,而不是自己的Public Key或者Secret Key,这一点可以通过自己添加一个新的评论然后抓包证实。

同时很多文章也提到了这个问题(虽然没有feedback但是这儿是正确答案):Creating an anonymous post with disqus API fails

因此,将上面轮子里面的一个螺丝钉换一下即可:将post的其中一个参数改为固定值:

        router.post('/api/createComment', async function (ctx) {
logger.info('Create comment: ' + JSON.stringify(ctx.request.body))
let result
try {
result = await rq(Object.assign(req, {
url: 'https://disqus.com/api/3.0/posts/create.json',
method: 'POST',
form: Object.assign(ctx.request.body, {
api_key: 'E8Uh5l5fHZ6gD8U3KycjAIAk46f68Zw7C6eW8WSjZvCLXebZ7p0r1yrYDrLilk2F' //就是这儿!!!之前用的是public key!!!!!!
}),
json: true
}))
} catch (e) {
logger.error('Error when create comment:' + JSON.stringify(e.error))
ctx.body = e.error
return
}
ctx.body = result
logger.info('Create comment successfully with response code: ' + result.code)
})

关于这个问题,有可能是Disqus方面后期修改的,导致原始代码无法创建新评论。

最终改造

Fix之后,我还修改了一些前端Style:

最终的repo在这儿: https://github.com/szhielelp/disqus-proxy

这下终于可以让所有人在我博客评论了

参考文献

Disqus-Proxy 配置说明

Disqus评论框改造工程-Jekyll等静态博客实现Disqus代理访问的更多相关文章

  1. MWeb 1.4 新功能介绍一:引入文件夹到 MWeb 中管理,支持 Octpress、Jekyll 等静态博客拖拽插入图片和实时预览

    之前在 MWeb 中打开非文档库中的 Markdown 文档,如果文档中有引用到本机图片,是没办法在 MWeb 中显示出来和预览的.这是因为 Apple 规定在 Mac App Store(MAS) ...

  2. 利用github webhook 结合openresty自动更新静态博客

    使用hexo在github pages上弄了一个静态博客,后来觉得访问有点慢,于是放到自己vps上. 对于静态博客的部署非常简单,本来就是html,js,css等静态文件,只要nginx上配置下目录就 ...

  3. Github、Jekyll 搭建及优化静态博客方法指南

    尝试自己写 Blog 的人,一般会经历三个阶段. 第一阶段,刚接触 Blog,觉得很新鲜,试着选择一个免费空间来写. 第二阶段,发现免费空间限制太多,就自己购买域名和空间,搭建独立博客. 第三阶段,觉 ...

  4. 【一】Ubuntu14.04+Jekyll+Github Pages搭建静态博客

    本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...

  5. Jekyll搭建个人博客-拓展版

    关于Jekyll Jekyll 是一个简单的博客形态的静态站点生产机器.它有一个模版目录,其中包含原始文本格式的文档,通过 Markdown (或者 Textile) 以及 Liquid 转化成一个完 ...

  6. 使用GitHub Pages+Jekyll搭建个人博客

    GitHub Pages 免费无限容量的站点数据托管工具(国内访问速度较慢),内置Jekyll服务,能将特定名称的代码仓库动态编译为静态网页 Jekyll 基于Ruby的静态网页生成系统,采用模板将M ...

  7. MWeb 1.4 新功能介绍二:静态博客功能增强

    MWeb 比较有特色的是一键生成静态博客功能,然后从 MWeb 最开始规划要做静态博客生成功能时,我就希望 MWeb 的静态博客生成功能在易用的同时,还要有很强大的扩展性. 比如说能自己增加网站公告, ...

  8. Hexo搭建Github静态博客

    1. 环境环境 1.1 安装Git 请参考[1] 1.2 安装node.js 下载:http://nodejs.org/download/ 可以下载 node-v0.10.33-x64.msi 安装时 ...

  9. hexo搭建静态博客

    1. 环境环境 1.1 安装Git 请参考[1] 1.2 安装node.js 下载:http://nodejs.org/download/ 可以下载 node-v0.10.33-x64.msi 安装时 ...

随机推荐

  1. 阿里云esc云服务器IP不能访问的解决办法

    问题:阿里云服务器,专有网络,web设置完毕,在服务器中localhost能够访问,并且关闭防火墙,但是使用公网ip无法访问. 解决:找到本实例安全组,配置规则,按照要求填入80或其他端口.配置完成后 ...

  2. Beego开源项目 收藏

    官方收藏的项目 集成开发平台:基于 Golang 的快速开发平台,平台已经集成权限管理,菜单资源管理,域管理,角色管理,用户管理,组织架构管理,操作日志管理等等 OPMS - 是一款项目管理 + OA ...

  3. 使用HTML5和CSS3碎语

    当我们使用HTML5, CSS3,甚至Bootstrap设计网站的时候,有些方面是必须考虑的,比如字体大小,标题大小,行间距,每行字数,字体,颜色,背景图片和文字的搭配,图标,留白和布局......所 ...

  4. Delphi数学运算当中四舍五入的问题

    在最近版本的Delphi Pascal 编译器中,Round 函数是以 CPU 的 FPU (浮点部件) 处理器为基础的.这种处理器采用了所谓的 "银行家舍入法",即对中间值 (如 ...

  5. RichEdit控件 SDK 参考手册

    RichEdit控件 SDK 参考手册 摘要: 本文对Rich Edit控件底层消息机制进行了讲解,以期读者对Windows平台下的Rich Edit控件有一个更深入的认识,同时对于使用Win32 S ...

  6. could not connect to server: Connection refused (0x0000274D/10061)

    Oracle Linux 6.8 PostgreSQL Server IP: 192.168.10.220 Windows 7 x64 pgAdmin Custom Port IP: 192.168. ...

  7. AIDL interface XXX should be declared in a file

    在写AIDL的时候出现了interface XXX should be declared in a file, 错误...经过反复查看,发现AIDL规定,文件名必须和interface XXX名字相同 ...

  8. Linux学习14-ab报错apr_pollset_poll: The timeout specified has expired (70007)

    前言 使用ab压力测试时候出现报错apr_pollset_poll: The timeout specified has expired (70007),本篇总结了几个ab常见的报错和对应解决办法 当 ...

  9. java List集合记录 ArrayList和LinkedList的区别

    一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问 ...

  10. Android之关于MAC把java7改为java6的方法

    先来个草草草,某天手贱有java6升级为java7了,然后用ant打包发布,然后再一次草草草,居然有冲突勒,网上找了一堆...无果,最后想起直接在.bash_profile上配置环境试试吧,居然通了, ...