なぜ?
私の嫁がアメーバブログ(アメブロ)をやっているのですが、つい最近までバックアップを一切取っていませんでした。まだ始めてから1年くらいしか経っていませんが、ほぼ毎日更新しています。ですので、このデータが消えたらきっと立ち直れないだろうなぁ、というくらいの記事数になっています。
データが消えると言っても、ブログ管理者が、「システム障害発生。バックアップから復旧しようとしましたが、失敗しました。ごめんなさい、てへっ。」と釈明するような事があるとは思っていませんし、「規約違反により、あなたのブログは削除されました。ご愁傷様です。」いう背筋の凍る告知を受ける事もないと思っています。
私が心配しているのは、3歳の息子が嫁のスマホを勝手にいじってブログ閉鎖してしまうだとか、嫁が誤操作して違う記事を消してしまうといったケースです。
結局、自分でスクリプトを組みました
そういう訳で、ブログ記事をバックアップしてくれるツールを探してみたのですが、ピンとくるものが見当たりませんでした。有償のブログバックアップサービスなどもありましたが、追加のランニングコストをかけてまでやるのは、あまり気が進みません。
なので、自分でツールを作る事にしました。以下が、実際に作ったスクリプトです。
<?php
function get_blog_rss($max, $url) {
if (ini_get('allow_url_fopen')) {
$rss = simplexml_load_file($url);
} else {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xml_raw = curl_exec($ch);
$rss = simplexml_load_string($xml_raw);
}
$cnt = 0;
foreach ( $rss->channel->item as $item ) {
$cnt += 1;
$pubDate = strtotime($item->pubDate);
if (strpos($item->title, 'PR:', 0) === FALSE) {
$filename = basename($item->link) . date('.YmdHi', $pubDate) . ".webarchive";
# webarchiverのインストールが別途必要です
system("/opt/local/bin/webarchiver -url {$item->link} -output {$filename}");
print("[". date('Y-m-d', $pubDate). "] " . $item->title . " -> " . $filename . "\n");
}
if ($max <= $cnt) {
break;
}
}
return $list;
}
# 最近のPHPは、タイムゾーン指定が必須です
date_default_timezone_set("Asia/Tokyo");
# 最大バックアップ記事数と、RSSのURL(xxxxは、アメブロのアカウント)を指定します
get_blog_rss(10,'http://feedblog.ameba.jp/rss/ameblo/xxxx/rss20.xml');
PHP 5.5.30で動作確認しています。このスクリプトを動かすには、webarchiverというツールを、(MacPortsなどを使って)別途インストールする必要があります。
ターミナルから、以下のコマンドを入力すると動きます。
#"/path/to/"は、スクリプトの配置先パス
php /path/to/rss_archiver.php
このスクリプトでは、アメブロのRSSから最近の記事一覧を取得して、各記事を、SafariのWebアーカイブ形式でMacのハードディスクに保存しています。
Webアーカイブは、Safariで直接表示できます。ページのテキストや画像がそのまま1つのファイル(正確にはバンドル)にまとめられているので、ファイル管理も楽チンです。
プログラマーの目線で見ると、アメブロって扱いづらいですね。RSSくらいしか使えるAPIがありません。
今のところ、イメージ通り使えてます
私は、これを週1回、手動で起動する運用にしています。スケジュールを組んで自動起動させることもできるのですが、バックアップがきちんと取れている事を随時確認できるので、実は手動のほうがお手軽かつ確実だったりします。
このツールを、Macアプリ・Windowsアプリ化して広くリリースすべきでは?とも思ったのですが、私自身はこのスクリプトでイメージ通りの運用ができているので、思いとどまっています。リクエストあれば、ご連絡ください。