【前回の記事】
⇒ショッピーズへの出品を自動化するVBAプログラムを組んでみる①
⇒ショッピーズへの出品を自動化するVBAプログラムを組んでみる②
前回までで基本的な入力項目、カテゴリ等の選択処理が完了しましたので、今回は画像をセットする部分の処理を実装していきます。
商品画像を設定する
画像は出品フォームにある下図部分を「クリック」することでダイアログが開きますので、そこでファイルを選択する形になります。
では早速、どういう構造になっているのかソースを確認してみます。
「id=”fileUp”」という、見るからに画像ファイルのアップロード関連だなと思われるdivタグが存在し、その中にbox0~box3までの子要素があるのが分かります。
box0がメイン画像、box1~box3がそれぞれサブ画像の要素となります。
では「id=”box0″」のdivタグを更に展開してみましょう。
「id=”file0″」と書かれたinputタグが見つかりました。データの受け取りには「inputタグ」。基本ですね。
これをクリックすることでファイル選択ダイアログが開きますので、早速処理を記述していきます。
ファイル選択ダイアログの操作
『idが設定されているから、getElementByIdを使って・・・』
objIE.document.getElementById("file0").Click
『できた!』
ではだめですよ!
上の処理だとinputタグ部分をクリックする所まではできますが、その後のダイアログ操作ができなくなりますので注意しましょう。
詳しくは以下の記事を参照して下さい。
【参考:商品画像登録用のファイル選択ダイアログはsetTimeoutを使って動かす】
クリックしてダイアログの操作を行う場合、クリック部分の処理は以下の様に記述します。
objIE.document.Script.setTimeout "javascript:document.getElementById('file0').click()"
前回までのVBAプログラムの最後に上記1行を追加すると、カテゴリ選択完了後に「ファイル選択ダイアログ」が出現する所まで確認できると思います。
一応カテゴリ選択後の処理の後に、「Sleep 1000」などを入れて置くと良いと思います。
ダイアログに操作処理については以下の記事に全て記載しておりますので、今回内容については触れません。
とりあえず上記記事を参考に、
Public Sub clickAndPostToIEDialog(formTitle As String, filePath As String)
この様な感じで『ダイアログのフォーム名』と、『ファイル名の箇所にセットするファイルパス』を引数として渡す形にした関数を用意しておきます。
それを踏まえてこんな感じで処理を記述します。
Sleep 1000 objIE.document.Script.setTimeout "javascript:document.getElementById('file0').click()", 1000 Call clickAndPostToIEDialog("アップロードするファイルの選択", "xxxxxx") '←パスは変更して使用 Sleep 1000 objIE.document.Script.setTimeout "javascript:document.getElementById('file1').click()", 1000 Call clickAndPostToIEDialog("アップロードするファイルの選択", "xxxxxx") Sleep 1000 objIE.document.Script.setTimeout "javascript:document.getElementById('file2').click()", 1000 Call clickAndPostToIEDialog("アップロードするファイルの選択", "xxxxxx")
※今回はメイン画像、サブ画像1~2までを設定しています。
もちろん、objIE.document.Script.setTimeoutで指定している「file0~2」の部分を「file3」にすれば、サブ画像3枚目にも画像が設定できる様になります。
ぜひ試してみて下さい。
配送方法の選択
ここまで出来ればほぼ完成ですが、最後に必須項目となっている「配送方法」だけついでに実装してしまいましょう。
やり方はカテゴリと同じですので簡単ですね。
では早速ソースを確認してみます。
この部分に書かれているアンカータグのid値を使って・・・
使って・・・
なぜかidが空欄になってる。
もちろん空欄だからといって「objIE.document.getElementById(“”).Click」と記述してもクリックできないので注意して下さいね!
idを直接指定する方法だと1行で済むので楽なのですが、こうなってしまったら仕方が無いので、クラス名を使って調べましょう。
配送方法のアンカータグのクラス名に設定されている「sendMethodPop_open」という単語を検索ワードとして、以下の様な処理を記述します。
'配送方法の選択ボタンをクリック Set objAnchorAll = objDiv.getElementsByTagName("a") For Each objAnchor In objAnchorAll If InStr(objAnchor.className, "sendMethodPop_open") > 0 Then objAnchor.Click Exit For End If Next
これでクラス名に「sendMethodPop_open」が使われているアンカータグがクリックされる様になります。
後は配送方法の選択画面が表示されますので、好きな方法を選択後に決定ボタンを押します。
'配送方法を選択して閉じる '「sendMethod1」= 普通郵便 objIE.document.getElementById("sendMethod1").Click Sleep 1000 '「sendMethodFin」= 決定ボタン objIE.document.getElementById("sendMethodFin").Click Sleep 2000
最初のクリック処理に記述している「sendMethod1」というのが普通郵便の選択にあたります。
最後の数字部分はそのまま配送方法の掲載順になっているため、「sendMethod0」であれば未定、「sendMethod2」であればゆうパックがそれぞれ選択されることになります。
処理の合間合間にSleepを挟んでいますが、もう少し短くしても問題無いとは思います。ただし短くし過ぎると安定性が損なわれる可能性がありますので、特に急ぐ必要が無い場合は一つ一つの処理の合間に2~3秒程度の間隔を設けると良いと思います。
Sleepだと確実性に欠けて困るという場合は、do~loop等を駆使して方法を考えてみて下さい。
まとめ
いかがでしたでしょうか!
私も今回はどこまで実装できるか分からない状態だったのですが、メルカリやラクマと比べると思った以上に簡単に操作できましたね。
本当は出品ページ下部にある「確認」ボタンを押して内容の確認ページに飛んだ後、「出品」を行うまでが必要なのですが・・・
ここまで読まれて来た方ならその部分の処理は解説不要でしょう!
という訳でショッピーズ編もこれにて終了です。
出品代行のアルバイトを雇うなんてもったいない事はせず、ぜひオール自動化にチャレンジしてみて下さいね。
今回のメイン処理部分のコードは以下の通り。
※関数化してないので無駄だらけです。
Option Explicit 'ショッピーズのドメイン Const DOMAIN_SHOPPIES = "shoppies.jp/" 'ショッピーズの出品ページURL Const URL_SHOPPIES_EXHIBIT = "https://shoppies.jp/write-item_sp" '----------------------------------------------------------------- 'ショッピーズの出品ページにデータを自動入力させる処理 '----------------------------------------------------------------- Sub main() Dim objIE As InternetExplorer Dim objDiv As Object Dim objAnchorAll As Object Dim objAnchor As Object Set objIE = getRunningIE("", DOMAIN_SHOPPIES) objIE.Navigate2 URL_SHOPPIES_EXHIBIT waitBrowseLoading objIE '商品名をセット objIE.document.getElementById("titleInput").Value = "商品名Test" objIE.document.getElementById("explanation").Value = "商品説明Test" objIE.document.getElementById("inputPrice").Value = "7777" '第一カテゴリのクリック objIE.document.getElementById("categoryChoice").Click Sleep 2000 Set objDiv = objIE.document.getElementById("mCSB_1_container") Set objAnchorAll = objDiv.getElementsByTagName("a") For Each objAnchor In objAnchorAll If Trim(objAnchor.innerText) = "ファッション" Then objAnchor.Click Exit For End If Next '第二カテゴリのクリック Sleep 1000 Set objDiv = objIE.document.getElementById("mCSB_2_container") Set objAnchorAll = objDiv.getElementsByTagName("a") For Each objAnchor In objAnchorAll If Trim(objAnchor.innerText) = "トップス" Then objAnchor.Click Exit For End If Next '第三カテゴリのクリック Sleep 1000 Set objDiv = objIE.document.getElementById("mCSB_3_container") Set objAnchorAll = objDiv.getElementsByTagName("a") For Each objAnchor In objAnchorAll If Trim(objAnchor.innerText) = "Tシャツ(半袖 / ノースリーブ)" Then objAnchor.Click Exit For End If Next '配送方法をクリック Set objAnchorAll = objDiv.getElementsByTagName("a") For Each objAnchor In objAnchorAll If InStr(objAnchor.className, "sendMethodPop_open") > 0 Then objAnchor.Click Exit For End If Next '配送方法を選択して閉じる '「sendMethod1」= 普通郵便 objIE.document.getElementById("sendMethod1").Click Sleep 1000 '「sendMethodFin」= 決定ボタン objIE.document.getElementById("sendMethodFin").Click Sleep 2000 Sleep 1000 objIE.document.Script.setTimeout "javascript:document.getElementById('file0').click()", 1000 Call clickAndPostToIEDialog("アップロードするファイルの選択", "E:\sample.jpg") '←パスは変更して使用 Sleep 1000 objIE.document.Script.setTimeout "javascript:document.getElementById('file1').click()", 1000 Call clickAndPostToIEDialog("アップロードするファイルの選択", "E:\sample2.jpg") Sleep 1000 objIE.document.Script.setTimeout "javascript:document.getElementById('file2').click()", 1000 Call clickAndPostToIEDialog("アップロードするファイルの選択", "E:\sample3.jpg") End Sub