はてなダイアリーからWordPressへの移行の記録

Pocket

はてなダイアリーはデフォルトではてなブックっマークなどとも連携できるので
使っていてとても快適なWebサービスでした。
はてな記法やMediaWikiの記法に慣れるとHTMLタグをタイプするのが辛くなります。
というか、はてな記法がないと生きていけません。
ですが、私もサービスを提供する側なので、今後色々とソースからいじくれるようにWordPressに移行しました。

移行の仕方としては

  1. はてなダイアリーの管理画面からデータをMovableType形式でエクスポート
  2. はてなフォトライフの画像や自分のブログエントリへのリンクをWordPress用に書き換え
  3. はてなフォトライフの画像のダウンロード
  4. はてなダイアリーデータと画像をWordPress側にインポート、アップロード

これだけなのですが、一筋縄ではいきませんでした。結構こういう変換は時間のかかる作業です。
忘れないように記録しておきます(因みにはてなキーワードのリンク問題は発生しませんでした)。

エクスポートしたMovableType形式データの加工作業

はてなダイアリーからWordPressへの移行を参考に加工していきました。あと、こういうことする前にはバックアップしておきましょう。

1970年問題を解決する

「xx:xx:xx AM」形式のエントリと「00:xx:xx PM」形式のエントリがあると1970年にタイムスリップするらしいです。依然この問題は修正されていません
あと、昨日参考にしたはずのサイトはなぜかリンク切れになってました。なんでだろう・・・。

ネット上に転がっている適当なエディタを探してきて以下のような正規表現置換を行います。
私はEmEditorProを使いました。何気に便利ですよ、このエディタ。
検索したら53個もヒットしました。
これで「xx:xx:xx AM」形式問題は解決されました。

(d{1,2}:d{1,2}:d{1,2}) AM
$1

正規表現

次に、以下のように正規表現置換を行って「00:xx:xx PM」形式問題を解決します。1文字目に半角スペースが入ってるので注意

 0{1,2}(:d{1,2}:d{1,2} PM)
 01$1

はてなフォトライフへのリンクを削除する

エクスポートされたデータを見ると以下のような形式になってました。

<p><a href="http://f.hatena.ne.jp/wnoguchi/20110116034529" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/w/wnoguchi/20110116/20110116034529.png" alt="f:id:wnoguchi:20110116034529p:image" title="f:id:wnoguchi:20110116034529p:image" class="hatena-fotolife"></a></p>

以下のような正規表現置換を行います。78個もヒットしました。

<a href="http://f.hatena.ne.jp/.+><img src="(.*)".+></a>
<img src="$1" class="hatena-fotolife" />

はてなフォトライフの画像をダウンロード

エディタのgrep機能などを使って画像へのリンクをうまい具合に抽出します。

<img src=".*" class="hatena-fotolife" />

画像のURLリストが取得できたら次のRubyのスクリプトを走らせました。
ごめんなさい、バッチファイルとかシェルスクリプトでのリストの処理の仕方わからないのでRubyで書きました。

#!/usr/bin/env ruby
# download.rb

image_base_url = "http://cdn-ak.f.st-hatena.com/images/fotolife/w/wnoguchi/"

files = [
  "20101226/20101226180712.jpg",
  "20101226/20101226152710.jpg",
  "20101227/20101227231919.jpg",
  # ...
]

failed_file_list = []
success_count = 0
files.each do |img|
  print "#{img} "
  result = system "wget #{image_base_url}#{img}"

  failed_file_list << img unless result
  success_count += 1 if result
end

puts "--------------------------------------------------"
puts "download summary"
puts "All files: #{files.size}"
puts "Success: #{success_count}, Failed: #{failed_file_list.size}"
puts "Download failed files:"
failed_file_list.each do |f|
  puts f
end

実行結果はこんな感じになります。

...

20110517/20110517010259.png --2011-05-17 18:36:00--  http://cdn-ak.f.st-hatena.com/images/fotolife/w/wnoguchi/20110517/20110517010259.png
cdn-ak.f.st-hatena.com をDNSに問いあわせています... 210.161.174.145, 210.161.174.104
cdn-ak.f.st-hatena.com|210.161.174.145|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 37353 (36K) [image/png]
`20110517010259.png' に保存中

100%[======================================>] 37,353      --.-K/s   時間 0.1s  

2011-05-17 18:36:00 (348 KB/s) - `20110517010259.png' へ保存完了 [37353/37353]

20110517/20110517010300.png --2011-05-17 18:36:00--  http://cdn-ak.f.st-hatena.com/images/fotolife/w/wnoguchi/20110517/20110517010300.png
cdn-ak.f.st-hatena.com をDNSに問いあわせています... 210.161.174.104, 210.161.174.145
cdn-ak.f.st-hatena.com|210.161.174.104|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 91092 (89K) [image/png]
`20110517010300.png' に保存中

100%[======================================>] 91,092       522K/s   時間 0.2s  

2011-05-17 18:36:01 (522 KB/s) - `20110517010300.png' へ保存完了 [91092/91092]

--------------------------------------------------
download summary
All files: 78
Success: 78, Failed: 0
Download failed files:

画像のURLを修正

はてなフォトライフに向かっている画像URLを本番用に書き換えます。

自分のブログ内部へのリンクが貼ってあるやつを修正する

残念ながら、これは手動で直すしかありません。

おしまい

後は加工したはてなダイアリーのデータと画像ファイルをサーバに上げてあげればOKです。

あとはWordPress公式ドキュメントを参考にテーマのCSSの調整やプラグインの導入を行いました。
WordPress Codex 日本語版

投稿者紹介

株式会社ユニキャスト
私たちは、テクノロジに魅せられた個性あふれるメンバーによって構成された茨城県日立市に本社を構えるベンチャー企業です。
”テクノロジを通して「驚き」と「感動」を創造し、人々の「夢」と「笑顔」を支えます。” の経営理念をモットーに明るい未来を描き、ワクワクする企画提案を続けて参ります。

1件のコメント

  1. 私も、はてなダイアリープラスからの引っ越しを考えていたのですが結構ハードルが高いですよね…。現在月間のアクセスが10万を超えていますのでお金を払ってでもうまく引っ越ししたいぐらいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください