アメブロからWordPressに引っ越しする方法

Cocoonカスタマイズ集
この記事は約14分で読めます。
記事内に広告が含まれています。

はじめに

いまだにアメブロにはデータを直接エクスポートする機能が用意されていません。

そのため一般的には、一度 FC2ブログを開設し、FC2ブログの「ブログ引っ越しツール」を利用してアメブロのデータをインポートする方法を紹介しています。

そこで、独自にアメブロのデータをMovable Type 形式でエクスポートできるツール を作成しました。

さらに、記事内で使用されている画像も一括でダウンロードし、WordPressの子テーマ内にある tmpフォルダーへ保存できるようにしています。

この記事では、この方法について説明します。

2026年8月20日現在では正常に動作していますが、今後アメブロの仕様変更によって動作しなくなる可能性があります。

引っ越し手順

以下の手順で引っ越します。

  • ラベル
    アメブロの投稿データをエクスポート
    Chromeデベロッパーツール

    以下の手順で操作します。

    1. ご自身のアメブロページを開きます。
    2. F12キーを押して、Chromeデベロッパーツールを起動します。
    3. 「コンソール」を選択し、以下のコードをコピーして貼り付け、Enterキーで実行します(図1参照)。
    4. 実行が完了すると、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();
  • ラベル
    アメブロ本文中の画像をダウンロード
    ダッシュボード

    以下の手順で操作します。

    1. 以下のコードをfunctions.phpに追加します。
    2. ダッシュボードに「画像URL一括ダウンロード」ウィジェットが追加されます(図2参照)。
    3. 入力フォームに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にダウンロードした画像を登録

    以下の手順で操作します。

    1. 子テーマのtmpフォルダにダウンロードした画像ファイルを、メディアライブラリに登録します。
    2. 保存されたメディアライブラリのファイルのURL(例:https://example.com/wp-content/uploads/yyyy/mm/)をメモします。
  • ラベル
    WordPressに投稿データをインポート

    以下の手順で操作します。

    1. mt.txt内の<img>タグの画像のURLを、メディアライブラリに保存したファイルのURLに置き換えます。
    2. ツール→インポート→「Movable TypeとTypePad」をインストールします。
    3. 「インポーターを実行」をクリックします。
    4. mt.txtを選択し、ファイルをアップロードしてインポートをクリックします。

さいごに

今回紹介した方法を使えば、アメブロの投稿データや本文内の画像を効率的にWordPressに引っ越すことができます。
Movable Type形式に変換してインポートすることで、カテゴリや投稿日時、本文を保持したまま移行可能です。
また、画像も一括でダウンロードしてメディアライブラリに登録できるため、移行後に手動で差し替える手間が大幅に削減されます。

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

タイトルとURLをコピーしました