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'm nitoyon</wp:comment_content>
としていた。
まっとうな XML パーサーを使っていれば、'
はシングルクオートになるはずなのだが、インポート結果を見てみると、I&aposm nitoyon
となっていた・・・。
インポート後にコメントを編集はできるのだが、コメントの末尾に「(Edited by a moderator)」と表示されてしまう。これでは印象が悪いので、結局最初からやり直すことにした。
やりなおしすると、当然、1 日待たねばならない。
メールアドレスにやられる
メールアドレスの設定にも罠があった。仕様によると、
DISQUS - Custom XML Import Format
<wp:comment_author_email>
を手動で設定する場合はユーザーごとに一意になるようにしなければならない。そうしないと、同じ名前が表示されてしまう。
とある。
手動で設定せずに、空欄にしておけばよいと思っていた。英語圏のユーザーに限っていえばその通りだった。
空欄にした場合、ユーザー名から username@wordpress.disqus.net
のようなメールアドレスが生成されてインポートされる。ただ、ユーザー名が日本語全角文字のみだったときには、一律に none@wordpress.disqus.net
としてインポートされてしまう。
結果として、「日本語のみの名前のコメントは同じ名前が表示されてしまう」現象が発生した。これでは悲しすぎるので、スクリプトを改造して、必ず一意になるようなメールアドレスを割り振って XML を生成するようにした。
<wp:comment_id> にやられる
インポートを繰り返す場合は、<wp:comment_id>
の指定にも罠があった。
一度インポートしたあとに間違いを発見して、修正して XML をアップロードしても、過去にアップロードしたコメントと <wp:comment_id>
が重複していると、コメントが反映されない。
これを回避するために、ID の手前に a とか b とかをつけてアップロードを繰り返した。なんと面倒なことであるか。
まとめ
DISQUS のインポートは用意周到に。締め切りのあるケースではやりたくない作業である。