PB-100の宇宙の中の人
PBロッキーの日記

無料版ライブドアブログの全記事データをバックアップ、bloggerにインポートする方法

Livedoor ブログに書いてきたブログ記事400件を Blogger に移動するため、いろいろやってみました。

今回は、MovableType 形式で Livedoor ブログの記事を取得して Blogger にインポートすることができましたので、その過程をメモがてらご紹介します。

本記事の内容を実行する場合は、まずはテスト環境(稼動していない新しいブログ)で十分に検証を重ねた上で行ってください。

追記 ブログテンプレートを修正しました 11/08/05

日付がインポートした日の日付になってしまう記事ができてしまう。

また、それ以外のエントリーもそもそも正しい日付でインポートできない(9時間づれてしまう)問題に気付きブログテンプレートに以下の修正を行いました。

  • 日付を一旦世界標準時に直す
  • 0:00 PM は 12:00 PM とする

またブログへのトラックバックは、インポートできないためコメントととしてインポートするようにしておきました。

さらに便利な公告除去機能も付いていますが、無料ブログでの公告削除は規約違反のため、バックアップをエクスポートしたら速やかにもとのデザインに戻しておきましょう。

MovableType形式でLivedoorブログから記事をエクスポートする

無料版でMT形式エクスポートを得るためのアプリがリリースされています。しかしそれぞれに問題がありエクスポートを得ることができませんでした。

ライブドアリッパー
記事が欠ける、コメント・トラックバックが取得できない
LivedoorBlogRead
動かなかった… かりに動いても Feed を元にしているようなので50件以上以前の過去記事は取れないかも

MovableType形式出力用のブログテンプレートを使う

そこで、今回は以下のようなブログテンプレートを制作してみました。このテンプレートをあなたの Livedoor ブログに適用したうえで Blog のトップページを表示するとほぼMTエクスポート形式の表示になります。

このページを、全てを選択(Ctrl + A)してテキストエディタに貼り付ければ、(ほぼ)MTエクスポート形式が得られます。余分なテキストが前に入りますのでそこだけ削除します。

~.logなどといったファイル名で保存しておきましょう。また、テキストのエンコードは utf8 がよいと思います。(後で使用するMovableType2Bloggerにエンコードの制限があったような気がします。)

さらに、このテンプレートには記事とコメントの日付を自動でMT形式に変換する javascript がついているのですばらしいですね。(但し動作確認はFirefox3.6のみです)

ブログテンプレートの変更

ブログテンプレートの変更は、ブログ設定 > デザイン > デザインカスタマイズから行います。変更はトップページのみです。

また、ブログ設定 > 基本設定 > トップページの表示件数 から表示件数を最大の50件にします。

一度に表示できるのは50件まで

トップページに表示できる記事は最大で50件です。そこでページ最上部のナビゲーションをクリックして50件以降を表示します。。

ということで、記事の総数が多い場合、以上の作業を適宜繰り返すことになります。例えば、記事の総数が500件の場合作業は10回になります。

MovableType形式出力用のブログテンプレート(修正済み 11/08/05)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" id="ldblog-standard">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
  <title><$BlogTitle ESCAPE$></title>
  <style>
    textarea {
      border:    0;
      width:    100%;
      font-size:  10px;
      overflow:  hidden;
    }
    li {
      display:  inline-block;
    }
  </style>
</head>

<body>
  <div>
    <SetVar NavigatorRange>8</SetVar>
    <SetVar NavigatorFirstPageText> &lt;&lt; </SetVar>
    <SetVar NavigatorLastPageText> &gt;&gt; </SetVar>
    <SetVar NavigatorPrevPageText> &lt; </SetVar>
    <SetVar NavigatorNextPageText> &gt; </SetVar>
    <$IndexNavigator$>
  </div>
 <!-- Loop Start -->
  <IndexArticlesLoop>
    <div>
      <!-- <IfDateChanged></IfDateChanged> -->
      <!-- <a href="<$ArticlePermalink$>"></a> -->
      AUTHOR: YourName<br />
      TITLE: <$ArticleTitle ESCAPE$><br />
      STATUS: Publish<br />
      ALLOW COMMENTS: 1<br />
      CONVERT BREAKS: default<br />
      ALLOW PINGS: 1<br />
      PRIMARY CATEGORY: <IfArticleCategory1><$ArticleCategory1$></IfArticleCategory1><br />
      CATEGORY: <IfArticleCategory1><$ArticleCategory1$></IfArticleCategory1><IfArticleCategory2>,<$ArticleCategory2$></IfArticleCategory2><br />
      DATE: <b><$ArticleDateYear$>/<$ArticleDateMonth$>/<$ArticleDateDay$> <$ArticleDateHour$>:<$ArticleDateMinute$>:<$ArticleDateSecond$></b><br />
      -----<br />
      BODY:<br />
                  <textarea><$ArticleBody$></textarea><br />
      -----<br />
      EXTENDED BODY:<br />
                  <IfArticleBodyMore><textarea><$ArticleBodyMore$></textarea><br /></IfArticleBodyMore>
      -----<br />
      
      <CommentsLoop>
        COMMENT:<br />
        AUTHOR: <$CommentAuthor ESCAPE$><br />
        EMAIL: <$CommentEmail ESCAPE$><br />
        URL: <$CommentUrl$><br />
        DATE: <i><$CommentDateTime$></i><br />
        <textarea><$CommentBody$></textarea><br />
        -----<br />
      </CommentsLoop>
      <TrackBacksLoop>
        COMMENT:<br />
        AUTHOR: <$PingBlogName ESCAPE$><br />
                                EMAIL: <br />
        URL: <$PingBlogUrl$><br />
        DATE: <i><$PingDateTime$></i><br />
        <textarea><a href="<$PingBlogUrl$>"><$PingTitle$>|<$PingBlogName ESCAPE$></a><br /><$PingExcerpt$></textarea><br />
        -----<br />
      </TrackBacksLoop>
      <!-- <TrackBacksLoop>
        PING:<br />
        TITLE: <$PingTitle ESCAPE$><br />
        URL: <$PingBlogUrl$><br />
        IP: 127.0.0.1<br />
        BLOG NAME: <$PingBlogName ESCAPE$><br />
        DATE: <i><$PingDateTime$></i><br />
        <textarea><a href="<$PingBlogUrl$>"><$PingTitle$></a><br /><$PingExcerpt$></textarea><br />
        -----<br />
      </TrackBacksLoop> -->
      --------<br />
      <br />
      <br />
    <!-- <IfArticleRating><$ArticleRatingIcon$></IfArticleRating> -->
    </div>
  </IndexArticlesLoop><!-- Loop End -->

<script language="JavaScript" type="text/javascript">
  (function(){
    var bArray = document.getElementsByTagName('B');
    var l = bArray.length;
    var b, inner, d;
    for(var i=0; i<l; i++){
      b = bArray[ i];
      d = new Date( b.innerHTML);
      b.innerHTML = convertXX( d.getUTCMonth() +1) +'\/' +convertXX( d.getUTCDate()) +'\/' +d.getUTCFullYear() + ' ' +
        convert12( d.getUTCHours()) + ':' +convertXX( d.getUTCMinutes()) + ':' +convertXX( d.getUTCSeconds()) +
        ampm( d.getUTCHours());
    }

    var iArray = document.getElementsByTagName('I');
    var l = iArray.length;
    for(var i=0; i<l; i++){
      inner = iArray[ i].innerHTML;
      d = new Date( [
        inner.substring( 0, 4), '\/',
        inner.substring( 5, 7), '\/',
        inner.substring( 8, 10), ' ',
        inner.substring( 12, 14), ':',
        inner.substring( 15, 17), ':',
        '00'
      ].join( ''));
      iArray[ i].innerHTML = convertXX( d.getUTCMonth() +1) +'\/' +convertXX( d.getUTCDate()) +'\/' +d.getUTCFullYear() + ' ' +
        convert12( d.getUTCHours()) + ':' +convertXX( d.getUTCMinutes()) + ':' +convertXX( d.getUTCSeconds()) +
        ampm( d.getUTCHours());
    }
    
    var tArray = document.getElementsByTagName('TEXTAREA');
    l = tArray.length;
    var REG_ADS = /<div id="ad_rs"[^<]*?<\/div>/i;
  for( i=0; i<1; i++){
   inner = tArray[ i].innerHTML;
   tArray[ i].innerHTML = inner.replace( REG_ADS, '');
  }

  function convertXX( n){
   var str = '' + n;
   return str.length == 1 ? '0' + str : str;
  }
  function convert12( t){
   return convertXX( ( t > 12) ?  '' + (t -12) : ( t === 0 ? 12 : t));
  }
  function ampm( t){
   return ( t > 12) ? ' PM' : ' AM';
  }
  
  
  setTimeout(function(){
   var ad = document.getElementById('ad');
   if (ad) {
    ad.parentNode.removeChild(ad);
   }
   else {
    setTimeout(arguments.callee, 100);
   }
  }, 100);  
 })();
</script>

</body>
</html>

MovableType形式エクスポートファイルをBloggerに読み込ませてみる

本来なら、続いてブログ記事で使われている写真画像をダウンロードして、適宜にサーバに保存。その後にエクスポートファイルの写真のurlを新しいurlに置き換えなくてはなりません。

しかし、以上の作業を置いておいて、一度Bloggerに読み込んでみます。

この作業は、新しいBlogを作成して行いましょう。稼働中のブログの環境を破壊してしまったら大変です。

MovableType2BloggerでMT形式からAtom形式へ変換

MovableType形式からBloggerのxml形式への変換には、MovableType2Blogger という便利なWebアプリケーションがあります。

Bloggerへブログをインポート

このサービスで取得した xml ファイルを、Bloggerの管理画面の設定 > 基本 > ブログをインポート からアップロードします。

管理画面の記事一覧を表示すると、インポート済みの記事ができていますので、チェックをつけて公開にします。

追記

以下の問題は、テンプレートの修正で解消されています。Enjoy!

一部の記事で、日付が正しくない

一部の記事で、日付が正しくないことがあるみたいで、これは手動で設定します。僕の場合、一度のインポートで1~2件程度がインポートした日付で登録されてしまいました。

全ての記事がインポート時の日付になってしまう

また、以下のような問題も起きるみたいで、僕も実際に全ての記事の日付がインポート時(本日)のものになっていました。現在はほぼ問題ないため、MovableType2Bloggerに与えるMTエクスポート形式の日付がはじめのうちは正しくなかったためだと思います。

インポートした日付で間違いないです。むしろ、作成時の日付で反映することは、受け入れ側にとって、過去に遡ることになり、おかしなことになってしまいます。

この投稿に限らず、「ブログ」と「ホームページ」の区別がはっきりと認識されていないように思えます。「ブログ」は、各社ごとの機能に大差があり、引越すときは、今までのブログを捨てる覚悟でないと出来ません。

4コメント

さんのコメント...

WSOHです。
昨日はコメントありがとうございました。

・日付を一旦世界標準時に直す
・0:00 PM は 12:00 PM とする

の部分を詳しく教えて頂けないでしょうか?
この2点がわからず再度インポートしても
インポートしたままの日時になってしまいます;;

さんのコメント...

WSOHさん、こんばんわ。

再度インポートしても 全て の記事がインポートした日時のまま ということでしたら、
私の経験では(すいません、もう記憶があやふやですが)、
MT形式エクスポートのDATE:の部分のデータ形式が正しくなかったため、
MovableType2Bloggerで.xmlに変換したときに、変換をしたときの日付を自動で設定されていた、
というのが原因のように思います。

まずはお手元で、記事が一件~数件程度のダミーのMTエクスポート形式のデータを用意して、
MovableType2Bloggerで変換→bloggerへインポート を試されてはいかがでしょう?

その際には、記事の投稿日時の部分を以下のような形式にしてみてください。

DATE: 07/08/2008 05:00:36 AM



また、ご質問の件ですが以下のように考えています。

・日付を一旦世界標準時に直す
 これについては、ブログの投稿日時を世界標準時に直しておかないと、
 投稿日時が9時間(日付をまたぐ場合は日付も)ずれる、ということです。
 確かに投稿日時は正しくありませんが、インポート時の日時になってしまう問題とは
 別のこととなります。

・0:00 PM は 12:00 PM とする
 ブログの投稿日時を24時間表記から12時間表記に直す必要があるのですが、
 その際に 0時としてしまうと、これも不正なデータになってしまうようです。
 これは PM 0時台に書いた記事だけ、MovableType2Bloggerによって
 変換をしたときの日付を自動で設定されてしまった、のではないかと思っています。
 ○ DATE: 07/08/2008 12:30:36 PM
 × DATE: 07/08/2008 00:30:36 PM


以上で、WSOHさんのお困りの件は解決できるかと思います。
もし、うまくいきませんでしたら、新しい状況と併せて以下の件もお報せください。

1.MTエクスポート形式のファイルのほうのバックアップはまだ手元にありますか?
2.Livedoorブログはまだ削除しないで残していますか?
3.MT形式のエクスポートは、有料ブログの機能で行いましたか?それともライブドアリッパーなどのサービスやソフトを使いましたか?


それでは、うまくいきますことを祈っています。

さんのコメント...

ご丁寧にありがとうございます。
少しずつ試してみようと思います。

わざわざ、お時間を割いてコメント頂き
ありがとうございました。

さんのコメント...

ちなみに下記の件ですが
1.MTエクスポート形式のファイルのほうのバックアップはまだ手元にありますか?
2.Livedoorブログはまだ削除しないで残していますか?
3.MT形式のエクスポートは、有料ブログの機能で行いましたか?それともライブドアリッパーなどのサービスやソフトを使いましたか?

有料版ライブドアでエクスポートしました。
そしてそちらのデータはまだ残っております。

そして以前のデータは下書き(非公開)の状態で残しております。

再度pbrockyさんのBLOGをなぞってやり直してみようと思います。