fix blog

Posted on By ᵇᵒ

前言

博客上线后,很久都没有折腾了,大约从一年前开始,陆续的访问统计功能失效,评论功能失效,背景音乐无法播放。
拖延了很久,直到最近部门聊天谈到博客,才突然决定动手修一修。

统计

统计功能使用的是 busuanzi(不蒜子) ,由于七牛强制过期 busuanzi 原来的域名,busuanzi 只能更换到新域名,导致了统计失效。 解决办法也很简单,还是以前的嵌入方案,将脚本中的老域名替换为新域名即可:

-  <script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>
+  <script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>

评论

评论使用的是 gitment,需要登录 github 账号。

object ProgressEvent

gitment 访问 github oauth 获取 github access token 的时候需要加 CORS header 进行跨域访问。通过 https://imsun.github.io/gitment/dist/gitment.browser.js 的代码可以看出 gitment 是通过作者自己搭建的一个服务来解决跨域访问,目前该服务网站证书过期,导致无法获取 token,从而无法登录评论。该问题参考 gitment issue

解决办法有二:

  • 浏览器信任网站
    很明显,该方法不具有实用性,评论者不可能知道登录前还得信任这么一个网站,即使知道也很繁琐。

  • gitment 作者将该跨域服务的源码进行了开源,可以利用开源代码自己搭建一个服务。
    这里偷了个懒,使用 issue 讨论里 shlyren 搭建的临时服务

Validation Failed

github issue label 有 50 个字符限制,超过长度则会报 Error: Valication Failed,该问题参考 gitment issue
最终解决方案参考了 issue 评论里的 heropoocywd 的解决思路,通过判断字符长度是否大于 50,若大于等于 50 则使用文章的 date(转换为 unix 时间戳)作为 label,小于 50 则继续使用原来默认的 window.location.href。这样的好处是完全兼容了那些长度没问题且已存在的正常评论。

<script>
  // https://github.com/imsun/gitment/issues/116#issuecomment-388001420
  // https://github.com/imsun/gitment/issues/116#issuecomment-414540375
  var id = window.location.href;
  if(id.length>=50){  // 兼容长度没问题且使用window.location.href已开通的评论
    id = String(+ new Date('2019-07-25 03:30:00 +0000'));
  }
  const gitment = new Gitment({
    id: id,
    owner: 'xxx',
    repo: 'xxx',
    oauth: {
      client_id: 'xxx',
      client_secret: 'xxx',
    },
    theme: myTheme,
  })
  gitment.render('gitment')
</script>

背景音乐

背景音乐使用的是网易云音乐的外链播放。出现背景音乐无法播放一般可能来自两个因素:

  • 云音乐某首歌曲的外链播放版权没了。
    国内对版权这块越来越重视了,这是经常发生的事儿。碰上这种情况只能把该曲子从背景音乐里撤掉。

  • 浏览器禁止自动播放

    • chrome
      • 方案一
        在浏览器输入 chrome://flags/#autoplay-policy,第一个选项 Autoplay policy 设置为 no user gesture is required。
        该方案有两个缺陷,一是 policy:autoplay 是试验性的 flag,在 chrome 76 上已被移除;二是该方案必须在每个用户端的浏览器上设置一遍。

      • 方案二
        在 BGM iframe 上增加属性 allow="autoplay",参考 Autoplay Policy Changes
        该方案存在的问题:chrome 76 及以上首次打开页面时无法自动播放,但是点击任一页面后即会自动播放。
        可以简单理解为,有了用户行为交互就获取了自动播放权限。哪怕是点击当前页面空白处也会获取自动播放权限,重新刷新一下页面便会开始自动播放。
        这就是 google 的设计意图,当前页面没有用户交互行为,那么不希望用户受到打扰;如果有了用户交互行为,说明用户注意力已集中在了当前页面,那么这个时候就允许自动播放了。

    • safari
      参考 Safari 浏览器使用手册