2007-09-23 エアコン高ぇー
■[UWSC][楽天]楽天自動1円入札スクリプト改定
普段からチマチマと手を入れているけれど、今回はUWSCローカルな機能からDOMへの転換を微妙に進めてみた。
CONST UserID="" //楽天ユーザーID CONST password="" //楽天パスワード CONST logfile="楽天入札IE.log" //ログファイル名 CONST URL_list="URL_list.txt" //入札対象URLリストファイル名 CONST URL_fin="URL_fin.txt" //入札完了済みURLリストファイル名 IE = CreateOLEObj("InternetExplorer.Application") IE.Visible = True t=gettime() p=0 //URLリストファイルの最終行に空行を追加 listfile = FOPEN(URL_list,F_READ or F_WRITE) line = FGET(listfile,F_LINECOUNT) if FGET(listfile,line)<>"" then FPUT(listfile,"",line+1,F_INSERT) FCLOSE(listfile) //ループ開始 While 1 fukidasi() listfile = FOPEN(URL_list,F_READ or F_WRITE) URL = FGET(listfile,1) FCLOSE(listfile) ifb URL="" t=gettime()-t LogWrite(logfile,"入札完了 入札成功件数="+p+" 所要時間="+t+"秒") IE.Quit // IE終了 exit endif IE.Navigate(URL) if BusyWait(IE)=0 then continue //サーバごとに入札ボタン等の検索 //サーバがwww.rakuten.co.jp の場合 ifb pos("http://www.rakuten.co.jp",URL) fukidasi("出品個数チェック開始") NoAstr = "" NoBstr = "" NoA = "" NoB = "" postage_str="" postage=0 str="" fukidasi() fukidasi("出品個数チェック中") td_tag = IE.document.body.all.tags("TD") td_tag_length = td_tag.Length fukidasi() fukidasi("td_tag_length = "+td_tag_length) for i = 0 to td_tag_length - 3 str=td_tag.item[i].innerText ifb str="取扱個数" and td_tag.item[i+2].innerText="現在の入札件数" NoA_str=td_tag.item[i+1].innerText NoB_str=td_tag.item[i+3].innerText NoA=VAL(token("個",NoA_str)) NoB=VAL(token("件",NoB_str)) break endif ifb i >= td_tag_length - 3 LogWrite(logfile,"出品数チェック失敗:"+URL) URL_Rotate(URL) continue 2 endif next fukidasi() ifb NoA>=NoB //出品数大杉で後まわし LogWrite(logfile,"出品数大杉:"+URL) URL_Rotate(URL) continue endif //入札ボタンを探してクリック input_tag = IE.document.all.tags("input") for i = 0 to input_tag.Length - 1 ifb pos("入札",input_tag.item[i].value)<>0 input_tag.item[i].click() break endif next //サーバがsa.item.rakuten.co.jp もしくは www.rakuten.ne.jp の場合 elseif pos("http://sa.item.rakuten.co.jp/",URL) or pos("www.rakuten.ne.jp",URL) fukidasi("出品個数チェック開始") NoA = "" NoB = "" postage_str="" postage=-1 i=0 str="" fukidasi("出品個数チェック中") font_tag = IE.document.body.all.tags("FONT") font_tag_length = font_tag.Length for i = 0 to font_tag_length - 6 str=font_tag.item[i].innerText ifb str="出品個数" fukidasi() fukidasi("出品個数発見 i="+i) ifb font_tag.item[i+1].innerText=":" and font_tag.item[i+3].innerText="入札件数" and font_tag.item[i+4].innerText=":" fukidasi() fukidasi("出品個数発見:確定 i="+i) NoA=VAL(font_tag.item[i+2].innerText) NoB=VAL(font_tag.item[i+5].innerText) fukidasi("出品個数="+NoA+"<#CR>入札件数="+NoB) break endif elseif str="送料" fukidasi() fukidasi("送料発見 i="+i) ifb font_tag.item[i+1].innerText=":" fukidasi() fukidasi("送料発見:確定 i="+i) postage_str=font_tag.item[i+2].innerText fukidasi() fukidasi("送料="+postage) postage=VAL(token("円",postage_str)) endif endif ifb i >= font_tag_length - 6 LogWrite(logfile,"送料・出品数チェック失敗:"+URL) URL_Rotate(URL) continue 2 endif next fukidasi() ifb NoA>=NoB //出品数大杉で後まわし fukidasi("出品個数="+NoA+"<#CR>入札件数="+NoB) LogWrite(logfile,"出品数大杉:"+URL) URL_Rotate(URL) continue endif //入札ボタンを探してクリック input_tag = IE.document.all.tags("input") for i = 0 to input_tag.Length - 1 ifb pos("入札",input_tag.item[i].value)<>0 input_tag.item[i].click() break endif next else //未知のURLパターン発見で後まわし fukidasi("未知のURLパターン発生") URL_Rotate(URL) continue endif fukidasi("出品個数="+NoA+"<#CR>入札件数="+NoB+"<#CR>送料="+postage) if BusyWait(IE)=0 then continue //ログイン IE.document.fm1.u.value = UserID IE.document.fm1.p.value = password fm1_input = IE.document.fm1.all.tags("input") fm1_input.item[fm1_input.length-1].click if BusyWait(IE)=0 then continue //入札価格・個数・支払方法選択 IE.document.forms[0].bid_price.value = "1" IE.document.forms[0].bid_units.value = "1" ifb IE.document.getElementsByName["settlement"].length >1 IE.document.forms[0].settlement[0].checked = true endif IE.document.forms[0].S001.click if BusyWait(IE)=0 then continue //入札内容の確認 ifb pos("箇所の入力エラーがあります。",IE.document.body.innerText) t=gettime()-t LogWrite(logfile,"入力エラー発生 入札件数="+p+" 所要時間="+t+"秒") exit endif input_tags = IE.document.all.tags("input") for i = 0 to input_tags.Length - 1 if input_tags.item[i].type = "checkbox" then input_tags.item[i].checked = false next IE.document.forms[0].S001[1].click //利用規約に同意して入札する While pos("【楽天市場】入札の完了",IE.LocationName)=0 tm = Gettime() ifb Gettime() - tm > 90 ifb BusyWait(IE)=0 ifb pos("【楽天市場】入札エラー",IE.LocationName)<>0 continue 2 else exit endif endif endif Sleep(0.2) Wend p=p+1 //URLを完了済みリストへ移動 ifb FOPEN(URL_fin,F_EXISTS) listfile2 = FOPEN(URL_fin,F_READ or F_WRITE) else listfile2 = FOPEN(URL_fin,F_WRITE) endif FPUT(listfile2,URL,1,F_INSERT) FCLOSE(listfile2) //元リストから削除 listfile = FOPEN(URL_list,F_READ or F_WRITE) FDELLINE(listfile,1) FCLOSE(listfile) Wend //指定URLをリスト末尾へ移動させる Procedure URL_Rotate(URL) listfile = FOPEN(URL_list,F_READ or F_WRITE) FPUT(listfile,URL) FDELLINE(listfile,1) FCLOSE(listfile) Fend //------ Function BusyWait(ie) Sleep(0.5) // Wait Const TIME_OUT = 90 tm = Gettime() repeat Sleep(0.2) id = GETID("セキュリティの警告","#32770") if id<>-1 then CLKITEM(id,"OK",CLK_ACC) id = GETID("セキュリティ情報","#32770") if id<>-1 then CLKITEM(id,"はい",CLK_ACC) ifb Gettime() - tm > TIME_OUT fukidasi("Time Out:BusyWait") RESULT = 0 Exit endif until (! ie.busy) and (ie.readyState=4) Sleep(0.5) RESULT = 1 Fend //ログファイル作成・書き込み Procedure LogWrite(filename,str) GETTIME() str = G_TIME_YY2+"/"+G_TIME_MM2+"/"+G_TIME_DD2+" "+G_TIME_HH2+":"+G_TIME_NN2+"<#TAB>"+str ifb FOPEN(filename,F_EXISTS) file = FOPEN(filename,F_READ or F_WRITE) else file = FOPEN(filename,F_WRITE) endif FPUT(file,str,1,F_INSERT) FCLOSE(file) Fend
主な変更点は以下の通り
- メイン関数におけるウィンドウID使用の廃止
- IEGETDATA・IESETDATAの使用停止
- 支払方法選択のDOM使用による高速化(してるはず)
- 入札完了後の読み込み完了待ちを省略
- BusyWait()関数にセキュリティ警告のポップアップ処理を追加(←コレなんで加えたんだったっけ?)
……こんなもんかな。UWSC独自のIE操作関数を廃止することで他の環境への移植が容易になったと思います。
というか、もはやUWSCで書く必要ないんじゃね?とか思ったりもするけれど、部分的にテストしたりするのには便利なんだよね。