未経験のITエンジニア転職【テックキャンプ】

【2020年版】メルカリ自動再出品する無料ツール!価格変更も可!

自動で価格変更再出品方法をご紹介しています。

それとメルカリに出品しているデータを吸い出して表で管理できます。

iMacrosというブラウザ上の作業を自動化できる無料ツールを使って作成しています。

プログラムをすべて公開していますので、ご自分の使用用途に合わせてカスタマイズして頂くことも可能です。

ノーノちゃん

なんでプログラムをすべて公開しているの??
iMacrosを勉強したい方向けに、このサイト(テイラボ)を運営しています。完成したものがないと、勉強にならないので公開しています。

テイくん

1. 必ず最初にお読みください

メルカリ作業を自動化する方法は、サーバー型デスクトップ型の2種類あります。
※iMacrosはデスクトップ型です。

サーバー型とは?

メルカリのサーバー設置型

直接ご自分のPCやスマホなどから情報を送るのではなく、中間にあるサーバー(ツール)を経由してメルカリに情報を送ります。

この方法は、使うユーザー数が増えるほど同じIPアドレス(住所)から何度も出品したり削除したりしていることが分かります。

そのため、サーバー型ツールを利用していた人はアカウント停止処分を受けました。

現在、サーバー型で使用できるツールはありません。今後も出てこないと考えられます。
※2020/02/25時点

デスクトップ型とは?

メルカリのデスクトップ型

上記の図のようにサーバー型とは違い、同じIPアドレスからでなく個々のIPアドレスから情報を送るのでツールを使ってると判断されにくくなります。

ただ、iMacrosで自動化する方法はデスクトップ型ですが100%大丈夫というお話ではありません。

今後メルカリ側のセキュリティが強化された場合、アカウントが停止になる可能性があります。

注意①
もしツールを使用される場合は自己責任でお願い致します。当サイトは一切責任を負いません。
注意②
ツールを使用するしないに関係なく、1日に大量に何回も価格を変動させたり、再出品を繰り返すとアカウントが停止になる可能性が高まります。

詳しく知りたい方はこちら記事が参考になると思います。
参考 メルカリの圏外飛ばしされる出品数や再出品の基準や頻度について物販NAVI

2. サポートについて

個別サポートは行っておりません。

不具合については「自動ツール不具合報告フォーム」からお願い致します。

個別に返信は行っておりませんが、解決できた場合は次の項目の「3. 更新履歴」にてご報告さして頂きます。

それと冒頭でもお伝えしましたが、プログラムの中身をすべて公開していますので、ご自分で修正や機能を追加して頂くことも可能です。

3. 更新履歴

修正や機能追加の履歴をこちらに記載しています。

  • 【再出品時】サイズがないカテゴリーの場合ブランド名を入力できない問題を解決
    修正前:macro += "EVENTS TYPE=KEYPRESS SELECTOR=HTML>BODY>DIV>DIV>DIV:nth-of-type(2)>DIV>FORM>DIV:nth-of-type(4)>DIV:nth-of-type(3)>DIV>DIV:nth-of-type(2)>DIV>INPUT CHARS={{!COL10}}" + "\n";
    macro += "TAG POS=1 TYPE=LI ATTR=ID:*" + "\n";

    修正後:macro += "TAG POS=1 TYPE=LABEL ATTR=TXT:ブランド*" + "\n";
    macro += "TAG POS=R1 TYPE=INPUT:TEXT FORM=ACTION:# ATTR=NAME:brandName CONTENT={{!COL10}}" + "\n";

    ※NAMEにbrandNameが追加されたことによってEVENTSコマンドを使わずに入力が可能となりました。
  • 【再出品時】カテゴリー2のキッズ服「(男女兼用) 100cm~」「(男の子用) 100cm~」「(女の子用) 100cm~」を選べない問題を解決
    修正前:macro += "SET CATEGORY_2 EVAL(\"'{{!COL7}}'.replace(/(.*?)~.*/g,'$1');\")" + "\n"
    修正後:macro += "SET CATEGORY_2 EVAL(\"'{{!COL7}}'.replace(/(.*?)用\\).*/g,'$1用)');\")" + "\n";
    ※現在キッズ、ベビー服だけ半角空白があるのでカテゴリーが増えた場合、今回のようなエラーが起きる可能性あり。
  • 「setting.iim」ファイルの設定をデバッグ(テスト)用に、【再出品】の速度を高速にしていたためデフォルトに変更しました。
  • 【再出品時】カテゴリー2のベビー服の「(女の子用)~95cm」「(男の子用)~95cm」「(男女兼用)~95cm」を選べない問題を解決
    修正前:macro += "TAG POS=R1 TYPE=SELECT FORM=* ATTR=NAME:* CONTENT=${{!COL8}}" + "\n";
    修正後:macro += "SET CATEGORY_2 EVAL(\"'{{!COL7}}'.replace(/(.*?)~.*/g,'$1');\")" + "\n"
    macro += "TAG POS=R1 TYPE=SELECT FORM=* ATTR=NAME:* CONTENT=${{CATEGORY_2}}*" + "\n"; // カテゴリー2個目;
  • 【再出品時】商品名の入力のプログラム簡略化
    修正前:macro += "EVENTS TYPE=KEYPRESS SELECTOR=HTML>BODY>DIV>DIV>DIV:nth-of-type(2)>DIV>FORM>DIV:nth-of-type(3)>DIV>DIV>DIV:nth-of-type(2)>DIV>INPUT CHARS={{!COL4}}" + "\n";
    修正後:macro += "TAG POS=1 TYPE=INPUT:TEXT FORM=ACTION:# ATTR=NAME:name CONTENT={{!COL4}}" + "\n";
  • 【再出品時】商品の説明で勝手に改行がはいる現象を解決
    修正前:macro += "EVENTS TYPE=KEYPRESS SELECTOR=HTML>BODY>DIV>DIV>DIV:nth-of-type(2)>DIV>FORM>DIV:nth-of-type(3)>DIV:nth-of-type(2)>DIV>TEXTAREA CHARS={{!COL5}}" + "\n";
    修正後:macro += "TAG POS=1 TYPE=TEXTAREA FORM=ACTION:# ATTR=NAME:description CONTENT={{!COL5}}" + "\n";
  • バージョン情報をプログラム内最上部に書き込みに変更したため「ver〇〇.iim」ファイルを削除。
  • 「01_mercari_date.js」で51個目以降の商品が取得できない現象を解決
    読み込む順を以下のように変更
    修正前:jsエリア【macroEnd】→【macroNext】
    修正後:jsエリア【macroNext】→【macroEnd】
  • バージョン情報を確認できる「ver2.0.2.iim」ファイルを追加
  • 「setting.iim」内の乱数部分を修正
    修正前:("Math.floor(Math.random()*{{MAX}} + {{MIN}});")
    修正後:("Math.floor(Math.random() * ({{MAX}} - {{MIN}} + 1)) + {{MIN}};")
  • 「setting.iim」にて待ち時間をランダムに設定できるよう変更
  • 「setting.iim」にて待ち時間をランダムに設定できるよう変更
  • フォームIDが変更になりErrorが発生していましたが解決
  • 「02_price.js」と「03_relist.js」の結果ファイルを自動で開くように改変
    URL GOTO=file:{{!FOLDER_DATASOURCE}…;
  • フォルダパス設定なしで使用できるように変更
    var foldername = "result";
    imns.FIO.makeDirectory(imns.Pref.getFilePref('defdatapath').path+…;
  • プログラムの簡略化

4. 動作環境について

ツールを使うためにソフトをダウンロード(追加)する必要があります。

必要な3つのソフト(無料)
  1. iMacros 旧バージョン(8.9.7)
  2. Firefox(52.9.0ESR or 49.0.2)
    ※49.0.2はメモリが無限に増加する可能性があるので非推奨です。
  3. SmoothCSV
    ※Excelでも可能ですが編集するとデータが使えなくなる可能性があるので非推奨です。

上記の導入方法はこちらで説明しています(設定時間は約1分)
iMacrosの初期設定と導入方法iMacrosに必要なFirefox、SmoothCSVの導入方法と初期設定(保存版)【PART.1】

もうすでにiMacrosを使っていても、最新バージョン(無料版)では機能制限があり動きませんのでダウングレードする必要があります。

詳しく知りたい方は「iMacros:無料版と有料版の違いを解説」の記事でご確認して頂ければと思います。

5. プログラムの設置方法

難しい設定はありませんが念の為動画を作成しました。

※動画は約1分です。

STEP.1
プログラムをダウンロード

mercari.zip(Ver 2.0.5)

Macユーザーの方について
Windows用に制作しているため上記のプログラムをそのまま使用すると動かない箇所があります。もしMacで使用したい場合は必ず改変する必要があります。
改変する場所はファイルのパスの部分です。
・Windowsは\(スラッシュ)
・Macは/(バックスラッシュ)
WindowsとMacはファイルパスの表記が違います。

js
// Windows
macro += "SET !DATASOURCE {{!FOLDER_DATASOURCE}}\\メルカリ\\01_mercari_date.csv" + "\n";

// Mac
macro += "SET !DATASOURCE {{!FOLDER_DATASOURCE}}\/メルカリ\/01_mercari_date.csv" + "\n"; 

上記の例と同じようにプログラム内の全ての箇所を改変する必要があります。

STEP.2
ダウンロードした「mercari-ver◯◯◯.zip」を解凍
解凍すると「mercari」フォルダが表示されます。
STEP.3
「Macros」フォルダの中に「mercari」フォルダを入れる
補足
動画ではドキュメント(Documents)フォルダの中に入れていますが、設定を変更している方は場所が違う可能性があります。

6. メルカリマクロの使い方

まずは、各ファイルの役割を確認しましょう。

ファイル名 役割
01_mercari_date.js 出品中のデータを抜き出す用
02_price.js 価格を変更する用
03_relist.js 再出品する用
setting.iim ランダム待機時間を変更する用

出品中のデータを抜き出す用

ファイル名:01_mercari_date.js

※動画は約2分です。

価格を変更する用

ファイル名:02_price.js

※動画は約3分です。

再出品する用

ファイル名:03_relist.js

※動画は約3分です。

ランダム待機時間を変更する用

ファイル名:setting.iim

※動画は約1分です。


少しでも作業効率を上げる方法

「メルカリフォルダ」のショートカットをデスクトップ作成

ファイルを探しに行く手間が省けます。

ショートカットフォルダ作成
※設定時間は10秒
CSVファイルを自動でSmoothCSVで開く設定方法

動画の中で毎回ドラッグ&ドロップして、CSVファイルをSmoothCSVで開いています。
実は「アプリケーションと拡張子の関連付け」をすれば次回からこの作業がいらなくなります。

CSVファイルを自動でSmoothCSVで開く設定方法

全てのCSVファイルを関連付けされると困るという方は「②特定のCSVファイルのみ」の設定できる方法を試して頂ければと思います。

※設定時間は10秒

7. よくある質問

エラーについて

Excel文字化け

記事内でもお伝えしていますが、Excelを使って編集すると文字コードが変わりこの現象が起きます。

解決方法:再度データを取得して、ファイルを編集するときに「SmoothCSV」を使って頂ければ大丈夫です。

CSVファイル表示おかしい

記事内でもお伝えしていますが、Excelを使って編集すると文字コードが変わりこの現象が起きます。

解決方法:再度データを取得して、ファイルを編集するときに「SmoothCSV」を使って頂ければ大丈夫です。

メルカリ側がアップデートをしたためマクロが動かなくなった可能性があります。

まずは、最新バージョンのプログラムをダウンロードして試してみてください。もし解決できない場合は「2. サポートについて」をご確認して頂ければと思います

「setting.iim」のSET MINSET MAXの部分を変更して頂ければできます。
もし数値を変更してもできない場合は、フォルダ位置やファイル名を変えたりしている可能性があります。

一度すべてのファイルを削除して再度「プログラムの設置方法」からやり直してみてください。

imacrosError

LOOPボタンを使えるのはiMacros(.iim)ファイルだけです。JavaScript(.js)ファイルを使えばLOOPが使えます。

解決方法:画像の通りPlayを押せばOKです。

次のファイル(〇〇.csv)を開く

上記の設定を一度すれば次回からは表示されません。
余談ですがこのようなメッセージはダイアログと呼ばれています。

imacrosエラー

解凍の仕方によってmercari内にmercariを生成する場合があります。
そうするとフォルダの位置関係がずれるため、抜き出したデータ(CSVファイル)を使用できなくなります。

解決方法は下記のようにmercariのすぐ下に各ファイルを配置してください。

メルカリimacrosフォルダ位置

筆者環境「Windows7、Windows10、Windows Server 2019(VPS)」では、この現象が一度も起きたことがありません。

そのため解決するか分かりませんが、以下の方法を試していただければと思います。

解決方法:画像導入部分のプログラムを改変してマクロを低速に変更する。

★変更前

03_relist.js
//「出品画像」を挿入
macro += "SET IMG_FOLDER {{!FOLDER_DATASOURCE}}\\メルカリ\\img" + "\n"; //長いので「imgフォルダパス」の変数を設定
macro += "SET !TIMEOUT_PAGE 2" + "\n";  //遅延対策
macro += "SET !REPLAYSPEED MEDIUM" + "\n"; //速度調節
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_1.jpg" + "\n";   //1個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_2.jpg" + "\n";   //2個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_3.jpg" + "\n";   //3個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_4.jpg" + "\n";   //4個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_5.jpg" + "\n";   //5個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_6.jpg" + "\n";   //6個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_7.jpg" + "\n";   //7個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_8.jpg" + "\n";   //8個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_9.jpg" + "\n";   //9個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_10.jpg" + "\n";  //10個目
macro += "TAG POS=1 TYPE=A ATTR=TXT:編集" + "\n";
macro += "TAG POS=1 TYPE=A ATTR=TXT:完了" + "\n";

★変更後

03_relist.js
//「出品画像」を挿入
macro += "SET IMG_FOLDER {{!FOLDER_DATASOURCE}}\\メルカリ\\img" + "\n"; //長いので「imgフォルダパス」の変数を設定
macro += "SET !TIMEOUT_PAGE 4" + "\n";  //遅延対策
macro += "SET !REPLAYSPEED SLOW" + "\n"; //速度調節
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_1.jpg" + "\n";   //1個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_2.jpg" + "\n";   //2個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_3.jpg" + "\n";   //3個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_4.jpg" + "\n";   //4個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_5.jpg" + "\n";   //5個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_6.jpg" + "\n";   //6個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_7.jpg" + "\n";   //7個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_8.jpg" + "\n";   //8個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_9.jpg" + "\n";   //9個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_10.jpg" + "\n";  //10個目
macro += "SET !REPLAYSPEED MEDIUM" + "\n"; //速度調節
macro += "TAG POS=1 TYPE=A ATTR=TXT:編集" + "\n";
macro += "TAG POS=1 TYPE=A ATTR=TXT:完了" + "\n";

参考動画⇩

画像がうまく掲載できない

使い方

頻繁にメルカリのアルゴリズム(圏外飛ばしやアカウント停止の基準)が変更されるためなんとも言えません。
心配な方はできるだけ少ない数にしておきましょう。
マクロは表の上から順番に処理をするように作成しています。
価格変更や再出品したい商品を一番上に持っていけば可能です。

下記の動画は「テスト」という商品の価格変更や再出品したい場合の例です。

メルカリ特定の商品を変更

注意
編集したあとは必ず上書き保存してください。
補足
行数を増やす場合はショットカットキーのCTRL+Jが便利です。
少し設定が面倒ですが、Windowsに元々あるタスクスケジューラ機能を使えば可能です。

詳しくはこちらで解説しています。
タスクスケジュールラーでiMacrosを自動起動iMacros:任意の日時で自動起動する方法(タスクスケジューラ)

その他

全て自動にするとアカウント停止のリスクが高まるため、作成予定はありません。
1. 必ず最初にお読みください」の項目を再度ご確認して頂ければと思います。
できる限りアップデートする予定ですが、メルカリ側のシステムに依存するためなんとも言えません。
今後メルカリのセキュリティーが強化されて使えなくなる可能性があります。
JavaScriptを使わずiMacrosだけの自動化は簡単です。なぜかと言いますとプログラムを自動でiMacrosが書いてくれるからです。

まずはこちらの記事を参考にして頂ければと思います。
iMacrosの使い方:初心者向けに解説iMacrosの使い方:初心者向けに解説!(図解、動画あり)【PART.2】

8. 各マクロの中身(勉強用)

「iMacrosエリア」の各コマンドの詳細をリンク先で確認できるようにしています。
※「JavaScriptエリア」は現在作成中です。

注意
この項目は「基礎講座」の記事一覧の内容とJavaScriptがある程度理解できている中級者向けの内容です。初心者の方はスルー推奨です!

iMacrosを1から勉強してみたい方や初心者の方はこちら
ブラウザ上の作業を全て自動化できるiMacrosブラウザ上の作業を全て自動化できるiMacrosとは?【PART.0】

01_mercari_date.js
/*
Macro Name: 01_mercari_date.js
Macro URL: https://teilab.net/imacros_mercari/
Author: teilab(テイくん)
Version: 2.0.5
*/


//=================================================================
// JavaScriptエリア①
//=================================================================
//任意の商品数を取得できるようにする処理
var num = prompt("取得したい商品数を入力してください!\n※新しく出品した順番に取得します\n ");
  if (num == null){
    iimClose();
  }

  else if (num == ""){
    alert("数値は必須事項です!");
    iimClose();
  }

  else if (isNaN(num) || !(num >= 1 && num <= 9999)){
    alert("1~9999までの数値(半角)を入力してください!");
    iimClose();
  }

//Datasources内に「メルカリフォルダ」を作成
var foldername = "メルカリ";
imns.FIO.makeDirectory(imns.Pref.getFilePref('defdatapath').path+"\\"+foldername);


//=================================================================
// iMacrosエリア
//=================================================================
// -------------------------------------------------
// 出品中ページにアクセス【macroAccess】
// -------------------------------------------------
var macroAccess = "CODE:";
macroAccess += "SET !REPLAYSPEED FAST" + "\n";
macroAccess += "URL GOTO=https://www.mercari.com/jp/mypage/listings/listing/" + "\n";
iimPlay(macroAccess);

// -------------------------------------------------
// 出品中商品があるかチェック【macroCheck」
// -------------------------------------------------
var macroCheck = "CODE:";
macroCheck += "SET !REPLAYSPEED FAST" + "\n";
macroCheck += "SET !ERRORIGNORE YES" + "\n";
macroCheck += "SET !TIMEOUT_STEP 1" + "\n";

//商品があるかないかは商品URLで判定 ※重要
macroCheck += "TAG POS={{inLoop}} TYPE=A ATTR=CLASS:mypage-item-link EXTRACT=HREF" + "\n";

// -------------------------------------------------
// 出品中の全データ取得【macro】
// -------------------------------------------------
var macro = "CODE:";
macro += "SET !REPLAYSPEED FAST" + "\n";
macro += "SET !ERRORIGNORE YES" + "\n";

//出品商品の詳細ページ移動
macro += "TAG POS={{inLoop}} TYPE=A ATTR=CLASS:mypage-item-link" + "\n";

////データ吸い出しエリア////
macro += "SET !TIMEOUT_PAGE 2" + "\n"; //遅延対策

//ID
macro += "SET ID EVAL(\"'{{!URLCURRENT}}'.replace(/.*items\\/(.*?)\\//g,'$1');\")" + "\n"; //URLからID以外を除去

//商品名
macro += "TAG POS=1 TYPE=H2 ATTR=CLASS:item-name EXTRACT=TXT" + "\n";
macro += "SET ITEM_NAME {{!EXTRACT}}" + "\n";
macro += "SET !EXTRACT NULL" + "\n"; //EXTRACTに残っているデータを破棄【重要】

//商品説明
macro += "TAG POS=1 TYPE=P ATTR=CLASS:item-description-inner EXTRACT=TXT" + "\n";
macro += "SET DESCRIPTION {{!EXTRACT}}" + "\n";
macro += "SET !EXTRACT NULL" + "\n";

//カテゴリ
macro += "TAG XPATH=/html/body/div[1]/section/div[1]/table/tbody/tr[2]/td/a[1]/div EXTRACT=TXT" + "\n"; //カテゴリ1
macro += "SET TRIMMED EVAL(\"'{{!EXTRACT}}'.replace(/ /g,'');\")" + "\n"; //いらない空白を除去
macro += "SET CATEGORY_1 EVAL(\"var s='{{TRIMMED}}'; var x; if(s!='#EANF#'){ x='{{TRIMMED}}';} x\")" + "\n"; //#EANF#の場合のみ値を空にする
macro += "SET !EXTRACT NULL" + "\n";

macro += "TAG XPATH=/html/body/div[1]/section/div[1]/table/tbody/tr[2]/td/a[2]/div EXTRACT=TXT" + "\n"; //カテゴリ2
macro += "SET TRIMMED EVAL(\"'{{!EXTRACT}}'.replace(/ /g,'');\")" + "\n";
macro += "SET CATEGORY_2 EVAL(\"var s='{{TRIMMED}}'; var x; if(s!='#EANF#'){ x='{{TRIMMED}}';} x\")" + "\n";
macro += "SET !EXTRACT NULL" + "\n";

macro += "TAG XPATH=/html/body/div[1]/section/div[1]/table/tbody/tr[2]/td/a[3]/div EXTRACT=TXT" + "\n"; //カテゴリ3
macro += "SET TRIMMED EVAL(\"'{{!EXTRACT}}'.replace(/ /g,'');\")" + "\n";
macro += "SET CATEGORY_3 EVAL(\"var s='{{TRIMMED}}'; var x; if(s!='#EANF#'){ x='{{TRIMMED}}';} x\")" + "\n";
macro += "SET !EXTRACT NULL" + "\n";

//商品のサイズ
macro += "TAG POS=1 TYPE=TH ATTR=TXT:商品のサイズ" + "\n";
macro += "TAG POS=R1 TYPE=TD ATTR=* EXTRACT=TXT" + "\n";
macro += "SET SIZE EVAL(\"var s='{{!EXTRACT}}'; var x; if(s!='#EANF#'){ x='{{!EXTRACT}}';} x\")" + "\n";
macro += "SET !EXTRACT NULL" + "\n";

//ブランド
macro += "TAG POS=1 TYPE=TH ATTR=TXT:ブランド" + "\n";
macro += "TAG POS=R1 TYPE=TD ATTR=* EXTRACT=TXT" + "\n";
macro += "SET BRAND EVAL(\"'{{!EXTRACT}}'.replace(/ /g,'').replace(/\\s/g,'');\")" + "\n";
macro += "SET !EXTRACT NULL" + "\n";

//商品の状態
macro += "TAG POS=1 TYPE=TH ATTR=TXT:商品の状態" + "\n";
macro += "TAG POS=R1 TYPE=TD ATTR=* EXTRACT=TXT" + "\n";
macro += "SET CONDITION {{!EXTRACT}}" + "\n";
macro += "SET !EXTRACT NULL" + "\n";

//配送料の負担
macro += "TAG POS=1 TYPE=TH ATTR=TXT:配送料の負担" + "\n";
macro += "TAG POS=R1 TYPE=TD ATTR=* EXTRACT=TXT" + "\n";
macro += "SET CARRIAGE {{!EXTRACT}}" + "\n";
macro += "SET !EXTRACT NULL" + "\n";

//配送の方法
macro += "TAG POS=1 TYPE=TH ATTR=TXT:配送の方法" + "\n";
macro += "TAG POS=R1 TYPE=TD ATTR=* EXTRACT=TXT" + "\n";
macro += "SET METHOD {{!EXTRACT}}" + "\n";
macro += "SET !EXTRACT NULL" + "\n";

//配送元地域
macro += "TAG POS=1 TYPE=TH ATTR=TXT:配送元地域" + "\n";
macro += "TAG POS=R1 TYPE=TD ATTR=* EXTRACT=TXT" + "\n";
macro += "SET AREA {{!EXTRACT}}" + "\n";
macro += "SET !EXTRACT NULL" + "\n";

//配送日の目安
macro += "TAG POS=1 TYPE=TH ATTR=TXT:発送日の目安" + "\n";
macro += "TAG POS=R1 TYPE=TD ATTR=* EXTRACT=TXT" + "\n";
macro += "SET DATE {{!EXTRACT}}" + "\n";
macro += "SET !EXTRACT NULL" + "\n";

//価格
macro += "TAG POS=1 TYPE=SPAN ATTR=CLASS:item-price<SP>bold EXTRACT=TXT" + "\n";
macro += "SET PRICE EVAL(\"'{{!EXTRACT}}'.replace(/[\\\\¥¥]/g,'').replace(/,/g,'');\")" + "\n"; //円マークとカンマを除去
macro += "SET !EXTRACT NULL" + "\n";

macro += "SET !TIMEOUT_PAGE 60" + "\n"; //遅延対策(終了)

////CSVファイル書き込みエリア////
macro += "ADD !EXTRACT {{!NOW:yyyy/mm/dd<SP>hh:nn}}" + "\n"; //取得日
macro += "ADD !EXTRACT {{ID}}" + "\n";                       //ID
macro += "ADD !EXTRACT {{!URLCURRENT}}" + "\n";              //URL
macro += "ADD !EXTRACT {{ITEM_NAME}}" + "\n";                //商品名
macro += "ADD !EXTRACT {{DESCRIPTION}}" + "\n";              //商品説明
macro += "ADD !EXTRACT {{CATEGORY_1}}" + "\n";               //カテゴリ1
macro += "ADD !EXTRACT {{CATEGORY_2}}" + "\n";               //カテゴリ2
macro += "ADD !EXTRACT {{CATEGORY_3}}" + "\n";               //カテゴリ3
macro += "ADD !EXTRACT {{SIZE}}" + "\n";                     //サイズ
macro += "ADD !EXTRACT {{BRAND}}" + "\n";                    //ブランド
macro += "ADD !EXTRACT {{CONDITION}}" + "\n";                //商品の状態
macro += "ADD !EXTRACT {{CARRIAGE}}" + "\n";                 //配送料の負担
macro += "ADD !EXTRACT {{METHOD}}" + "\n";                   //配送の方法
macro += "ADD !EXTRACT {{AREA}}" + "\n";                     //配送元地域
macro += "ADD !EXTRACT {{DATE}}" + "\n";                     //配送日の目安
macro += "ADD !EXTRACT {{PRICE}}" + "\n";                    //価格
macro += "ADD !EXTRACT " + "\n";                             //メモ用
macro += "ADD !EXTRACT " + "\n";                             //メモ用
macro += "ADD !EXTRACT " + "\n";                             //メモ用

//全ての抜き出したデータを保存
macro += "SAVEAS TYPE=EXTRACT FOLDER={{!FOLDER_DATASOURCE}}\\メルカリ FILE=01_mercari_date.csv" + "\n";
macro += "WAIT SECONDS=1"+ "\n";

// -------------------------------------------------
// 画像があるかチェック【macroCheck2】
// -------------------------------------------------
var macroCheck2 = "CODE:";
macroCheck2 += "SET !REPLAYSPEED FAST" + "\n";
macroCheck2 += "SET !ERRORIGNORE YES" + "\n";
macroCheck2 += "SET !TIMEOUT_PAGE 1" + "\n"; //遅延対策
macroCheck2 += "TAG POS=1 TYPE=IMG ATTR=SRC:*/photos/*_{{imgLoop}}* EXTRACT=HREF" + "\n";

// -------------------------------------------------
// 商品画像をダウンロード【macroImg】
// -------------------------------------------------
var macroImg = "CODE:";
macroImg += "SET !REPLAYSPEED FAST" + "\n";
macroImg += "ONDOWNLOAD FOLDER={{!FOLDER_DATASOURCE}}\\メルカリ\\img FILE=*" + "\n"; //「imgフォルダ」に変更
macroImg += "TAG POS=1 TYPE=IMG ATTR=SRC:*/photos/*_{{imgLoop}}* CONTENT=EVENT:SAVEITEM" + "\n";

// -------------------------------------------------
// 画像がない場合は商品一覧に戻る【macroBack】
// -------------------------------------------------
var macroBack = "CODE:";
macroBack += "BACK" + "\n";
macroBack += "WAIT SECONDS={{rand}}" + "\n";

// -------------------------------------------------
// 入力された商品数を取得 or 商品がない場合【macroEnd】
// -------------------------------------------------
var macroEnd = "CODE:";
macroEnd += "PROMPT 出品中データを取得しました!<br><br>※データは以下の場所に保存されています。<br>{{!FOLDER_DATASOURCE}}\\メルカリ\\01_mercari_date.csv<SP>" + "\n";
macroEnd += "PROMPT 編集する場合は必ず『Smooth<SP>CSV』を使用してください!<SP><br>※文字コードの関係上『Excel』を使用するとデータが破損します!<SP>" + "\n";

// -------------------------------------------------
// 次のページに移動【macroNext】
// -------------------------------------------------
var macroNext = "CODE:";
macroNext += "SET !REPLAYSPEED FAST" + "\n";
macroNext += "SET !ERRORIGNORE YES" + "\n";
macroNext += "EVENT TYPE=CLICK SELECTOR=HTML>BODY>DIV>MAIN>DIV>UL>LI:nth-of-type(2)>A BUTTON=0" + "\n";
macroNext += "WAIT SECONDS=2"+ "\n";


//=================================================================
// JavaScriptエリア②
//=================================================================
for (var outLoop = 0; outLoop < 200; outLoop++){
  for (var inLoop = 1; ; inLoop++){

    // -------------------------------------------------
    // 出品中商品があるかチェック【macroCheck】
    // -------------------------------------------------
    iimSet("inLoop", inLoop);
    iimPlay(macroCheck);
    var check = iimGetExtract(1); //iimデータはjsで使えないため変数checkに渡す

   // -------------------------------------------------
  // 次のページに移動【macroNext】
  // -------------------------------------------------
    if (inLoop === 51){
      iimPlay(macroNext);
      break; //inLoopを抜ける
    }

    // -------------------------------------------------
    // 入力された商品数を取得 or 商品がない場合【macroEnd】
    // -------------------------------------------------
    else if (outLoop * 50 + inLoop > num || check === "#EANF#"){
      iimPlay(macroEnd);
      iimClose();
    }

    // -------------------------------------------------
    // 出品中の全データ取得【macro】
    // -------------------------------------------------
    else{
      iimSet("inLoop", inLoop);
      iimPlay(macro);

      // -------------------------------------------------
      // 画像があるかチェック【macroCheck2】
      // -------------------------------------------------
      for (var imgLoop = 1; ; imgLoop++){
        iimSet("imgLoop", imgLoop);
        iimPlay(macroCheck2);
        var Check2 = iimGetExtract(1);

        // -------------------------------------------------
        // 画像がない場合は商品一覧に戻る【macroBack】
        // -------------------------------------------------
        if (Check2 === "#EANF#"){
          iimPlay("mercari/setting");  //★【setting.iim(外部ファイル)】を動かす
          var rand = iimGetExtract(1); //★【setting.iim】の上から1番目(MERCARI_DATE_TIME)を取得
          iimSet("rand", rand);
          iimPlay(macroBack);
          break; //imgLoopを抜ける
        }

        // -------------------------------------------------
        // 商品画像をダウンロード【macroImg】
        // -------------------------------------------------
        else {
          iimSet("imgLoop",imgLoop);
          iimPlay(macroImg);
        }
      }
    }
  }
}
JavaScriptエリア解説
  • ユーザーが入力したnum値をif (outLoop * 50 + inLoop > num || check === “#EANF#”)の条件分岐で使用。多重ループを使っている理由は、51回毎に次へ(pager-next)をクリックした後breakで1からカウントさせるためです。もしループだけで書くとbreakした時点でマクロが止まってしまいます
  • 画像があるかチェック【macroCheck2】の部分のfor (var imgLoop = 1; ; imgLoop++)は必要ないように思えますがONDOWNLOAD FOLDERでフォルダを変更してCONTENT=EVENT:SAVEITEMで画像を抜き出す場合のみ、Error回避入れていてもiMacros8.9.7の不具合でマクロが止まる可能性があります。そのためこの処理が必要になります。
02_price.js
/*
Macro Name: 02_price.js
Macro URL: https://teilab.net/imacros_mercari/
Author: teilab(テイくん)
Version: 2.0.5
*/

//=================================================================
// JavaScriptエリア
//=================================================================
//任意の商品数の価格を変更できるようにする処理
var num = prompt("価格を変更したい商品数を入力してください!\n※【01_mercari_date.csv】の上から順番に値下げします\n ");
  if(num == null) {
    iimClose();
  }

  else if(num == "") {
    alert("数値は必須事項です!");
    iimClose();
  }

  else if(isNaN(num) || !(num >=1 && num <=9999)) {
    alert("1~9999までの数値(半角)を入力してください!");
    iimClose();
  }

//「メルカリフォルダ」内に「resultフォルダ」を作成
var foldername = "result";
imns.FIO.makeDirectory(imns.Pref.getFilePref('defdatapath').path+"\\メルカリ\\"+foldername);


//=================================================================
// imacrosエリア
//=================================================================
// -------------------------------------------------
// 商品価格を変更(macro)
// -------------------------------------------------
var macro = "CODE:";
macro += "SET !REPLAYSPEED FAST" + "\n";
macro += "SET !ERRORIGNORE YES" + "\n";

//「01_mercari_date」ファイルをセット
macro += "SET !DATASOURCE {{!FOLDER_DATASOURCE}}\\メルカリ\\01_mercari_date.csv" + "\n";
macro += "SET !DATASOURCE_LINE {{loop}}" + "\n";

//商品詳細ページに行く
macro += "URL GOTO={{!COL3}}" + "\n";

//「商品の編集」をクリック
macro += "TAG POS=1 TYPE=A ATTR=TXT:商品の編集" + "\n";
macro += "WAIT SECONDS=5" + "\n"; //読み込みが遅い場合があるので長めに設定している

//デフォルト価格をBACKキーで削除 ※消し忘れのリスクを考えて1個つづ
//control+Aを押しながらBACK(KEY=8 MODIFIERS = ctrl,A)でも可能だがミスがたまに起きるので検証の結果↓を採用
macro += "EVENTS TYPE=KEYPRESS SELECTOR=#sell-container>DIV>DIV>FORM>DIV:nth-of-type(5)>DIV>UL>LI>DIV>DIV>DIV>INPUT KEYS=[8]" + "\n"; //BACKキーを押す
macro += "EVENTS TYPE=KEYPRESS SELECTOR=#sell-container>DIV>DIV>FORM>DIV:nth-of-type(5)>DIV>UL>LI>DIV>DIV>DIV>INPUT KEYS=[8]" + "\n";
macro += "EVENTS TYPE=KEYPRESS SELECTOR=#sell-container>DIV>DIV>FORM>DIV:nth-of-type(5)>DIV>UL>LI>DIV>DIV>DIV>INPUT KEYS=[8]" + "\n";
macro += "EVENTS TYPE=KEYPRESS SELECTOR=#sell-container>DIV>DIV>FORM>DIV:nth-of-type(5)>DIV>UL>LI>DIV>DIV>DIV>INPUT KEYS=[8]" + "\n";
macro += "EVENTS TYPE=KEYPRESS SELECTOR=#sell-container>DIV>DIV>FORM>DIV:nth-of-type(5)>DIV>UL>LI>DIV>DIV>DIV>INPUT KEYS=[8]" + "\n";
macro += "EVENTS TYPE=KEYPRESS SELECTOR=#sell-container>DIV>DIV>FORM>DIV:nth-of-type(5)>DIV>UL>LI>DIV>DIV>DIV>INPUT KEYS=[8]" + "\n";
macro += "EVENTS TYPE=KEYPRESS SELECTOR=#sell-container>DIV>DIV>FORM>DIV:nth-of-type(5)>DIV>UL>LI>DIV>DIV>DIV>INPUT KEYS=[8]" + "\n";
macro += "WAIT SECONDS=1" + "\n";

//「価格」を入力
macro += "EVENTS TYPE=KEYPRESS SELECTOR=#sell-container>DIV>DIV>FORM>DIV:nth-of-type(5)>DIV>UL>LI>DIV>DIV>DIV>INPUT CHARS={{!COL16}}" + "\n";
macro += "WAIT SECONDS=1" + "\n";

//「変更をする」をクリック
macro += "TAG POS=1 TYPE=BUTTON FORM=NAME:NoFormName ATTR=TXT:変更する" + "\n";
macro += "WAIT SECONDS=2" + "\n";

//値下げ後の価格を抜き出す
macro += "SET !TIMEOUT_STEP 2" + "\n"; //遅延対策
macro += "TAG POS=1 TYPE=SPAN ATTR=CLASS:item-price<SP>bold EXTRACT=TXT" + "\n";

//値下げが成功したか判定(失敗は☓「#EANF#」、成功は◯)
macro += "SET MARK EVAL(\"var s='{{!EXTRACT}}'; if(s ==='#EANF#'){s = '☓';} else{s = '◯';} \") " + "\n";
macro += "SET !EXTRACT NULL" + "\n"; //EXTRACTに残っているデータを破棄【重要】

////CSVファイルに書き込み////
macro += "ADD !EXTRACT {{!NOW:yyyy/mm/dd<SP>hh:nn}}" + "\n"; //取得日時
macro += "ADD !EXTRACT {{!COL3}} " + "\n";                   //URL
macro += "ADD !EXTRACT {{!COL4}} " + "\n";                   //商品名
macro += "ADD !EXTRACT {{MARK}} " + "\n";                    //判定

//「02_price.csv」に保存
macro += "SAVEAS TYPE=EXTRACT FOLDER={{!FOLDER_DATASOURCE}}\\メルカリ\\result FILE=02_price.csv" + "\n";

macro += "WAIT SECONDS={{rand}}" + "\n"; //★ランダム(ユーザ設定した)待ち時間

// -------------------------------------------------
// 入力した商品数の価格を変更した場合(macroEnd)
// -------------------------------------------------
var macroEnd = "CODE:";
macroEnd += "PROMPT 価格の変更が完了しました。<br><br>※結果は以下の場所に保存されています。<br>{{!FOLDER_DATASOURCE}}\\メルカリ\\result\\02_price.csv<SP>" + "\n";
macroEnd += "URL GOTO=file:{{!FOLDER_DATASOURCE}}\\メルカリ\\result\\02_price.csv" + "\n"; //ファイルを開く


//=================================================================
// JavaScriptエリア
//=================================================================
for (var loop=1; loop<=9999; loop++){

   // -------------------------------------------------
   // 入力した商品数の価格を変更した場合(macroEnd)
   // -------------------------------------------------
   if (loop > num){
     iimPlay(macroEnd);
     iimClose();
   }

   // -------------------------------------------------
   // 商品価格を変更(macro)
   // -------------------------------------------------
   else{
     iimPlay("mercari/setting");  //★【setting.iim(外部ファイル)】を動かす
     var rand = iimGetExtract(2); //★【setting.iim】の上から2番目(PRICE_TIME)を取得
     iimSet("rand", rand);
     iimSet("loop", loop);
     iimPlay(macro);
   }
}
JavaScriptエリア解説
  • 特に難しい処理はないので解説はなしです。
03_relist.js
/*
Macro Name: 03_relist.js
Macro URL: https://teilab.net/imacros_mercari/
Author: teilab(テイくん)
Version: 2.0.5
*/


//=================================================================
// JavaScriptエリア
//=================================================================
//任意の商品数の再出品できるようにする処理
var num = prompt("再出品したい商品数を入力してください\n※『01_db_mercari.csv』の上から順番に出品します。\n ");
    if(num == null) {
      iimClose();
    }

    else if(num == "") {
      alert("数値は必須事項です");
      iimClose();
    }

    else if(isNaN(num) || !(num >=1 && num <=9999)) {
      alert("1~9999までの数値(半角)を入力してください");
      iimClose();
    }

//「メルカリフォルダ」内に「resultフォルダ」を作成
var foldername = "result";
imns.FIO.makeDirectory(imns.Pref.getFilePref('defdatapath').path+"\\メルカリ\\"+foldername);


//=================================================================
// iMacrosエリア
//=================================================================
// -------------------------------------------------
// 出品をする(macro)
// -------------------------------------------------
var macro = "CODE:";
macro += "SET !REPLAYSPEED FAST" + "\n";
macro += "SET !ERRORIGNORE YES" + "\n";

//「01_mercari_date.csv」をセット
macro += "SET !DATASOURCE {{!FOLDER_DATASOURCE}}\\メルカリ\\01_mercari_date.csv" + "\n";
macro += "SET !DATASOURCE_LINE {{loop}}" + "\n";

//TOPページにアクセス
macro += "URL GOTO=https://www.mercari.com/jp/mypage/" + "\n";

//出品マークをクリック
macro += "TAG POS=1 TYPE=I ATTR=CLASS:icon-camera*" + "\n";

//「出品画像」を挿入
macro += "SET IMG_FOLDER {{!FOLDER_DATASOURCE}}\\メルカリ\\img" + "\n"; //長いので「imgフォルダパス」の変数を設定
macro += "SET !TIMEOUT_PAGE 2" + "\n";  //遅延対策
macro += "SET !REPLAYSPEED MEDIUM" + "\n"; //速度調節
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_1.jpg" + "\n";   //1個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_2.jpg" + "\n";   //2個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_3.jpg" + "\n";   //3個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_4.jpg" + "\n";   //4個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_5.jpg" + "\n";   //5個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_6.jpg" + "\n";   //6個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_7.jpg" + "\n";   //7個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_8.jpg" + "\n";   //8個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_9.jpg" + "\n";   //9個目
macro += "TAG POS=1 TYPE=INPUT:FILE FORM=* ATTR=NAME:* CONTENT={{IMG_FOLDER}}\\{{!COL2}}_10.jpg" + "\n";  //10個目
macro += "TAG POS=1 TYPE=A ATTR=TXT:編集" + "\n";
macro += "TAG POS=1 TYPE=A ATTR=TXT:完了" + "\n";

//「商品名」を入力
macro += "TAG POS=1 TYPE=INPUT:TEXT FORM=ACTION:# ATTR=NAME:name CONTENT={{!COL4}}" + "\n";

//「商品の説明」を入力
macro += "TAG POS=1 TYPE=TEXTAREA FORM=ACTION:# ATTR=NAME:description CONTENT={{!COL5}}" + "\n";

//「カテゴリー」を選択
macro += "TAG POS=1 TYPE=LABEL ATTR=TXT:カテゴリー*" + "\n";
macro += "TAG POS=R1 TYPE=SELECT FORM=* ATTR=NAME:* CONTENT=${{!COL6}}" + "\n";       // カテゴリー1個目
macro += "SET CATEGORY_2 EVAL(\"'{{!COL7}}'.replace(/(.*?)用\\).*/g,'$1用)');\")" + "\n"; // カテゴリー2の「ベビー服とキッズ服」だけ半角空白があるためこの処理がないとエラーが起きる!
macro += "TAG POS=R1 TYPE=SELECT FORM=* ATTR=NAME:* CONTENT=${{CATEGORY_2}}*" + "\n"; // カテゴリー2個目
macro += "TAG POS=R1 TYPE=SELECT FORM=* ATTR=NAME:* CONTENT=${{!COL8}}" + "\n";       // カテゴリー3個目

//「サイズ」を選択
macro += "TAG POS=1 TYPE=LABEL ATTR=TXT:サイズ*" + "\n";
macro += "TAG POS=R1 TYPE=SELECT FORM=* ATTR=NAME:* CONTENT=${{!COL9}}" + "\n";

//「ブランド」を入力
macro += "TAG POS=1 TYPE=LABEL ATTR=TXT:ブランド*" + "\n";
macro += "TAG POS=R1 TYPE=INPUT:TEXT FORM=ACTION:# ATTR=NAME:brandName CONTENT={{!COL10}}" + "\n";

//「商品の状態」を選択
macro += "TAG POS=1 TYPE=LABEL ATTR=TXT:商品の状態*" + "\n";
macro += "TAG POS=R1 TYPE=SELECT FORM=* ATTR=NAME:* CONTENT=${{!COL11}}" + "\n";

//「配送料の負担」を選択
macro += "TAG POS=1 TYPE=LABEL ATTR=TXT:配送料の負担*" + "\n";
macro += "TAG POS=R1 TYPE=SELECT FORM=* ATTR=NAME:* CONTENT=${{!COL12}}" + "\n";

//「配送の方法」を選択
macro += "TAG POS=1 TYPE=LABEL ATTR=TXT:配送の方法*" + "\n";
macro += "TAG POS=R1 TYPE=SELECT FORM=* ATTR=NAME:* CONTENT=${{!COL13}}" + "\n";

//「発送元の地域」を選択
macro += "TAG POS=1 TYPE=LABEL ATTR=TXT:発送元の地域*" + "\n";
macro += "TAG POS=R1 TYPE=SELECT FORM=* ATTR=NAME:* CONTENT=${{!COL14}}" + "\n";

//「発送までの日数」を選択
macro += "TAG POS=1 TYPE=LABEL ATTR=TXT:発送までの日数*" + "\n";
macro += "TAG POS=R1 TYPE=SELECT FORM=* ATTR=NAME:* CONTENT=${{!COL15}}" + "\n";

//「価格」を入力
macro += "TAG POS=1 TYPE=INPUT:NUMBER FORM=ACTION:# ATTR=* CONTENT={{!COL16}}" + "\n";
macro += "SET !REPLAYSPEED FAST" + "\n"; //速度調節終了
macro += "SET !TIMEOUT_PAGE 60" + "\n"; //遅延対策終了

macro += "WAIT SECONDS={{rand}}" + "\n"; //★ランダム(ユーザ設定した)待ち時間

//「出品する」をクリック
macro += "TAG POS=1 TYPE=BUTTON FORM=* ATTR=TXT:出品する " + "\n";
macro += "WAIT SECONDS=3" + "\n"; //読み込みが遅い場合があるので待ち時間必須

//再出品した商品のURL抜き出す
macro += "TAG POS=1 TYPE=A ATTR=HREF:https://www.mercari.com/jp/mypage/items/* EXTRACT=HREF" + "\n";
macro += "SET URL {{!EXTRACT}}" + "\n";
macro += "SET !EXTRACT NULL" + "\n";

//再出品が成功したかURLに「mypage」が含まれているかで判定
macro += "SET TRIMMED EVAL(\"'{{URL}}'.replace(/.*jp\\/(.*?)\\/.*/g,'$1');\")" + "\n"; //「mypage」以外を除去。URLが変化した場合の対策
macro += "SET MARK1 EVAL(\"var s = '{{TRIMMED}}'; if(s === 'mypage'){s = '◯';} else{s = '☓';} \") " + "\n"; //失敗は☓(#EANF#)、成功は◯
macro += "SET !EXTRACT NULL" + "\n";

////JavaScriptに受け渡すデータ取得エリア////
macro += "ADD !EXTRACT {{URL}}" + "\n";                     //再出品した商品URL
macro += "ADD !EXTRACT {{!COL4}}" + "\n";                   //商品名
macro += "ADD !EXTRACT {{MARK1}}" + "\n";                   //判定①(出品)
macro += "WAIT SECONDS=2" + "\n";

// -------------------------------------------------
// 出品できた商品を削除(macroDelete)
// -------------------------------------------------
var macroDelete = "CODE:";
macroDelete += "SET !REPLAYSPEED FAST" + "\n";
macroDelete += "SET !ERRORIGNORE YES" + "\n";

//「01_mercari_date」ファイルをセット
macroDelete += "SET !DATASOURCE {{!FOLDER_DATASOURCE}}\\メルカリ\\01_mercari_date.csv" + "\n";
macroDelete += "SET !DATASOURCE_LINE {{loop}}" + "\n";

//再出品した商品ページに移動
macroDelete += "URL GOTO={{!COL3}}" + "\n";
macroDelete += "TAG POS=1 TYPE=BUTTON ATTR=TXT:この商品を削除する" + "\n";
macroDelete += "WAIT SECONDS=2" + "\n";
macroDelete += "TAG POS=1 TYPE=BUTTON FORM=ACTION:/jp/mypage/items/cancel/* ATTR=TXT:削除する" + "\n";

//削除が成功したか「商品を削除しました」で判定
macroDelete += "TAG POS=1 TYPE=DIV ATTR=TXT:商品を削除しました EXTRACT=TXT" + "\n";
macroDelete += "SET TRIMMED EVAL(\"'{{!EXTRACT}}'.replace(/ /g,'').replace(/\\s/g,'');\")" + "\n"; //いらない空白と改行を除去
macroDelete += "SET MARK2 EVAL(\"var s = '{{TRIMMED}}'; if(s === '商品を削除しました'){s = '◯';} else{s = '☓';} \") " + "\n"; //失敗は☓(#EANF#)、成功は◯
macroDelete += "SET !EXTRACT NULL" + "\n";

////JavaScriptに受け渡すデータ取得エリア////
macroDelete += "ADD !EXTRACT {{MARK2}}" + "\n"; //判定②(削除)

// -------------------------------------------------
// CSVファイルに結果を書き込む(macroCsv)
// -------------------------------------------------
var macroCsv = "CODE:";
macroCsv += "SET !REPLAYSPEED FAST" + "\n";
macroCsv += "SET !ERRORIGNORE YES" + "\n";

//結果を見やすくするための処理
macroCsv += "SET URL EVAL(\"var s = '{{myUrl}}'; var x; if(s !== '#EANF#'){x = '{{myUrl}}';} x\")" + "\n"; //URLがない(#EANF#)場合は空白に変える
macroCsv += "SET MARK2 EVAL(\"var s= '{{myMarkTwo}}'; if(s !== '__undefined__'){s = '{{myMarkTwo}}';} else{s = '☓';} \") " + "\n"; //MARK2がない(__undefined__)場合は✕

////CSVファイル書き込みエリア////
macroCsv += "ADD !EXTRACT {{!NOW:yyyy/mm/dd<SP>hh:nn}}" + "\n"; //取得日
macroCsv += "ADD !EXTRACT {{URL}}" + "\n";                      //再出品した商品URL
macroCsv += "ADD !EXTRACT {{myItem}}" + "\n";                   //商品名
macroCsv += "ADD !EXTRACT {{myMarkOne}}" + "\n";                //判定①(出品)
macroCsv += "ADD !EXTRACT {{MARK2}}" + "\n";                    //判定②(削除)

//「03_result.csv」で保存
macroCsv += "SAVEAS TYPE=EXTRACT FOLDER={{!FOLDER_DATASOURCE}}\\メルカリ\\result FILE=03_relist.csv" + "\n";

// -------------------------------------------------
// //入力した商品数を処理した場合(macroEnd)
// -------------------------------------------------
var macroEnd = "CODE:";
macroEnd += "SET !REPLAYSPEED FAST" + "\n";
macroEnd += "PROMPT 再出品が完了しました。<br><br>※結果は以下の場所に保存されています。<br>{{!FOLDER_DATASOURCE}}\\メルカリ\\result\\03_relist.csv<SP>" + "\n";
macroEnd += "PROMPT 重複しないように再出品した分のデータを削除してください!" + "\n";
macroEnd += "URL GOTO=file:{{!FOLDER_DATASOURCE}}\\メルカリ\\result\\03_relist.csv" + "\n"; //ファイルを開く


//=================================================================
// JavaScriptエリア
//=================================================================
for (var loop=1; loop<=9999; loop++){

  // -------------------------------------------------
  // 出品をする(macro)
  // -------------------------------------------------
  iimPlay("mercari/setting");  //★【setting.iim(外部ファイル)】を動かす
  var rand = iimGetExtract(3); //★【setting.iim】の上から3番目(RELIST_TIME)を取得
  iimSet("rand", rand);
  iimSet("loop", loop);
  iimPlay(macro);
  //jsにデータを受け渡す
  var myUrl = iimGetExtract(1);      //再出品した商品URL
  var myItem = iimGetExtract(2);     //商品名
  var myMarkOne = iimGetExtract(3);  //判定①(出品)
  //iimにデータを受け渡す(jsデータはiimで使用不可のため)【重要】
  iimSet("myUrl", myUrl);
  iimSet("myItem", myItem);
  iimSet("myMarkOne", myMarkOne);

  // -------------------------------------------------
  // 出品できた商品を削除(macroDelete)
  // -------------------------------------------------
  if (myMarkOne === "◯"){
    iimSet("loop", loop); //再度セット
    iimPlay(macroDelete);
    // -------------------------------------------------
    // CSVファイルに結果を書き込む(macroCsv)
    // -------------------------------------------------
    var myMarkTwo = iimGetExtract(1); //判定②(削除)
    iimSet("myMarkTwo", myMarkTwo);
    iimSet("myUrl", myUrl); //再度セット
    iimSet("myItem", myItem); //再度セット
    iimSet("myMarkOne", myMarkOne); //再度セット
    iimPlay(macroCsv);

    // -------------------------------------------------
    // 入力した商品数を処理した場合(macroEnd)
    // -------------------------------------------------
    if (loop + 1 > num){
      iimPlay(macroEnd);
      iimClose();
    }
  }

  // ※ここからは出品できなかった場合の処理
  // -------------------------------------------------
  // CSVファイルに結果を書き込む(macroCsv)
  // 入力した商品数を処理した場合(macroEnd)
  // -------------------------------------------------
  else if (loop + 1 > num){
    iimPlay(macroCsv);
    iimPlay(macroEnd);
    iimClose();
  }

  // -------------------------------------------------
  // CSVファイルに結果を書き込む(macroCsv)
  // -------------------------------------------------
  else {
    iimPlay(macroCsv);
  }
}
JavaScriptエリア解説
  • セット(iimSet)した変数は一度Macroを動かすと初期化されます。次のMacroで同じ変数を使う場合でも再度セットする必要があります。
  • JavaScriptの変数をそのままiMacrosで使う場合もセットする必要があります。ただしiMacrosより上に変数を定義した場合は例外です。
緑色:メモ書き(コメントアウト)
青色:コマンド解説(リンク)
iim
'Macro Name: setting.iim
'Macro URL: https://teilab.net/imacros_mercari/
'Author: teilab(テイくん)
'Version: 2.0.4


'==============================================================
'ランダム待機時間の設定する場所です
'デフォルトで問題はないと思いますが心配な方は時間を変更して頂ければと思います
'単位は全て秒です(MIN=最小値、MAX=最大値)
'==============================================================
SET !REPLAYSPEED FAST
SET !ERRORIGNORE NO

'--------------------------------------------------------------
'01_mercari_date.js【出品中データ取得】
'デフォルト 1~2秒
'--------------------------------------------------------------
SET MIN 1
SET MAX 2

SET MERCARI_DATE_TIME EVAL("Math.floor(Math.random() * ({{MAX}} - {{MIN}} + 1)) + {{MIN}};")

'--------------------------------------------------------------
'02_price.js【価格変更】
'デフォルト 5~10秒
'--------------------------------------------------------------
SET MIN 5
SET MAX 10

SET PRICE_TIME EVAL("Math.floor(Math.random() * ({{MAX}} - {{MIN}} + 1)) + {{MIN}};")

'--------------------------------------------------------------
'03_relist.js【再出品】
'デフォルト 360秒(6分)~600秒(10分)
'--------------------------------------------------------------
SET MIN 360
SET MAX 600

SET RELIST_TIME EVAL("Math.floor(Math.random() * ({{MAX}} - {{MIN}} + 1)) + {{MIN}};")


'jsにデータを受け渡すための処理
ADD !EXTRACT {{MERCARI_DATE_TIME}}
ADD !EXTRACT {{PRICE_TIME}}
ADD !EXTRACT {{RELIST_TIME}}
iimの解説
  • setting.iimを作成した理由は、少しでもユーザビリティーを上げるためです。自分一人で使う場合は各ファイル(.js)に直接書き込みますが、プログラムに詳しく無い方が編集すると間違える可能性がありますので、編集する場所を一箇所に集約しています。
  • SET(MIN MAX)を定義する理由も上記と同様です。
  • 各ファイル(.js)で iimPlay(“mercari/setting”)を使ってsetting.iimを動かしvar rand = iimGetExtract()で吸い出した値をランダム待ち時間に使っています。

9. まとめ

メルカリの再出品や価格変更を自動化する方法をご紹介しました。

ただ、自動化できて簡単だからと言って過度に使用するのは控えましょう。

アカウント停止や圏外飛ばしになる確率が高まりますので注意が必要です。

まとめ
  • Firefox、iMacrosのダウングレードが必要
  • 各ファイル毎に役割が分かれている
  • 個別サポートはなし
  • 1日の使用頻度に要注意