2009.01.10

MovableType

MovableType コメントを DISQUS に置き換えて Facebook Connect 対応

DISQUS LOGO

DISQUS はブログのコメント部分を外部サービスとして提供するサービスです。通常の「名前、メールアドレス、URL」でのコメント投稿とともに、DISQUS アカウントでのログインと Facebook Connect でのログインに対応しています。おそらく今後は OpenID にも対応するでしょう。

Facebook Connect OpenID

MovableType や WordPress 用のプラグインも用意されていて、プラグインを導入するだけで自動的に DISQUS を利用するようになるという優れものです。またこのブログでは現在利用していませんが、トラックバックにも対応しています。

さらに通常の Web ページにもスクリプト1つでコメント機能を追加できるので、僕はいままで GitHub 上の Wiki などで DISQUS を使っていました。

今回のデザインリニューアルに伴って、このブログでもコメント機能を DISQUS に移行することにしました。

このブログでは、いままで MovableType のコメント&トラックバックシステムを利用していましたが、以下のような問題がありました。

MovableType のコメント機能の問題点

スパムコメント&トラックバック

MovableType にも強力なスパム対策が施されていますが、どうしてもスパムのアクセスで負荷が急上昇することが多いです。特に毎回スパム判定をするために CGI が立ち上がるので、たちの悪いスパムに大量のアクセスを送られると、WordPress で運営しているブログで 500 エラーが出たりしていました。

コメント投稿完了ページだけ別ドメイン

matake.jp ではこのブログ以外にいくつか MovableType のブログが運営されていて、コメント投稿完了ページのドメインだけが blog.matake.jp ではなく matake.jp になっていたため、その部分だけにクロスドメインの問題がありました。

再構築の負荷

MT4.2 にしてからは再構築のスピードが数倍にあがりましたが、やはりコメント投稿後即公開にすると、コメント完了までに再構築が走って待ち時間がありました。これを解決するプラグインなどもありますが、あまり使いやすいものではありませんでした。

DISQUS を利用することで、これらの問題を一気に解決できます。

DISQUS を window.onload で読み込む

DISQUS もたまに極端にレスポンスが悪くなる(10秒とか...)ことがあるので、window.onload での読み込みにしておいた方がいいと思います。DISQUS は CSS の書き出しに document.write を利用していて、そのままでは window.onload で呼び出すことができません。しかし、以下のようにスクリプトを読み込む前に window.disqus_no_style を有効にすることで、document.write は利用されなくなり、window.onload でのスクリプト読み込みが可能になります。

<script type="text/javascript">
window.disqus_no_style = 1;
</script>

このブログでは、記事ごとのコメントフォームおよびコメント数読み込み用のスクリプト呼び出しは以下のようにしています。

function include_js(url) {
  var script = document.createElement('script');
  script.src = url;
  script.setAttribute('type', 'text/javascript');
  document.getElementsByTagName('head')[0].appendChild( script );
}
function loadDisqusCommentCount() {
  var links = document.getElementsByTagName('a');
  var query = '?';
  for(var i = 0; i < links.length; i++) {
    if(links[i].href.indexOf('#disqus_thread') >= 0) {
      query += 'url' + i + '=' + encodeURIComponent(links[i].href) + '&';
    }
  }
  include_js("http://disqus.com/forums/kyomichi/get_num_replies.js" + query);
}
window.onload = function() {
  loadDisqusCommentCount();
  window.disqus_no_style = 1;
  include_js("http://disqus.com/forums/kyomichi/embed.js");
}