トップ  >  趣味の部屋  >  XOOPSサイト構築  >  インポートScript  >  習作:MT形式のd3blogインポート

習作:MT形式のd3blogインポート

user なーお datetime 2008/6/29 14:40 update 2010/5/2 15:37 views 30258

Movable Type形式の d3blogインポート-ver0.5 anchor.png

 Movable Type 形式のブログデータを、d3blogにインポートしようと考えました。 私の場合は、niftyの「ココログ」でエクスポートしたMT形式データのインポートになります。

 いきなり本番環境で実行せず、必ずテスト環境で試してから実行してください

1、参考: MovableTypeのデータをWordPressに移行したい。(のぶのぶXOOPS) anchor.png

 xoopsモジュールでこの手のインポートが出来るブログモジュールとしてはwordpressMEがありまして、上記参考サイトからphpソースをダウンロードしてテストサイトでインポートまで行ってみたところ、これは見事にできました。

 また、既にインポート済みのデータは上書きしないようになっているなど、運用中のwordpressMEへの追加インポートを考慮しているのが、ユーザーに優しいところですね。

  なお、今回のphpソースは上記参考サイトのソースを元に、d3blogのソースを参考に手を入れて書いたものです。インポート済み記事やコメント、ト ラックバックなどは同様にスキップするようにしています。 ただ、コードの中身は使用メソッドがSQL文だったり、xoops_objectだったり一環 性がありませんがご容赦を。

2、d3blogインポートの制約 anchor.png

 MT形式(ver3)データをd3blogに取り込む場合、以下の制約があります。

  1. MT形式(ver3)のコメントがタイトル無くスレッド構造でない制約   元々のMT形式テキストデータが、タイトルもスレッド構造を持ちません。 xoopsコメントにインポートする際には、最初のコメントのタイトルを (Re:投稿タイトル)として親コメントと扱い、以降のコメントをその親コメントへ繋げ、(Re^2)、(Re^3)・・ とすることとしています。
  1. xoopsコメントを使う制約   d3blogでは、標準コメントシステムの「xoopsコメント」を使っています。 それ自体はOKなのですが、このコメントシステムにはゲスト投稿者の 「名前」入力欄が無く、元を辿るとDBに「cname」などというフィールドさえ無い、という最大の問題を抱えています。

 WordPressMEの場合は、モジュール側でコメント用のDBテーブルを持っていたため、問題ありませんでした。

 この問題をクリアする方法として、以下の2つの方法が考えられます。

    1. d3forumのコメント統合を使う

 スクリプト中の以下の部分を編集し、d3blogのコメント統合設定を正しく行います。

$use_d3forum_comment = false; // コメントをd3forumに直接取り込む場合、true
    1. xoopsコメントのままで、何とかする

 要は、MTデータの投稿者名を何とか表示すればよいのです。 今回は、本文の冒頭に、「名前 wrote:」 と追加する安直な方法にしました。

  1. d3blogで記事カテゴリを複数選択できない制約

 ちょっと困ったことに、d3blogでは記事カテゴリを複数選択できません。 つまり、Movable Type形式の記事ではいくつか列挙されているカテゴリの一つしか保持できないことになります。

 今回は、これまた安直に、成り行きで一つだけを生かす方式にしました。 多分、MT形式データの各記事の一番最後に書かれているカテゴリが有効になると思いますが、もしかしたらそうならないかも知れません。

3、インポートの準備 anchor.png

(1)xoops_trust_path/modules/d3blog/main/import-mt.php anchor.png

fileimport_0.5.zip ver 0.5(EUC-JP)

 解凍したファイルの

  • 3行目にMT形式ファイルのフルパスを加筆し、
  • 4行目にMT形式ファイルの文字コードを(2008-7-13修正)。
  • 5行目にxoopsのデータベースの文字コードを記載。
  • Biglobeの場合は、7行目を$biglobemode = true;に変更。

ファイル名「import-mt.php」でtrust側のd3blog/mainフォルダに保存します。(本ファイルはEUC-JPで保存されていますが、運用サイトの文字コードに合せて変換保存して下さい。)

 なお、セキュリティの関係上、ファイル名は変更することをお勧めします。

(2010/05/02変更)

 元のブログやMT形式データによっては、改行がHTMLの場合やただの改行の場合など、様々なようです。

この場合、元のMT形式ファイルから設定を読み込みますが、万一うまくいかない場合は、スクリプト475行目付近に設定がありますので、必要に応じて編集します。

自動改行を有効にする場合はこの「dobr」オプションを「1」にします。

472
473
474
475
476
477
478
479
480
481
482
    $entry->setVar('cid', 1);     $entry->setVar('dohtml', 1);     $entry->setVar('dobr', 1);     $entry->setVar('doxcode', 1);     $entry->setVar('doimage', 1);     $entry->setVar('groups', '|0|');

にしてやってみてください。

なお、HTMLを無効にする場合は、上記 'dohtml' を「0」に変更します。

(2)xoops_trust_path/modules/d3blog/xxxx.txt anchor.png

 MT形式のテキストデータを、d3blog フォルダに置きます。 テキストデータ内の記事の投稿者名と、インポートするxoopsのユーザー名が合致する場合のみ、インポートされます。 もし、 ユーザー名が変わる場合は、テキストデータの投稿者名部分(AUTHOR: ○○)を予めすべて置き換えておく必要があります。

 既知の不具合として、ファイル最初の1件目のデータを読み取れません。 お手数ですが、テキストファイルの1件目のデータをコピーし、2件目に挿入したテキストファイルを作ってください。 記事選択の際には、2件目のほうを選択してください。

(3)テンプレート _custom_mt2_d3blog.html anchor.png

Altsysの「テンプレート管理」-「カスタムテンプレート」で、以下のコードを「_custom_mt2_d3blog.html」として作成します。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<h2>mt形式ログ > d3blogインポート</h2>
 
<h3>STEP:<{$mt2d3b_step}></h3>
 
あなたのuid=<{$mt2d3b_uid}> 
 
<{if $mt2d3b_isadmin}>実行権限:OK
 
    <form name="MainForm" action="./index.php?page=<{$mt2d3b_actionname}>" method="post">
 
  <{if $mt2d3b_step==0}>
 
    <{if $mt2d3b_mtfile != ""}>
 
        <p>こんにちは! あなたの Movable Type 記事を d3blogへインポートします。 <br>
 
        (カテゴリは、1つしか読み込まれません。)
 
         インポート作業は、少々時間がかかる場合があります。</p>
 
        <p>また、インポートする記事毎に、ユーザー名が一致するかチェックを行い、該当ユーザー名がDBに無い時はインポートを行いませんので、ご注意を。 一旦取り込んだ記事やコメント・トラックバックと重複データの場合は、インポートをスキップして次の記事のインポートを継続します。</p>
 
        <p>一度にインポートする記事件数:
 
        <select name="d3b_once">
 
                <option value="20" <{if $mt2d3b_once ==20}>selected=true<{/if}>>20件</option>
 
                <option value="50" <{if $mt2d3b_once ==50}>selected=true<{/if}>>50件</option>
 
                <option value="100" <{if $mt2d3b_once ==100}>selected=true<{/if}>>100件</option>
 
                <option value="200" <{if $mt2d3b_once ==200}>selected=true<{/if}>>200件</option>
 
                <option value="500" <{if $mt2d3b_once ==500}>selected=true<{/if}>>500件</option>
 
        </select></p>
 
 
 
    <{if ( $mt2d3b_use_d3comment ) }>
 
        <font color=red>コメントのインポート先に、d3forumコメント統合が選択されています。</font><br />
 
        d3forumのdirectoy名称 = <{$mt2d3b_d3com_agent}><br />
 
        d3forumの名称 (forumid) = <{$mt2d3b_d3com_forum_title}> (<{$mt2d3b_d3com_forumid}>)<br />
 
        間違えなければ、「実行」。 変更したい場合はd3blogの一般設定と、このスクリプトファイルの設定を変更して下さい。<br />
 
    <{/if}>
 
 
 
     <{else}>
 
        <p><font color="red">MT形式ファイルのパスが正しく設定されていません。</font></p>
 
         (<code><{$mt2d3b_actionname}></code>) を開いて、どのファイルから読み込むか1行編集してください。</p>
 
        <p><code>define('MTEXPORT', '');</code></p>
 
        <p>これを、下のように(但し実際のファイルのフルパスに)編集します。</p>
 
        <p><code>define('MTEXPORT', '/full/path/to/your/import.txt');</code></p>
 
        <p>この作業は、セキュリティの観点から手動で行う必要があります。</p>
 
    <{/if}>
 
  <{elseif $mt2d3b_step==1}>
 
        全<{$posts_total}>件から、<{$mt2d3b_once}>件づつインポートします。<br />
 
        以下の中から選択した記事・コメント・トラックバックをインポートします。<br />
 
        <table class="outer">
 
        <tbody border="1"><tr><th align="center">選択<br /><input type='checkbox' title='この縦一列のチェックボックスすべてをON/OFFします' onclick="with(document.MainForm){for(i=0;i<length;i++){if(elements[i].type=='checkbox'&&elements[i].name.indexOf('mt2d3b_thread')>=0){elements[i].checked=this.checked;}}}" />全選択/解除</th>
 
        <th align="center">No</th><th align="center">タイトル</th><th align="center">投稿日時</th></tr>
 
        <{foreach key=num item=thread from=$mt2d3b_threads}>
 
        <tr class="<{cycle values='odd,even'}>"><td align="center"><input type="checkbox" name="mt2d3b_thread[<{$num}>]" value="<{$thread.thread_id}>" /></td><td align="right"><{$thread.thread_id}></td><td><{$thread.title}></td><td align="center"><{$thread.post_time|date_format:"%Y年%m月%d日 %H時%M分"}></td></tr>
 
        <{/foreach}>
 
        </table>
 
        よろしければ「送信」してください。<br />
 
    <input type=hidden name="forum_title" value=<{$mt2d3b_forum_title}> />
 
    <input type=hidden name="forum_id" value=<{$mt2d3b_forum_id}> />
 
    <input type=hidden name="wf_topic_id" value=<{$mt2d3b_wf_topic_id}> />
 
    <input type=hidden name="wf_fileid" value=<{$mt2d3b_file_id}> />
 
    <input type=hidden name="d3b_once" value=<{$mt2d3b_once}> /><br />
 
  <{elseif $mt2d3b_step==2}>
 
        <{foreach key=num item=echo_log from=$mt2d3b_echo_log}>
 
        <{$echo_log}><br />
 
        <{/foreach}>
 
        インポートが完了しました。<br />
 
        最初のページに戻るには下のボタンで送信してください。<br />
 
    <input type=hidden name="d3b_once" value=<{$mt2d3b_once}> /><br />
 
  <{/if}>
 
    <input type=hidden name="page" value="<{$mt2d3b_actionname}>" />
 
    <input type=hidden name="step" value="<{$mt2d3b_step_next}>" />
 
    <input type=hidden name="d3b_start" value=<{$mt2d3b_start}> /><br />
 
    <input type=submit value="送信" />
 
    </form>
 
<br />
 
<{else}>
 
実行権限:NG
 
権限がありません。
 
<{/if}>

4、インポートの実行 anchor.png

  1. 管理者でログインする
  1. STEP0:xoops_root_path/modules/(d3blog)/index.php?page=import-mtにアクセスする。

 (d3blog)の部分はインストールフォルダ名に変更します。

    • 「一度にインポートする記事件数」を選択します。

 大量の記事を一度にインポートすると、メモリ不足になったりサーバーに負荷をかけてしまいます。通常は50~100件程度に抑えて実行してゆくことをお勧めします。

    • コメントにd3forumコメント統合が選択されている場合は、フォーラム名称とforum_idを確認します。
    • 「送信」ボタンを押します。
step0.gif
  1. STEP1:取り込む記事にチェックを入れて「送信」ボタンを押す。
    • 全記事一度に取り込む場合は、全選択/解除チェックを活用してください。

 記事数にもよりますが、かなりの時間がかかる場合があります。

step1.gif
  1. STEP2:結果を確認する。
    • インポートした記事群のbid値、タイトルが表示されます。
    • 「送信」を押すと、STEP0に戻り、選択した記事数の次回分のインポートに進みます。
    • 別ウインドウを開くなどして、インポート状態を確認します。

 d3blogの各記事のカテゴリーは1つしか選べないため、後で記事毎にカテゴリを選択しなおす必要があります。

step2.gif
  1. ファイルを削除する

5、開発環境 anchor.png

 以下の環境で確認しました。 他の環境では動作しない場合もあるかもしれません、ご容赦下さい。

  • CentOS-5.4 + Apache-2.2.3
  • php 5.1.6
  • mysql 5.0.77
  • Xoops Cube Legacy 2.1.6 および HD1.0.3
  • d3blog 1.03
  • エクスポート元ブログ:ココログ、Biglobe(ウエブリブログ)

6、改変履歴 anchor.png

  • 10年5月 2日 ver0.5 カスタムテンプレート方式に変更し記事単位で取り込み指定が可能に。 また、html側ファイル不要とした。
  • 09年5月 4日 スクリプトの配布を、zip形式に変更。
  • 09年4月13日 ver0.4 コメントのd3forum統合コメントへの直接インポートに対応。
  • 08年7月13日 ver0.3 文字コード指定部分が間違っていたので、修正した。
  • 08年7月 5日 ver0.2 インポートファイルの文字コード指定部分を冒頭に変更した。
  • 08年6月29日 ver0.1 公開

7、ライセンス anchor.png

 ライセンス:GPL

8、バグレポート anchor.png

 バグを発見した方は、コメントでお知らせください。 また、自分でも目をそむけたくなるくらいの汚いソースです。 セキュリティーホールなど、発見された方もどうぞお知らせいただくか、改善案をご教示いただければ幸いです。


実体ページ:inc/import_mt2d3blog

コメント一覧

投稿ツリー

トピック


nonn50  投稿日時 2009/5/2 1:03

おはようございます。
御教示いただき、ありがとうございます。

しかし、脳軟化症の爺は「リッチエディタ」も「FCKediter」も用いず、もっぱらxpWikiヘルパーを利用しています。
(xpWikiヘルパーの不満足なところは、HTMLダグを利用できないことですが、これはこれとして割り切って利用しています。)

小生のメモには教えていただきましたページへのリンクを加えさせていただきましたが、当面は改造する予定はありません。

悪しからず、御理解ください。

八郎   投稿日時 2009/5/2 11:08

おおおおお!!trust_path is OK!表示されました。嬉しい!
なーおさま、こんばんは!

質問になっていないような質問に色々とお答え頂きありがとうございます(^_^;)

これはもう、4で決まりですよね?
もちろん、短縮ハックのコードを自前で用意など出来るはずもなく、
WEBで公開されているものを使わせていただいているのですが
一応、ソースは以下のようになっています。

八郎   投稿日時 2009/5/2 11:35 | 最終変更

すみません。どうやっても上手くソースが貼り付けられなかったので
取り急ぎキャプチャーしてみました(^_^;)
filehttp://blog-imgs-40.fc2.com/s/a/i/sainaraa/87_20090502192433.jpg

お教え頂いたtrust側のコメントアウト、今から挑戦してみます!

なーお  投稿日時 2009/5/2 12:21 | 最終変更

八郎さん、こんばんは。

引用:
これはもう、4で決まりですよね?

いえ、trust側のスクリプトの問題の可能性が高くなりました。

スクリプトが正しくダウンロードできていないのではないか、という心配もありますので、以下にzipファイルにした ver0.3とver0.4のファイルを貼っておきます。 今までと同様に、必要箇所の編集をしてからアップして下さい。

  • [添付]
  • [添付]
八郎   投稿日時 2009/5/4 15:53

なーおさま、ありがとうございました!
仰られたとおり、どうやらソースファイルのダウンロード失敗が原因だったようです ;(
(失敗?したときの手順は、リンク先にジャンプしてソースを全選択コピー、新規テキストファイルを作成してそこにペーストでした。)

0.3zipと0.4zipを試してみましたが、mainfile.php内のURL短縮ハックをコメントアウトしないままの状態で、双方ともでフォームを表示することが出来ました(^_^;)。

そこでさっそく「実行」してみたのですが、やはり1200件を一度にというわけには行かないようで…。再び真っ白になりました(笑)
ところが、ブログを覗いてみると不思議なことに1?104番目までの記事が :-o
そこで、100件ずつ分割してトライすればイケるだろうと考え、その結果なんとか370件まで完了しました。この先はメモリー不足なせいか、xxx.txtの記事数を50まで減らして実行を押しても完全な真っ白状態でインポートも全く進行しなくなりました。(思えばエントリーのタイトルにa hrefタグを入れたり、無茶苦茶やっていたので仕方ない気もします) :oops:
でも、これだけインポートが出来てしまえば私としましては大満足なので、一応最後にWarningが出ておりましたことだけご報告させて頂きます。
filehttp://blog-imgs-40.fc2.com/s/a/i/sainaraa/88_20090504233835.jpg
この度は素晴らしいソースとご指導を頂き本当にありがとうございました。

と、言いつつもう一度だけ見に参ります(・∀・)

なーお  投稿日時 2009/5/5 2:26 | 最終変更

八郎さん、こんにちは。

そうですか、スクリプト自体は大丈夫だったようですね。
もっと早く気づくべきでした。 :-(
これを機会に、zipファイルでダウンロードする方法に変更しました。

ところで、370件めから先がインポートできないとのことですが、確かにメモリリミットに引っかかりやすいので、あり得ますね。

一時的にメモリリミットを変更するか、、

それから、もしかすると記事のほうに問題があったり相性が悪い場合は、提示いただいた画像のようなNoticeが出る場合があった気がします。 その記事の100件なり50件なりを飛ばして、次の塊のファイルを実行するとインポートできたりするかもしれません。

あとは、TMさんの使ったこの方法
http://www.naaon.com/modules/d3forum/index.php?topic_id=210#post_id666
を試してみるかですね。 PHPMyadminを使う必要がありますし、コメントの紐付けが少し心配ですが。。

(追記)
なお、当分先になると思いますが、カスタムテンプレートを使った方法に変更し、内容も見直したいと考えています。 その際に、メモリ不足を回避するような実装もできたらいいなと思っています。 具体的には、ファイルを一度にメモリ読み込まず、1行ずつスキャンしていく方法です。 その上で、取り込み記事数を(例えば50件づつなど)指定して、その件数分づつメモリに取り込んでインポートし、次の50件に移るという方法です。

八郎   投稿日時 2009/5/7 18:21

なーおさま、こんばんは!
今さらながら、このスクリプトの完璧なインポートぶりに驚いております。
当方、エクスポートもインポートも生まれて初めてなうえに、初陣がこのXCLなので、もしも途中で失敗して壊れたら全部削除して改めて手写しというのも覚悟していたのですが、インポートした370件中の最新と最古のエントリー各50件ほどずつ読んでみた限り問題一つ出ませんでした。一安心です(^^)
PHPMyadminはXCLが何らかのエラーで画面真っ白から立ち直れなくなった場合以外は恐ろしくて手を付けられないです(^_^;)

引用:
(追記)
なお、当分先になると思いますが、カスタムテンプレートを使った方法に変更し、内容も見直したいと考えています。 その際に、メモリ不足を回避するような実装もできたらいいなと思っています。 具体的には、ファイルを一度にメモリ読み込まず、1行ずつスキャンしていく方法です。 その上で、取り込み記事数を(例えば50件づつなど)指定して、その件数分づつメモリに取り込んでインポートし、次の50件に移るという方法です。

おおっ、嬉しい朗報です!完成された際には是非そちらで再挑戦させて頂ければと思います!

この度は色々とご指導頂きまして本当にありがとうございました :-)
それでは、失礼します。

SHIGE  投稿日時 2009/5/16 17:57 | 最終変更

 d3fofumへのインポートではお世話になりました。

 さて、ブログもWPMeから、d3blogに乗り換えていたので、さっそく、過去ログをインポートしてみました。

 WPMeから、なーおさんのスクリプトで、MT形式にエクスポーとして、そこから、d3blogにインポートしました。実行ボタンも表れ、瞬時に完了しましたが、確認すると、改行が全くなくなっています。

 WPMeで
引用:
 ああああああああああ
ああああああああああ
 
 いいいいいいいいいい
いいいいいいいいいい
だったものが、d3blogでは、
引用:
 ああああああああああああああああああああ いいいいいいいいいいいいいいいいいいいい

となります。

 これを回避する方法はあるでしょうか。

環境は
SUKURAレンタルサーバースタンダード
PHP: 5.2.8
MySQL: 4.0.27
XOOPS Cube Legacy 2.1.6a
WPMe 0.50RC最終版
D#blog HD 1.03
です。よろしくお願いします。

なーお  投稿日時 2009/5/17 0:06

SHIGEさん、こんにちは。 :-)

d3ブログインポートもお試しいただけて、ありがとうございます。

解説にも書いてなくて申しわけありません。(追記しておきます)

引用:
SHIGEさんは書きました:
 WPMeから、なーおさんのスクリプトで、MT形式にエクスポーとして、そこから、d3blogにインポートしました。実行ボタンも表れ、瞬時に完了しましたが、確認すると、改行が全くなくなっています。

おそらく、元のブログのエクスポートでHTMLではなかったか、あるいはMT形式に吐き出すときに、HTMLの改行(<br>)を普通の改行に変換しているか、どちらかの形式だと推測します。

この場合、d3blog側で改行を有効にすればOKと思います。

280
281
282
283
284
285
    $entry->setVar('cid', 1);    $entry->setVar('dohtml', 1);    $entry->setVar('dobr', 0);    $entry->setVar('doxcode', 1);    $entry->setVar('doimage', 1);    $entry->setVar('groups', '|0|');

を、

280
281
282
283
284
285
    $entry->setVar('cid', 1);    $entry->setVar('dohtml', 1);    $entry->setVar('dobr', 1);    $entry->setVar('doxcode', 1);    $entry->setVar('doimage', 1);    $entry->setVar('groups', '|0|');

にしてやってみてください。
なお、HTMLを無効にする場合は、上記 'dohtml' を「0」に変更すればOKです。

よろしくお願いします。 :-)

SHIGE  投稿日時 2009/5/17 4:01

 なーおさん、返信ありがとうございました。

 先ほど、dobrオプションを変更したら、うまくいきました。サイトが、どんどんスッキリしていきます。本当にありがとうございます。



新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ