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

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

 Movable Type 形式のブログデータを、d3blogにインポートしようと考えました。 私の場合は、niftyの「ココログ」でエクスポートしたMT形式データのインポートになります。
 いきなり本番環境で実行せず、必ずテスト環境で試してから実行してください

1、参考: MovableTypeのデータをWordPressに移行したい。(のぶのぶXOOPSanchor.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)・・ とすることとしています。
  2. xoopsコメントを使う制約   d3blogでは、標準コメントシステムの「xoopsコメント」を使っています。 それ自体はOKなのですが、このコメントシステムにはゲスト投稿者の 「名前」入力欄が無く、元を辿るとDBに「cname」などというフィールドさえ無い、という最大の問題を抱えています。
     WordPressMEの場合は、モジュール側でコメント用のDBテーブルを持っていたため、問題ありませんでした。

     この問題をクリアする方法として、以下の2つの方法が考えられます。
    1. d3forumのコメント統合を使う
       スクリプト中の以下の部分を編集し、d3blogのコメント統合設定を正しく行います。
      $use_d3forum_comment = false; // コメントをd3forumに直接取り込む場合、true
    2. xoopsコメントのままで、何とかする
       要は、MTデータの投稿者名を何とか表示すればよいのです。 今回は、本文の冒頭に、「名前 wrote:」 と追加する安直な方法にしました。
  3. 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
    $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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<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. 管理者でログインする
  2. STEP0:xoops_root_path/modules/(d3blog)/index.php?page=import-mtにアクセスする。
     (d3blog)の部分はインストールフォルダ名に変更します。
    • 「一度にインポートする記事件数」を選択します。
       大量の記事を一度にインポートすると、メモリ不足になったりサーバーに負荷をかけてしまいます。通常は50~100件程度に抑えて実行してゆくことをお勧めします。
    • コメントにd3forumコメント統合が選択されている場合は、フォーラム名称とforum_idを確認します。
    • 「送信」ボタンを押します。
      step0.gif
  3. STEP1:取り込む記事にチェックを入れて「送信」ボタンを押す。
    • 全記事一度に取り込む場合は、全選択/解除チェックを活用してください。
       記事数にもよりますが、かなりの時間がかかる場合があります。
      step1.gif
  4. STEP2:結果を確認する。
    • インポートした記事群のbid値、タイトルが表示されます。
    • 「送信」を押すと、STEP0に戻り、選択した記事数の次回分のインポートに進みます。
    • 別ウインドウを開くなどして、インポート状態を確認します。
       d3blogの各記事のカテゴリーは1つしか選べないため、後で記事毎にカテゴリを選択しなおす必要があります。
      step2.gif
  5. ファイルを削除する

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

プリンタ用画面
投票数:131 平均点:5.65
カテゴリートップ
インポートScript
次
習作:MT形式のd3diaryインポート

コメント一覧

投稿ツリー

トピック


nonn50  投稿日時 2009/4/25 10:12

おはようございます。

FC2ブログ形式のデータ(400件以下)インポートしようとしましたが、http://hogehoge/modules/d3blog(hogehoge)/import.phpにて、以下のエラーが発生し、できません。

引用:

The file you specified does not seem to exist. Please check the path you've given.

対応策を御教授いただきたく、よろしく御願いします。

実施したこと

  • (1)xoops_trust_path/modules/d3blog/import.php
引用:

ダウンロードして使用する ver 0.4(EUC-JP)

から、DLLしたファイルの↑のコードの5行目にMT形式ファイルのフルパスを、以下により加筆し、trust側のd3blogフォルダに保存しました。

1
2
3
4
5
6
<?php
require '../../mainfile.php' ;
if( ! defined( 'XOOPS_TRUST_PATH' ) ) die( 'set XOOPS_TRUST_PATH in mainfile.php' ) ;
 
define('MTEXPORT', 'http://hogehoge/xoops_trust_path/modules/d3blog(hogehoge)/hogehoge.txt'); // ←ここにMT形式ファイルのフルパスを記載
define('MTDBCODE', 'EUC-JP'); // ←ここにDBの文字コードを記載
    • なお、当方のXOOPSの環境及びFC2ブログ形式のデータは、両方とも EUC-JP の文字コードのため、他については特にさわっていません。
  • (2)xoops_trust_path/modules/d3blog/xxxx.txt
    • FC2ブログのテキストデータを、trust側のd3blogフォルダに置きました。
    • この際、FC2ブログのテキストデータの投稿者名部分(AUTHOR: ○○)を、xoops上の小生のユーザー名に置き換え澄みです。
  • (3)xoops_root_path/modules/d3blog/import.php
    • こちらで説明されているものを何もしない状態で、ファイル名「import.php」でhtml側のd3blogフォルダに保存しました。

以降は

1.管理者でログインする
2.http://hogehoge/modules/d3blog(hogehoge)/import.phpにアクセスする
3.「実行」ボタンを押して、処理を行うと、前記のエラーが出現します。

引用:

The file you specified does not seem to exist. Please check the path you've given.

この際、PHPディバッグエラーは何もありません。

なーお  投稿日時 2009/4/25 21:15

nonn50さん

「ファイルのフルパス」ですので、URLではありません。
あくまで「ファイルのフルパス」を指定してください。 :-)

nonn50  投稿日時 2009/4/26 8:02

おはようございます。

おかげさまをもち、FC2ブログからインポートすることができました :-D

カティゴリーを含め、完璧です。

ありがとうございました。

なーお  投稿日時 2009/4/26 8:32 | 最終変更

nonn50さん

インポート成功、おめでとうございます。
拝見させていただきました。 問題点が2点ほどありそうな。 :roll:

  1. 改行が効いていない? ・・ 元のHTMLのエクスポートで改行を取り去る設定などになっていなかったでしょうか。 FC2使ってないのでわかりませんが。 d3blogインポート済み記事ごとに「改行を自動で挿入」設定を入れて解決するかな?
  2. コメントの取り込み ・・ d3forumコメント統合への直接取り込みを試していただきましたか? XOOPSコメントからd3forumへの取り込みを行うと、過去のd3forum記事が(たぶん)統合設定された当該forum内の記事が全て飛びますので要注意、直接取り込みをお勧めします。 blog記事は消さずにスクリプト内のコメント統合設定部分を変更して、再度実行すればコメント部分だけ追加でd3forumに取り込まれるはずです。 :-)
nonn50  投稿日時 2009/4/26 10:10
引用:

1.改行が効いていない?

引用:

2.コメントの取り込み

いずれも、手作業で実行する所存です。

インポート作業が、こんなに簡単に実現するとは思っていなかったので

aachan サイトURL  投稿日時 2009/4/29 15:24

今までは引っ越しのたびに手作業で書き写していたのですが。。。
今回サイトの再構築にあたり、こちらを見つけてso-net blogからホダ塾版のHD内のd3blogにインポートを試してみました。

先に一応同じ名前のカテゴリー枠は作ってあったのですが、インポートしたらきちんとその各カテゴリーに割り振られたのでびっくりしました。 :-o

blogのエディタ設定がFCKeditorになっていると、改行されませんが、デフォルトに設定しなおすときちんと改行も含まれた形で表示されるので、
そのまま「編集」を開いて「改行を自動挿入する」にチェックいれてポンと送信するだけで、あれよあれよと言う間にきちんと表示されていきます。

以下は私の何か設定ミスかもしれませんが。
d3forumコメント統合への直接取り込みで、内容を書き換えてインポートしたところ、ブロックの最近のコメントにも表示されて、コメントカウントも入っているのに表示されませんでした。
リンクはあるのに、クリックしてもでてこない。。。どこに行ってしまったのだろうか??
と思って、d3forumの方の設定を覗いてみたら「XOOPSコメントのインポート」に数値が入っているのを発見!
インポートでそのままきれいにおさまりました(^^)

forumもblogもディレクトリ名をかえているので、そのへんで何か通らないところがあったのかもしれませんね。

とにかく順調に無事取り込みがさっくりとできて非常に感謝しております。サイトの方はまだまだ組み立て途中で見苦しいですが(^^;)
本当にすばらしいソースをありがとうございました。

なーお  投稿日時 2009/4/29 16:51 | 最終変更

aachanさん

お役に立てたようで、嬉しいです。 :-)

d3forumへの直接インポートは、8行目の

$use_d3forum_comment = false; // コメントをd3forumに直接取り込む場合、true

を = true; に編集する必要があるのですが、そうされましたか?

もししていないようでしたら、上記変更して、

$update_d3com_post = false ;

も = true; にした上で、新たなforumに対してもう一度インポートをすれば、ゲスト名もインポートされるはずです。 :-D
(もちろん、そのフォーラムに対してd3blog側のコメント統合設定を行ってから実行です。)

なーお  投稿日時 2009/4/30 15:25 | 最終変更
引用:

追伸:今きづきましたが、この返信用フォームでは、右下に「リッチエディタ」、左上に「FCKediter」のボタンがでるんですね。面白?い :-D

これに関しては、以下に記事を書いていますので、よろしければどうぞ。

FCKeditorとwikiレンダラーの選択環境

八郎   投稿日時 2009/5/2 5:04

ご返信遅れまして申し訳ございません。
あれから色々と試してみたのですが、なかなか実行ボタンの表示までこぎつけません。
これだけ手間取って単なるファイルの配置場所ミスとかでしたらお恥ずかしい限りです…(^_^;)
なーおさま、ご回答ありがとうございます(^_^)

以下、試してみたことなどを少々書かせて頂きます。
1、「デバックモード、常時オン」です。import.phpアクセスで何も表示されません(^_^;)
2、「trust側import.phpのパスの記述を間違えている可能性」も考えたのですが、当該部位にURLを記述した上で実行してエラーになったとの書き込みがこのスレッドに報告されておりましたので、フルパスの記述ミスというのは”import.phpにアクセスで真っ白”には関係無いように思います。
3、「/d3blog/を/hoge/に変更している」ので、ソース内のd3blogという文字列の書き換えが必要なのかも…。と、import.phpのソースと散々にらめっこしたのですが、素人目にも変更が必要とは思えませんでした(-_-;)
4、「URL(/modules/)短縮ハック」。これも、当該ブログのURLには適用していないので関係ないように思うのですが…。mainfile.phpの短縮ハックの記述を完全コメントアウトした状態でアクセスを試したわけではないので、実際どうなるかはわかりません。
5、「c_templateも何度か全消し」してアクセスしてみましたが、関係ないようでした(-_-;)
6、「xoops_trust_path/../../hoge.txtは1200記事以上あるファイル」なのでmainfile.phpにアクセスした瞬間から当該ファイルを裏で読み込むような動作をするとしたら、もしかしたらメモリ不足に?これはもう空想ですw
7、「バージョン0.4でも変化なし」でした。
8、単なる誤読の可能性(;・∀・)

今のところ、上記4を実際に試してダメなようでしたらPHPのバージョンの問題と思い、諦めるしか無いように思っています。
それと、悪戯心で(1)と(3)のimport.phpのファイル配置場所を逆にしてアクセスしてみたくて仕方ありません。なぜ、フォームの記述がある方がtrust側になって、フォームの記述がないほうがroot側の直接アクセス先になるんだろうという疑問が…。ただ、余計なことをして、もしも障害がでてしまったら自己解決できるレベルの物ではないので出来ませんが(^_^;)

試したら、また書き込ませて頂きますね。

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

八郎さん、こんにちは。

  • どうも4、の「URL短縮ハック」は気になりますが、いずれにしても問題を切り分けたいので、現状のtrust側のスクリプトを、試しに以下のように単純化したメッセージのみに書き換えてみていただけますか。
    1
    2
    3
    
    <?php
    echo("trust_path is OK");
    ?>
    これでこの文字が表示されれば、trust側のスクリプト内の問題を探せばよいことになります。
  • また、「URL短縮ハック」の中身を開示いただけませんでしょうか。
  • 6、の件は、アクセスした段階ではファイルは読み込みませんので、これは違いますね。。
    引用:
    なぜ、フォームの記述がある方がtrust側になって、フォームの記述がないほうがroot側の直接アクセス先になるんだろうという疑問が…。

という件については、trust側のスクリプトはroot側のスクリプトでrequireされているため、root側で実行されているのと同じ扱いになります。 (スクリプト内には潜在的な問題は潜んでいるかもしれません。)

  • ひとつ可能性を見つけました。
    trust側のスクリプトの、最初の
    1
    
    require '../../mainfile.php' ;
    この行はroot側で読み込まれていますので、だぶってFATALエラーになっている可能性があります。 この行をコメントアウトしてみていただけますか。 ;-)


新しくコメントをつける

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

ブックマーク