ということで、自分用に作ったメルカリ自動操作用ツールの解説です。考え方や注意点などの紹介となります。
開発経緯
企業が開発しているウェブベースのツールだったり、個人が開発している実行ファイル形式のツールだったりと、メルカリの自動化ツールなんて世の中に大量に出回っています。(規約改訂で半数近くが消えていきましたが)
なぜわざわざ一から作ろうと思ったのか。
だって・・・他人が儲けるのって悔しいじゃないですか!!!
ツールを販売しているのが個人だと特に!!
・・・心が狭い?知ってます。
それに月額制っていうのが好きではないことも原因の一つですね。高いツールだと月額1万円以上掛かるらしいですし。
以前は私も「メルポン」を利用していたのですが、月額会員にはなっていなかったので出品の度に15円の費用が掛かっていました。他にも出品後の商品の管理のし辛さであったり、レスポンスが遅く修正に時間が掛かったりと色々ストレスを感じていたこともあり、2ヶ月程で見切りを付けました。
ちなみに今回完成させる物は自動操作を行って「出品させる部分だけ」なので、リストの連続出品や再出品の仕組みについてはご自身で追加してみて下さい。ForとかDoとかを使えば簡単に作れます。
また、このツールは「SendKeys」を多用しています。そのため配布するプログラム等にはあまり適さないため、「使えるなら何でもいい!なりふり構わない!」という方のみ読み進めて下さい。
商品登録画面の操作方法
通信を解析してAPIを割り出して・・・なんてことはしません。今回の登録は”画面操作”を行っての登録となります。
画面を確認すると、以下の3つの形式の入力操作を行う必要があることが分かると思います。
- 画像ファイルアップロード用ダイアログの操作
- 商品名などのテキスト入力操作
- 出品カテゴリなどのプルダウンメニュー操作
ダイアログの操作についてはメルカリに限らずどの場所でも使用する可能性のある汎用性の高い処理であるため、別記事にて紹介しています。
■VBAでファイル選択ダイアログを自動操作する(新しいタブで開きます。)
では今回は2、3の内容について実装していきましょう。
テキスト部分の入力操作
早速ページ上のソース部分を確認してみましょう。
「<input class=”input-default” value=”” placeholder=”商品名(必須 40文字まで)”>」
上記の部分が商品名のinputタグです。
Set objAll = ie.document.getElementsByTagName("input")
For Each obj In objAll
If InStr(obj.placeholder, "商品名") > 0 Then
obj.Focus
obj.Value = d.name
sendKeysWait " ", 300
sendKeysWait "{BACKSPACE}", 200
Exit For
End If
Next
'Sendkeysの待機秒数追加版'
Sub sendKeysWait(keys As String, msec As Integer)
SendKeys keys, True
Sleep msec
End Sub
class名に使用されている「input-default」は価格入力用のタグでも使用されているため、「placeholder」に「商品名」という文字列があるかどうかでチェックします。
「obj.Value = d.name(商品名文字列)」と記述すると見た目上は値がセットされていますが、カテゴリの変更や画像の登録などの画面情報が更新される操作を行うと、先ほどセットした商品名が消えてしまいます。
これは、ユーザーの操作に対応して実行されるjavascript等が動いて無いためだと思われます。分かりやすいのは販売価格を入力した時ですね。
販売価格を手入力すると、本来であれば以下の画像の様に「販売手数料」と「販売利益」の値が自動的に計算されて表示されます。
じゃあjavascriptを動かすために「fireEvent( “onchange” )」で動かせばいいのかな?と思い試してみたのですが・・・うーん反応しない。それでフォーカスした後に値をセットしてみたり、入力箇所をクリックしてみたりと色々試してみたのですが、手入力の様に自動計算はしてくれませんでした。
なので仕方無く、
「フォーカスして値をセット」 ⇒ 「SendKeysで適当な文字を入力」 ⇒ 「SendKeysで先ほど入力した文字を削除」
という方法を用いています。
現在この処理で数千件の出品を行っていますが、今の所SendKeysの誤作動は特にありません。また、万が一SendKeysがうまく入らずに商品名等の値が消えてしまっても、テキスト入力部分は全て”必須項目”のため出品が行われることはありません。安心して使って下さい。
以上の手順で「商品名」と「商品説明」についてはクリアできました。
販売価格の欄はこれでも動いてくれなかったため、値の入力からSendKeysで行っています。注意点として、例えば「3,000円」を入力したい場合は
SendKeys "3"
SendKeys "0"
SendKeys "0"
SendKeys "0"
としてもうまくいきません。「300」を入力した時点で自動計算処理が走ってしまうため、その際の若干の処理ラグにより直後の入力が反映されず、最後の「0」が落ちてしまうことがあります。
この場合は、値の入力後 or 入力前に若干の待機時間を設ける処理を追加しましょう。
For priceIdx = 1 To Len(d.price)
sendKeysWait Mid(d.price, priceIdx, 1), 200 '価格入力'
Next
'Sendkeysの待機秒数追加版'
Sub sendKeysWait(keys As String, msec As Integer)
SendKeys keys, True
Sleep msec
End Sub
この様にすれば問題ありません。大体200ms程度の間隔であれば十分でした。
ちなみに「SendKeys使わなくてもいけるよ!」という方がいたらぜひ方法を教えて下さい。(^^;
完全に自分用として作ったものなのでSendKeysで妥協して仕上げましたが、使わずに済むのであればその方が良いですね。
プルダウン項目の操作
こちらもテキスト同様、値をただセットするだけではjavascriptが動いてくれません。そのため、SendKeysで動かすことがメインになります。
{TAB}と{DOWN}の組み合わせで設定できる様にしましょう。
obj.Focus 'カテゴリ1のプルダウンをフォーカス
sendKeysWait "{DOWN 3}", 200 'カテゴリ1の値をセット
sendKeysWait "{TAB}", 200 'カテゴリ2選択
sendKeysWait "{DOWN 3}", 200 '
sendKeysWait "{TAB}", 200 'カテゴリ3選択
sendKeysWait "{DOWN 3}", 200 '
'Sendkeysの待機秒数追加版'
Sub sendKeysWait(keys As String, msec As Integer)
SendKeys keys, True
Sleep msec
End Sub
あぁ・・・こんな処理を堂々と公開するなんて凄く嫌なんですが、他に良い方法が見つからないんですよ・・・
プルダウン項目の設定についてはこれだけなのですが、ここはSendKeysを多用するため特に注意が必要となります。
例えばカテゴリ1の値を選択する場合、エンタメ・ホビーの項目ではフォーカス後「SendKeys {DOWN 5}」と記述すれば設定できますが、何らかの理由で{DOWN}が4つしか送信できなかった場合は別のカテゴリになってしまいます。
残念ながら幾つ送信できたかを検知することはできませんが、カテゴリが正しく設定できたかどうかであれば判定することができます。
カテゴリのプルダウンについては上図の様な構成になっているため、
selectタグを抽出してclass名に「select-default」が設定されているものを探します。しかしこれだけではカテゴリ1のプルダウンを特定することができませんので、andで別の条件も追加してみます。
className = obj.className
If className = "select-default" And InStr(obj.innerHTML, "エンタメ・ホビー") > 0 Then
If obj.Value <> "5" Then
MsgBox "カテゴリ1の設定項目が正しくありません。"
End
End If
End If
この様に、カテゴリ1の中だけに存在する選択肢文字列を追加判定することで、目的のカテゴリのオブジェクトを判別することができます。後は「Value」の値が目的のものと一致しているかどうかを判定するだけです。
※「Value = 5」はエンタメ・ホビーの値
上のソースではメッセージを表示させた後に「End」で処理を停止させていますが、ページを更新させて最初からセットし直す様に自動化しても良いと思います。
まとめ
いかがでしょうか。
値のセット部分はSendKeysがメインとなっていますが、「プルダウン項目の操作」で記述した様に”値が正しくセットされているかどうかの確認”さえしっかりと行えば、不安定と言われるSendKeysでも安定した稼働が見込めるはずです。
しかし、操作対象のウィンドウ(IE)をアクティブにしていないといけないため、別の作業ができないなど他のデメリットは多数存在します。
配布用には向きませんが、個人で使用する分には十分だと思いますのでぜひ参考にしてみて下さい。
コメント
こんにちは、全くのVBA初心者から本サイトを熟読し作れるようになった者です。
最近メルカリにおいてVBAで自動出品すると確実に一晩でアカウント停止されるのですが、管理者様はいかがでしょうか?
繰り返し作業にはforループを用いて、時間待機は
‘ Randomize
‘ Dim time As Long
‘ time = Rnd() * 1000000
‘ ‘ランダム時間待機
‘ Sleep time
以上のメソッドで操作しています。
個人的な考察では、
・商品説明が毎回同じであるためでメルカリ側のプログラムに引っかかっている
・1つの商品を繰り返し出品しているため
・夜間もランダム時間に繰り返し出品している
以上の3つが問題であると考えているのですが、どうでしょうか?
宜しければ管理者様の不正に引っかからないプログラムの違いを教えていただきたいです。
お手数おかけしますがよろしくお願いいたします。
>全くのVBA初心者から本サイトを熟読し作れるようになった者です。
大ざっぱな説明ばかりしていて初心者の方にはだいぶ厳しい内容かと思っていましたが、自動出品まで実装できたのは素直に凄いと思います。熟読頂きありがとうございます!
さて、本題のアカウント停止される件についてですが、
>・商品説明が毎回同じ
>・1つの商品を繰り返し出品している
>・夜間もランダム時間に繰り返し出品している
この3つは私も他の方も普通に行っている事ですので、根本の原因では無いと思います。
「確実に」と言う言い方からして既に複数回アカウント停止になっている様ですが、使用したアカウントは全て新規(評価無し)アカウントでしょうか?
新規または低評価であれば、単純に1日あたりの出品回数が多すぎるせいだと思っています。個人的には評価一桁であれば1日5出品位までかなと思っています。※「5」という数に根拠は無いので参考程度にお考え下さい
また、何回もアカウント停止になっているのであればあなた自身が運営にマークされているという可能性もあります。(というか書いてて思いましたが、それが濃厚な気がします)
アカウントを停止したはずのユーザーが違うアカウントでまた出品を始めたら、違反行為(『アカウント売買』や『複数アカウント作成』)を行っていると判断されても仕方無いかと。
実験という意味で、試しに手動で出してどうなるかを見てみてはいかがでしょうか。同じく停止措置を取られたらほぼ確定だと思います。
その場合住所は変えられないでしょうから、名前や登録口座を家族名義のものに変更してみると良いかもしれません。
プログラム自体に問題がある訳では無いと思うので、一度アカウント周りや出品の仕方(主に回数)を見直してみて下さい。