え〜、先日知人よりエキサイトブログを WordPress に移したいんだけど、ちょびっとの予算でやってくれないですか?と声をかけていただいた。
ぶっちゃけ仕事って金額ではなかったので、移行プログラムを書いてそれをブログで公開してもよいのであれば、その金額でやらせてもらってもいいですが、いかがでしょう?と訪ねた所、快諾いただいたのでやらせていただくことにしたのですが、これがまたエライことになってしまいました。
最終的には出来たのですが、手作業をするところが多くてかなり苦労しまして・・・今回のエントリーはその苦労話と、作ったプログラムソースの公開となります。
タイトルにもありますが、正直言ってエキサイトブログと心中する気がなければ、すぐにでも WordPress に移行した方がいいです。
正直なめてました

photo credit: brianjmatis via photopin cc
いや〜正直なめてました。エキサイトブログ。
PHPでソケット使ってリンクを辿り巡回させて値を抜き出せばいいやなんて軽く思っていましたが、エキサイトブログも必死。実にいやらしい。こんなことするんだ〜ってね。
PHP ソケットでは抜けない
まあ、これはそんなにいやらしくないでしょう。PHP ソケットでは抜けないようになっていました。ユーザーエージェントとか色々と書き出しすればそれなりに抜けたのでしょうが、開発するのが面倒くさくなって「巡集」ってアプリをダウンロードして使いました。
この巡集を使ってバリバリやっていただこうと始めたのですが・・・「巡回が拒否されました」なんてエラーになる。
Google 先生に色々と聞いてみると「<meta name=”robots” content=”INDEX,NOFOLLOW” />」なるメタがあると、律儀に巡回をやめてしまいます。
バイナリエディタで巡集をいじる
仕方がないので、プログラムのソースをいじる事に。
バイナリエディタなるものをダウンロードし、巡集に書かれている「<meta name=”robots” content=”INDEX,NOFOLLOW” />」の「robots」を「robott」などにして、文字をマッチさせないように作り替えます。
これで今度はばっちりだべ。てな事で「いけ!巡集!エキサイトブログ引っこ抜いてこい!」と・・・
しばらくぐるぐると回っていただきました。
えぇ〜〜〜っ!そうなぉ〜!いやらしいぃ〜
巡回して集めてきたのですが、何かがおかしい?何となく・・・肝心の記事データがない・・・え?どうして?
月のアーカイブをみると「<a href=””>記事タイトル</a>」となっている。
え?記事へのリンク書かれてないじゃん。そりゃ巡回できないよね・・・でも、どうして書かれてないのか?遅いPCを使うと、記事タイトルにリンクつくのがワンテンポ遅れている。なんと・・・ JavaScript で後から URL を入れているって事?
ブログのバックアップは出来ないわ、巡回ツール使っても巡回させないように URL を JavaScript で出したりして・・・
ほかにも同じようなサービスあるのかもしれないけど、秋田的には、エキサイトブログは沢山記事書いても自分用にバックアップする事が出来ない、自分の資産にならないかもしれないから使うべきじゃない。って結論ですね。
これ、Google AdSense プログラム ポリシーに抵触しているんじゃないか?と思うのは秋田だけでしょうか・・・
AdSense ネットワークは一般向けと見なされています。そのため、ポルノ、アダルト、または成人向けのコンテンツを含むサイトに Google 広告を掲載することは許可されません。サイトのコンテンツの中に職場の人や家族の目に触れると困るような内容がある場合、そのサイトは Google 広告の掲載に適さない可能性があります。また、アダルト コンテンツのページに検索向け AdSense(AFS)の検索ボックスを設置することも許可されません。
子供:ねえパパ、どうしてパパのブログサービスはバックアップが出来ないの?
パパ:それはね、ブログの記事を独り占めにして、書いた本人にも渡したくないからだよ。
なんて・・・言えないよなぁ〜俺ならば。
仕方ないので、URLを手で取得
今回2000位の記事があったので、めっちゃ大変だったのですが仕方ありません。やると言ったらやります。とにかく記事の URL を入手し巡集ちゃんに HTML ファイルを集めてきてもらわなければなりません。
幸いな事に、月のアーカイブがあったので、月のアーカイブを一つ一つブラウザで開き、記事 URLを取得しました。
流石に時間のかかる仕事なので、パートさんにお願いして取得。この時点でギャラはロハです・・・(涙)
パートさんに集めてもらった URL を使って巡集ちゃんに HTML ファイルを取得してもらい、
ブログタイトル
┝ブログID
┃┗ index.html
┝ブログID
┃┗ index.html
上記の形式で、めでたく全記事をローカルに落とし込む事が出来ました。
どうしても抜け落ちてしまう記事は、ブラウザでアクセスしソースを index.html として保存します。これもかなり手間だった。
取得してきた記事を WordPress にインポートできるデータへ
ローカルに持ってきたデータを WordPress がインポート出来る形式にして書き出します。
<?php
//ファイルが入っているディレクトリのパス
$filePath = "";
$filePath = "/Users/user/xxx/xxx/expdata/";
$filename = "index.html";
//wprdpress イメージディレクトリまでのパス
$wpimag = "/wp-content/uploads/eximage/";
//ファイルのリスト取得
$filelists = array();
$filelists = getfilelists($filePath);
//データの取得〜調理
gettxtdata($filelists,$filePath,$filename,$wpimag);
function gettxtdata($filelists,$filePath,$filename,$wpimag){
$cnt = 0;
$exparray = array();
foreach($filelists as $name => $value){
$cnt++;
$gettxt = "";
$gettitile = "";
$gettime = "";
$getcate = "";
$discription = "";
//echo "\n".$filePath.$value."/".$filename."\n";
$gettxt = file_get_contents($filePath.$value."/".$filename);
//echo $gettxt;
//タイトル
$gettitile = getPageTitle( $gettxt );
//日付
$gettime = getPageTime( $gettxt );
//カテゴリ
$getcate = getPageCate( $gettxt );
//本文
$discription = getPageDiscri( $gettxt ,$wpimag);
//イメージファイル
$expimg = "";
$expimgtext = $gettxt;
//画像パスを抜き出し
if ( preg_match_all( "/<img (.*?)>/i", $expimgtext, $matches) ) {
$expimgarray = $matches;
foreach($expimgarray as $name => $value){
foreach($value as $n => $v){
if(preg_match( "/pds\.exblog\.jp/i", $v)){
//echo "[".$v."]\n";
//イメージ文
$fp = fopen(dirname(__FILE__)."/image.txt", "a");
fwrite($fp, $v."\n");
fclose($fp);
}
}
}
}
$text = "";
$text .= "TITLE: ".$gettitile."\n";
$text .= "PRIMARY CATEGORY: ".$getcate."\n";
$text .= "DATE: ".$gettime."\n";
$text .= "STATUS: Publish\n";
$text .= "-----\n";
$text .= "BODY:\n";
$text .= $discription."\n";
$text .= "--------\n";
$text = mb_convert_encoding($text, "UTF-8", "auto");
$exparray[] = array('time'=>$gettime, 'text'=>$text);
echo "[".$cnt."]\n";
//die();
}
//時間でソートする
foreach($exparray as $key => $row){
$time[$key] = $row["time"];
}
array_multisort($time,SORT_ASC,$exparray);
//print_r($exparray);
$exptxt = "";
foreach($exparray as $name => $value){
$exptxt .= $value['text'];
}
$fp = fopen(dirname(__FILE__)."/inport.txt", "a");
fwrite($fp, $exptxt);
fclose($fp);
}
//本文の抜き出し
function getPageDiscri( $html ,$wpimag) {
//preg_match( "/<div class\=\"POST_BODY\">(.*?)<\/div>/i", $html, $matches);
//echo "[";
//print_r($matches);
//echo "]";
if ( preg_match( "/<\!\-\- interest_match_relevant_zone_start \-\->(.*?)<br class\=\"clear\"\/>/s", $html, $matches) ) {
//<div class\=\"POST_BODY\">
//<br class="clear"/>
//<div class\=\"POST_BODY\">(.*?)<\/div>
//<title>(.*?)<\/title>
//<div class\=\"POST_BODY\">(.*?)<\/div>
$rtn = "";
$rtn = $matches[1];
$rtn = str_replace("../../pds.exblog.jp/", $wpimag , $rtn);
$rtn = str_replace(" class=\"IMAGE_MID\"", "", $rtn);
$rtn = str_replace("</a></center>", "</center>", $rtn);
$rtn = preg_replace('/<(.*)style\=\"outline\:none\;\">/i', '', $rtn);
return $rtn;
//return "aaaa";
} else {
return false;
}
}
//カテゴリの抜き出し
function getPageCate( $html ) {
if ( preg_match( "/<div class\=\"POST_TAIL\" align\=\"right\">(.*?)<\/div>/i", $html, $matches) ) {
//<title>(.*?)<\/title>
$tmp = strip_tags($matches[1]);
$tmp_array = preg_split("/\|/",$tmp);
//echo $tmp."\n";
//echo "[".$tmp_array[2]."]";
//echo $tmp_array;
//print_r($tmp_array);
if (trim($tmp_array[2])){
return trim($tmp_array[2]);
}else{
return "未分類";
}
} else {
return false;
}
}
//日付の抜き出し
function getPageTime( $html ) {
if ( preg_match( "/<SPAN CLASS\=TIME>(.*?)<\/SPAN> \| (.*?)<\/SPAN>/i", $html, $matches) ) {
//<title>(.*?)<\/title>
return strip_tags($matches[2]);
} else {
return false;
}
}
//タイトルの抜き出し
function getPageTitle( $html ) {
if ( preg_match( "/<meta property\=\"og\:title\" content\=\"(.*?)\" \/>/i", $html, $matches) ) {
//<title>(.*?)<\/title>
return $matches[1];
} else {
return false;
}
}
//ファイルのリストを取得する関数
function getfilelists($filePath){
$rtnarray = array();
if ($dir = opendir($filePath)) {
while (($file = readdir($dir)) !== false) {
if ($file != "." && $file != "..") {
//echo "$file\n";
if($file == ".DS_Store"){
}else{
array_push($rtnarray,$file);
}
}
}
closedir($dir);
}
return $rtnarray;
}
$filePath = “/Users/user/xxx/xxx/expdata/”;
ここを、ローカルに持ってきたエキサイトブログのデータパスに書き換えます。
上記ソースを「適当な名前.php」として保存。
コンソールから
php 適当な名前.php
して実行します。
実際には
パスphp パス適当な名前.php
になります。秋田は mac でしかやっていないので、Windows でやられる方は、少々ソースに改変をする必要があるかもしれません。
実行が終わると「適当な名前.php」を配置したディレクトリに「inport.txt」「image.txt」が書き出されます。
インポートの準備〜インポート
インポートの準備を行います。
画像の取得
image.txt に書き出された情報を加工します。プログラムに書き入れればよいのですが、そこんところ秋田はちょっとズボラなので許してください。
以下の文字を置換します。
\n.*src → \nsrc
\n.*SRC → \nsrc
src=” → src=
src=../../ → http://
\.jpg.*\n → \.jpg\n
\.gif.*\n → \.gif\n
その後エクセルに全行をうつし、ソートして重複を無くします。
重複がなくなったイメージの URL を 巡集を使ってイメージの取得を行います。
ブログのホスト名ディレクトリが出来ますので、その中身を WordPress の「/wp-content/uploads/」の下にディレクトリ「eximage」を作成して、全部アップロードします。
記事のインポート
インポートツールは、PHPで書き出しをする時に簡単な形式を選んだので「Movable Type and TypePad Importer」と言うプラグインを使います。
https://wordpress.org/plugins/movabletype-importer/ こちらにアクセスし、プラグインをダウンロードします。
ダウンロードが完了したら、解凍し「/wp-content/plugins/」の下に配置します。
管理画面のプラグインで上記プラグインを有効にしたら、左メニューの「ツール」→「インポート」と進み、「Movable Type and TypePad」をクリックします。
「自分のコンピューターからファイルを選択する」を行います。「選択…」をクリックして「inport.txt」を選択し、「ファイルをアップロードしてインポート」をクリックします。
インポートする記事のオーナーを指定し、「Submit」をクリック。「All done. Have fun!」と表示されればインポート完了です。
これで移行は完了です。
ワードプレスをドメイン直下ではなく、サブディレクトリ以下に配置をしている場合は、プログラムの
「$wpimag = “/wp-content/uploads/eximage/”;」
を
「$wpimag = “/サブディレクトリ/wp-content/uploads/eximage/”;」
と書き直して試してみてください。
まとめ
「WordPressで独自ドメイン、難しいなら有料ブログサービスで独自ドメイン」等、これまでに何度か言ってきましたが、無料のブログってのはそれなりにリスクがある訳で、自分が書いた自分の文章が自分の財産にはならずに、無料ブログ提供者のものになってしまう。
自分の書いたブログ、バックアップ出来ないなんてどうかしてると思うが仕方ない。
くどいようですが、エキサイトブログと心中するつもりがなければ、今すぐにでも自分のブログのバックアップが取れるブログサービスもしくは、WordPress に変えないと駄目です。


コメント