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で書く必要ないんじゃね?とか思ったりもするけれど、部分的にテストしたりするのには便利なんだよね。
[コメントを書く]