DISQUS へのコメントのインポートが意外に面倒

更新期間が開いてしまったが、ブログの移転計画を少しずつ進めている。

おおよその過去記事の表示は問題なくなったところであり、もう間もなく移転できるところまで来ているんだけど、コメント欄の移行で手間取っている。

新生ブログのコメント欄には DISQUS を採用することを検討している。DISQUS はコメント欄の請負サービスとしては最大手だろう。英語圏では CNN や Time、MLB.com などが、日本では TechCrunch JAPAN などが採用している。

アカウント登録して、JavaScript を貼り付けるだけで高機能なコメント欄ができあがるので、気軽で便利なのである。

インポートの戦略

ただ、今回は既存のブログがあるので、「JavaScript を貼って、はい、終わり」とはいかない。

過去のコメントをインポートしたいのである。

幸い、DISQUS にはインポート機能がある。WordPress や Blogger、MovableType からのインポートはもちろん、特定の XML フォーマットに従ってコメントを抽出すれば、任意のサービスからのインポートも可能になっている。

なるほど、これを使えば一件落着、と思って手を出してみた。


今回のインポート元は

  • 日本語ブログ: はてなダイアリー
  • 英語ブログ: MovableType 3.33

の2つ。

MovableType については DISQUS 側でエクスポートのためのプラグインが用意されている。しかし、よく見てみると MovableType 4.X 用しか用意されていない。3.33 でも動くのかもしれないが、MovableType が面倒になって移転しようとしているので、このためだけにプラグインを入れたり、バージョンアップしたりはしたくない。

一方、はてなダイアリーは MovableType 形式でのエクスポート機能がある。

ということは、両方のブログから MovableType のフォーマットでコメントを吐き出すことはできる。

あとは「MovableType のフォーマット → DISQUS インポート フォーマットへの変換スクリプト」を書けば、両方のブログから DISQUS にインポートできるはずだ。

インポート 待ち時間の罠

そんなわけで、せっせとスクリプトを書いた。ただし、MovableType フォーマットには URL が含まれていないので、手動で XML に追記した。英語ブログには 2 つの記事にしかコメントがついてないので、まずはこれでよい。日本語ブログをインポートするときには、自動化で悩むことにする。

ためしにインポートしてみたら、

Imports may take up to 24 hours to complete.

と表示される。日本語訳すると「インポート作業は 24 時間かかるかもしれないよ」。

さすがにそんなにかかるわけはないだろう、と思ったものの、実際に 1 日ぐらいかかった。さらに、Importer に遅れが生じていときには、1 日以上待たされることもあった。

アップロードして、結果が分かるのが 1 日後なのである。XML にミスがあって、インポートに失敗した場合には

  • 1 日目: アップロード
  • 2 日目: うまくいってなかったことが分かる。修正してアップロード
  • 3 日目: 成功していたことが分かる

と、わずか 1 ミスで 3 日かかってしまうのだ・・・。

ちなみに、自分のインポートの進捗状況は http://import.disqus.com、サービス全体 Importer の動作状況は http://status.disqus.com で確認できるようになっている。

何度か繰り返していると、運がいいと数分以内にインポートが終了したが、やはり 1 日待たなければならないこともある。Importer の調子次第のようだ。

コメント フォーマットの CDATA にやられる

XML の作成については、基本的に DISQUS - Custom XML Import Format に従えばいい。

たとえばコメント本文は

  <!-- comment body; use cdata; html allowed (though will be formatted to DISQUS specs) -->
  <wp:comment_content><![CDATA[Hello world]]></wp:comment_content>

のような形式で書くことになっている。

仕様を読んだつもりであったのだが「CDATA を使え」を見逃していた。

つまり、本当は CDATA を使って

  <wp:comment_content><![CDATA[I'm nitoyon]]></wp:comment_content>

と書くべきところを、

  <wp:comment_content>I&apos;m nitoyon</wp:comment_content>

としていた。

まっとうな XML パーサーを使っていれば、&apos; はシングルクオートになるはずなのだが、インポート結果を見てみると、I&aposm nitoyon となっていた・・・。

インポート後にコメントを編集はできるのだが、コメントの末尾に「(Edited by a moderator)」と表示されてしまう。これでは印象が悪いので、結局最初からやり直すことにした。

やりなおしすると、当然、1 日待たねばならない。

メールアドレスにやられる

メールアドレスの設定にも罠があった。仕様によると、

<wp:comment_author_email> を手動で設定する場合はユーザーごとに一意になるようにしなければならない。そうしないと、同じ名前が表示されてしまう。

DISQUS - Custom XML Import Format

とある。

手動で設定せずに、空欄にしておけばよいと思っていた。英語圏のユーザーに限っていえばその通りだった。

空欄にした場合、ユーザー名から username@wordpress.disqus.net のようなメールアドレスが生成されてインポートされる。ただ、ユーザー名が日本語全角文字のみだったときには、一律に none@wordpress.disqus.net としてインポートされてしまう。

結果として、「日本語のみの名前のコメントは同じ名前が表示されてしまう」現象が発生した。これでは悲しすぎるので、スクリプトを改造して、必ず一意になるようなメールアドレスを割り振って XML を生成するようにした。

<wp:comment_id> にやられる

インポートを繰り返す場合は、<wp:comment_id> の指定にも罠があった。

一度インポートしたあとに間違いを発見して、修正して XML をアップロードしても、過去にアップロードしたコメントと <wp:comment_id> が重複していると、コメントが反映されない。

これを回避するために、ID の手前に a とか b とかをつけてアップロードを繰り返した。なんと面倒なことであるか。

まとめ

DISQUS のインポートは用意周到に。締め切りのあるケースではやりたくない作業である。