はじめに
いまだにアメブロにはデータを直接エクスポートする機能が用意されていません。
そのため一般的には、一度 FC2ブログを開設し、FC2ブログの「ブログ引っ越しツール」を利用してアメブロのデータをインポートする方法を紹介しています。
そこで、独自にアメブロのデータをMovable Type 形式でエクスポートできるツール を作成しました。
さらに、記事内で使用されている画像も一括でダウンロードし、WordPressの子テーマ内にある tmpフォルダーへ保存できるようにしています。
この記事では、この方法について説明します。
引っ越し手順
以下の手順で引っ越します。
- ラベルアメブロの投稿データをエクスポート

Chromeデベロッパーツール 以下の手順で操作します。
- ご自身のアメブロページを開きます。
- F12キーを押して、Chromeデベロッパーツールを起動します。
- 「コンソール」を選択し、以下のコードをコピーして貼り付け、Enterキーで実行します(図1参照)。
- 実行が完了すると、img.txt(画像URLリスト)、mt.txt(Movable Type形式データ)が自動でダウンロードされます。
/** * アメーバブログの新デザインページから本文を抽出しファイルとしてダウンロード * * @return {boolean|void} 処理を中断する場合はfalseを返却 */ function backupWithINIT() { // 現在のURLからブログID(ユーザーID)を抽出 var uid = window.location.href.replace(/(http|https):\/\/ameblo\.jp\/([^\/?\?]+).*$/,"$2"); var pro = window.location.protocol; var url = pro + '//ameblo.jp/' + uid + '/entrylist-1.html'; var end; // 総ページ数 var mt = ""; // MT形式の本文出力データ var img = ""; // 抽出した画像URLのリストデータ // 新デザイン(.skin-page)が適用されているか判定し、非対応なら終了 if ($(".skin-page").length == 0) { alert("新デザインではありません。"); return false; } // バックアップの実行を確認するダイアログを表示 var answer = confirm(uid + 'バックアップを開始しますOK?'); if (answer == false) { return false; } // 1ページ目を取得して全体の総ページ数を調べる $.ajax({ url: url, type: 'GET', async: false, success: function(getData) { end = $('.skin-paginationEnd', getData).attr("href"); if (end == undefined) { // ページ送りが存在しない場合は1ページのみとみなす end = 1; } else { // entrylist-n.htmlのファイル名部分からページ番号の数値を抽出 end = end.replace(/.*entrylist-(\d+).html/g,"$1"); } } }); console.log("ページ数:", end); // 1ページ目から最終ページまで順番にループ処理 for (var i = 1; i <= end; i++) { var pageUrl = pro + '//ameblo.jp/' + uid + '/entrylist-' + i + '.html'; console.log("処理URL:", pageUrl); // 各一覧ページを同期通信で取得 $.ajax({ url: pageUrl, type: 'GET', async: false, success: function(getData) { // 取得したHTML文字列を解析用の独立したDOMドキュメントに変換 var doc = document.implementation.createHTMLDocument(''); doc.documentElement.innerHTML = getData; // ページ内のすべてのスクリプトタグから window.INIT_DATA を探索 var scripts = doc.querySelectorAll('script'); var entryMap; scripts.forEach(function(s) { if (s.textContent.includes('window.INIT_DATA')) { try { // evalでスクリプト内容を展開し、entryMapオブジェクトを取得 eval(s.textContent); entryMap = window.INIT_DATA.entryState.entryMap; } catch(e) {} } }); // entryMapが取得できなかった場合はこのページの処理をスキップ if (!entryMap) { console.log("INIT_DATAが取得できません"); return; } // 記事一覧の各カード要素(entryItemBody)を順に処理 $('[data-uranus-component=entryItemBody]', getData).each(function(j) { // 記事のタイトルと個別ページのURLを取得 var title = $("h2", this).text().trim(); var href = $("h2 a", this).attr("href"); var entryIdMatch = href.match(/entry-(\d+)\.html/); var yymmdd = ""; var cat = ""; if (entryIdMatch) { var entryId = entryIdMatch[1]; if (entryMap[entryId]) { // 記事の作成日時を取得し、MT形式の日付フォーマットに整形 yymmdd = entryMap[entryId].entry_created_datetime .replace('T', ' ') .replace(/\.\d+\+09:00$/, ''); // 記事に紐づくカテゴリー(テーマ)名を取得 cat = entryMap[entryId].theme_name || ""; } } // 記事の個別ページを同期通信で取得 var pgData = $.ajax({url: href, async: false}).responseText; var body = ""; if (pgData) { // 取得した本文ページのHTMLをDOMに変換 var bdoc = document.implementation.createHTMLDocument(''); bdoc.documentElement.innerHTML = pgData; // 記事本文の本体要素を抽出して改行を削除 var bodyEl = bdoc.querySelector(".skin-entryBody"); if (bodyEl) { body = bodyEl.innerHTML.replace(/\r?\n/g,""); } // 本文内の画像要素を走査してアメーバ関連の画像URLを収集 bodyEl.querySelectorAll("img").forEach(function(imgEl) { var src = imgEl.src; if (src.match(/\/\/stat\.ameba\.jp\//)) { // サムネイル画像(t000_等)のURLをオリジナルサイズ(o等)に置換してクエリを除去 src = src.replace(/(\/\/stat\.ameba\.jp\/.*\/)(t\d+\_)(\d+\.)/, '$1o$3') .split("?")[0]; img += src + "\n"; } }); } // 取得した各データをMovable Type(MT)形式の文字列にフォーマットして結合 mt += `TITLE: ${title}\nAUTHOR: ${uid}\nCATEGORY: ${cat}\nDATE: ${yymmdd}\n-----\nBODY:\n${body}\n-----\n--------\n`; }); } }); } // テキストデータからそれぞれのBlobオブジェクトを作成 var blob_mt = new Blob([mt], {type: "text/plain"}); var blob_img = new Blob([img], {type: "text/plain"}); // 本文データ(mt.txt)のダウンロードリンクを動的に生成して自動クリック var a1 = document.createElement("a"); a1.href = URL.createObjectURL(blob_mt); a1.download = "mt.txt"; a1.click(); // 画像URLリストデータ(img.txt)のダウンロードリンクを動的に生成して自動クリック var a2 = document.createElement("a"); a2.href = URL.createObjectURL(blob_img); a2.download = "img.txt"; a2.click(); // すべての処理が完了したことを通知 alert("バックアップ完了!"); } // バックアップ関数を実行 backupWithINIT(); - ラベルアメブロ本文中の画像をダウンロード

ダッシュボード 以下の手順で操作します。
- 以下のコードをfunctions.phpに追加します。
- ダッシュボードに「画像URL一括ダウンロード」ウィジェットが追加されます(図2参照)。
- 入力フォームにimg.txtをコピーして貼り付け、ダウンロードボタンをクリックします。
// ダッシュボードにウィジェットを追加 add_action('wp_dashboard_setup', function () { wp_add_dashboard_widget( 'image-downloader', '画像URL一括ダウンロード', 'render_image_downloader' ); }); /** * ダッシュボードにウィジェットを出力 * * @return void */ if (!function_exists('render_image_downloader')): function render_image_downloader() { ?> <form method="post"> <?php wp_nonce_field('image_downloader_action', 'image_downloader_nonce'); ?> <textarea name="image_urls" rows="10" style="width:100%;" placeholder="1行に1つずつ画像URLを入力"></textarea> <br><br> <input type="submit" name="download_images" class="button button-primary" value="ダウンロード"> </form> <?php } endif; // 管理画面からの設定データ更新 add_action('admin_init', function () { if (!isset($_POST['download_images']) || empty($_POST['image_urls'])) { return; } // nonceチェック if (!isset($_POST['image_downloader_nonce']) || !wp_verify_nonce($_POST['image_downloader_nonce'], 'image_downloader_action')) { return; } // 権限チェック if (!current_user_can('manage_options')) { return; } // 入力されたURLリストを改行コードで分割 $urls = explode("\n", str_replace("\r", "", $_POST['image_urls'])); $saved = 0; // 保存用のtmpフォルダ $upload_dir = get_stylesheet_directory() . '/tmp'; if (!file_exists($upload_dir)) { wp_mkdir_p($upload_dir); } // URLを1件ずつ処理 foreach ($urls as $url) { $url = trim($url); if (empty($url)) { continue; } // URLからファイル名を取得 $file_name = basename(parse_url($url, PHP_URL_PATH)); $file_path = $upload_dir . '/' . $file_name; // 外部画像を取得 $img = wp_remote_get($url); // 正常に取得できた場合のみ保存 if ( !is_wp_error($img) && wp_remote_retrieve_response_code($img) === 200 ) { file_put_contents($file_path, wp_remote_retrieve_body($img)); $saved++; } } // 保存成功件数を一時保存 set_transient('my_admin_notice', [ 'type' => 'success', 'message' => $saved . ' 件の画像を tmp フォルダにダウンロードしました。', ], 60); // 二重送信防止 wp_safe_redirect(admin_url('index.php')); exit; }); // 通知メッセージを出力 add_action('admin_notices', function () { if ($notice = get_transient('my_admin_notice')) { echo '<div class="notice notice-' . esc_attr($notice['type']) . ' is-dismissible"><p>' . esc_html($notice['message']) . '</p></div>'; delete_transient('my_admin_notice'); } }); - ラベルWordPressにダウンロードした画像を登録
以下の手順で操作します。
- 子テーマの
tmpフォルダにダウンロードした画像ファイルを、メディアライブラリに登録します。 - 保存されたメディアライブラリのファイルのURL(例:https://example.com/wp-content/uploads/yyyy/mm/)をメモします。
- 子テーマの
- ラベルWordPressに投稿データをインポート
以下の手順で操作します。
- mt.txt内の
<img>タグの画像のURLを、メディアライブラリに保存したファイルのURLに置き換えます。 - ツール→インポート→「Movable TypeとTypePad」をインストールします。
- 「インポーターを実行」をクリックします。
- mt.txtを選択し、ファイルをアップロードしてインポートをクリックします。
- mt.txt内の
さいごに
今回紹介した方法を使えば、アメブロの投稿データや本文内の画像を効率的にWordPressに引っ越すことができます。
Movable Type形式に変換してインポートすることで、カテゴリや投稿日時、本文を保持したまま移行可能です。
また、画像も一括でダウンロードしてメディアライブラリに登録できるため、移行後に手動で差し替える手間が大幅に削減されます。

久しぶりにアメブロ見たら、全面広告とか勘弁して欲しいわ。
昔作ったエクスポートツールも、アメブロの仕様変更でカード中に投稿日、カテゴリーがなく簡単に取得できなくなり。
思い出したので、作り変えたわ。



