萌えないゴミ最終処分場 はてなダイアリー支部

2007-09-23 エアコン高ぇー

取り付け工事費と撤去費用が。特に通販。

それでもトータルで家電量販店より安くなるとは思うけど、万が一の場合のクレームの窓口は統一しておいたほうが良い。

それが代理店の主要な機能の一つだ。

[][]楽天自動1円入札スクリプト改定 04:11

6/2スクリプトを改定してみました。

普段からチマチマと手を入れているけれど、今回は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で書く必要ないんじゃね?とか思ったりもするけれど、部分的にテストしたりするのには便利なんだよね。

総アクセス数