溺れる者はUWSCを掴め!
ログインスクリプトをUWSCで自動生成
- 2010-05-12 (Wed)
- 実用スクリプト
通常自分の場合はログインツールとしてRoboFormを使ってるんですが、如何せん10個までしか無料で使用できないので、その他はのやつはID Managerで管理してました。 ですが、ID Managerの場合はログインし終るまでの行程が多いのが面倒。
と言うことで、UWSCで自動ログインのスクリプトを作るわけですが これまたいちいち作っるのも面倒なので、ログインスクリプトを自動で生成するスクリプトを作ってみました。
作業の流れとしては、IDとpassの管理はIDmanager等に任せるとして
ログインページを開いて該当場所にIDとパスを手動で入力→
その後生成スクリプトを起動してログインスクリプトを自動生成→
生IDとパスをテキスト保存するのはセキュリティ的に問題があるのでUWSCのAオプションでスクリプトをスクランブル→
スクランブルを掛ける際にオリジナルが自動生成されるますがオリジナルは不要なので自動で削除
以上の行程をスクリプトで実施します。
尚、自動生成したスクリプトは本スクリプトと同じホルダー内に生成されるので 必ず『ログイン』等の名前でフォルダーを作ってあげてその中に本スクリプトを入れておいてください。 でないと、他のスクリプトのオリジナルも削除しちゃう場合があります。 (一応”_login.org”という末尾でチョイスはしてますが)
仕組的には、submitボタン、画像ボタン、javascriputボタンの順番でボタンを検索するようにしてます。
submitボタンは確実に取得できますがその他はクリックして特定させてますのでクリック後のサーバーのレスポンスが早いと取得前にページを読込んでしまって希に作成できない場合もあります。その場合は再度お試しを。
IEでもsleipnirでも利用可能です。ユーザー設定の項目をいじってください。
既知の問題としては、完成したスクリプトですでにログイン済のページを開くと正常にログインできない場合があります。(例:Yahoo!)
これは画像ファイル名でログインボタンを識別してるのですが、Yahoo!のログインページはすでにログイン済の場合違う画像になるためです。
生成されたスクリプトの運用法ですがOrchisなどのランチャーで管理すると便利です。
今回は新規ページでログインする仕様にしたのでログインページを開いた状態での項目入力は出来てません。(次回UP時に変更予定)
あと公開するつもりではなかったので適当に書いたやつを継ぎ接ぎしてる為へんてこな部分もありますがお許しを。
修正2:42行elementは0スタートに変更COM_ERR処理挿入(5/13)
※お約束:当スクリプトをご利用になってのトラブルは一切関知しません。
//---ユーザー設定(ブラウザを選択してください)
Public brow=1 //1:IE 2:Sleipnir
scr=1 //1:スクランブルを掛ける 2:掛けない
del_org=1 //1:orgファイル削除 2:削除しない
//---初期設定
ifb brow=1
browname="IE"
else
browname="pnir"
endif
dim get_form,submit_btn_flag,img_btn_flag,script_btn_flag,imgsrc[250]
Public aelem
//---ブラウザ別オブジェクト
ifb brow=2
pnir=CreateOleObj("Sleipnir.API")
IE=pnir.GetWebBrowserObject((pnir.GetDocumentID(pnir.ActiveIndex)))
ACW(HNDTOID(pnir.Handle))
else
IE=GetActiveOLEObj("InternetExplorer.Application")
ACW(HNDTOID(IE.hwnd))
endif
doc=IE.document
//---生成ファイル設定
fileLogIe=GET_CUR_DIR+"\"+repStrFNam(IE.LocationName)+browname+"_login"+".uws"
//---スクリプト生成
fid=fopen(fileLogIe,F_WRITE)
ifb brow=2 //ログインページオープンpnirの場合
fput(fid,temp1+pnir.URL+"<#DBL>,true)")
fput(fid,"BusyWaitpnir(pnir)")
fput(fid,"doc=pnir.GetWebBrowserObject((pnir.GetDocumentID(pnir.ActiveIndex))).document")
else //ログインページオープンIEの場合
fput(fid,temp0+IE.LocationURL+"<#DBL>)")
fput(fid,"BusyWait(IE)")
fput(fid,"doc=IE.document")
endif
fput(fid,"COM_ERR_IGN")
//---ID&pass挿入部分生成
COM_ERR_IGN
for i=0 to doc.forms.length-1
ifb doc.forms(i).method="post"
for ii=0 to doc.forms(i).elements.length-1
ifb (doc.forms(i).elements(ii).type="text" or doc.forms(i).elements(ii).type="password") and !(doc.forms(i).elements(ii).value="")
fput(fid,temp2+doc.forms(i).elements(ii).name+"<#DBL>")
fput(fid,temp3+doc.forms(i).elements(ii).value+"<#DBL>")
fput(fid,temp4)
get_form=i
endif
next
endif
ifb !(get_form="")
break
endif
next
COM_ERR_RET
ifb get_form=""
Msgbox("ID又はpassが見当りません")
exitexit
endif
//---ログイン部分生成(submitボタンがある場合)
for i=1 to doc.forms(get_form).elements.length-1
ifb doc.forms(get_form).elements(i).type="submit"
//fput(fid,"if !(doc.forms("+get_form+").elements("+i+").type=<#DBL>submit<#DBL>) then exitexit")
fput(fid,"doc.forms("+get_form+").submit()")
ifb brow=1
fput(fid,temp5)
else
fput(fid,temp6)
endif
submit_btn_flag=1
endif
next
ifb submit_btn_flag=0 //submitボタンが無い場合(画像ボタン探索)
//---画像ボタンのソースをimgsrcに格納
inplength=doc.all.tags("input").length
for i=0 to inplength-1
ifb doc.all.tags("input").item(i).type="image"
imgsrc[i]=doc.all.tags("input").item(i).src
img_btn_flag=1
endif
next
//---各画像ボタンにonclikイベント生成
ifb img_btn_flag=1
for i=0 to doc.all.tags("input").length-1
ifb doc.all.tags("input").item(i).type="image"
OleEvent(doc.all.tags("input").item(i), "HTMLButtonElementEvents", "onclick", "Eventsrc")
endif
Next
else
for i=0 to doc.all.tags("a").length-1
ifb pos("javascript",doc.all.tags("a").item(i).outerHTML)>0
sleep(1)
OleEvent(doc.all.tags("a").item(i), "HTMLAnchorEvents", "onclick", "Eventsrc")
endif
Next
endif
//---onclikイベント発生待ち
While aelem=""
Fukidasi("調査しますログインボタンを押してください")
wend
//---クリックされたボタンのソースの照合
ifb img_btn_flag=1
for i=0 to inplength-1
ifb imgsrc[i]=aelem.src //一致itemでスクリプト生成
fput(fid,"nowsrc=doc.all.tags(<#DBL>input<#DBL>).item("+i+").src")
fput(fid,"if !(nowsrc=<#DBL>"+aelem.src+"<#DBL>) then exitexit")
fput(fid,"doc.all.tags(<#DBL>input<#DBL>).item("+i+").click()")
ifb brow=1
fput(fid,temp5)
else
fput(fid,temp6)
endif
break
endif
Next
else //javascriptボタンの場合
for i=0 to doc.all.tags("a").length-1
ifb doc.all.tags("a").item(i).outerHTML=aelem.outerHTML //一致itemでスクリプト生成
fput(fid,"doc.all.tags(<#DBL>a<#DBL>).item("+i+").click()")
ifb brow=1
fput(fid,temp5)
else
fput(fid,temp6)
endif
script_btn_flag=1
break
endif
Next
endif
endif
//---作成出来なかった場合
ifb submit_btn_flag=0 and img_btn_flag=0 and script_btn_flag=0
Msgbox("ログインボタンが見当りません。<#CR>作成を中止します。")
exitexit
endif
//---生成ファイルをcloseして作成完了
fclose(fid)
Fukidasi("作成完了")
Sleep(2)
//--スクランブル処理
ifb scr=1
UPath = GET_UWSC_DIR + "\uwsc.exe "
exec(UPath + "/a <#dbl>" + fileLogIe + "<#dbl>")// <#dbl>" +fileLogIe+"<#dbl>")
ifb del_org=1 //オリジナルファイル削除
del_file = GET_CUR_DIR+"\"+"*_login.org"
DosCmd("del <#DBL>" + del_file + "<#DBL>")
endif
endif
//---テンプレ
TEXTBLOCK temp0
IE=GetActiveOLEObj("InternetExplorer.Application")
IE.Navigate("
ENDTEXTBLOCK
TEXTBLOCK temp1
pnir=CreateOleObj("Sleipnir.API")
pnir.NewWindow("
ENDTEXTBLOCK
TEXTBLOCK temp2
for i=0 to doc.forms.length-1
for ii=0 to doc.forms(i).elements.length-1
ifb doc.forms(i).elements(ii).name="
ENDTEXTBLOCK
TEXTBLOCK temp3
doc.forms(i).elements(ii).value="
ENDTEXTBLOCK
TEXTBLOCK temp4
endif
next
next
ENDTEXTBLOCK
TEXTBLOCK temp5
COM_ERR_RET
//------IE用wait処理
Procedure BusyWait(ie)
Sleep(0.5) // Wait
Const TIME_OUT = 90
tm = Gettime()
repeat
Sleep(0.2)
ifb Gettime() - tm > TIME_OUT
MsgBox("Time Out:BusyWait")
ExitExit
endif
until (! ie.busy) and (ie.readyState=4)
Sleep(0.5)
Fend
ENDTEXTBLOCK
TEXTBLOCK temp6
COM_ERR_RET
//------pnir用wait処理
Procedure BusyWaitpnir(pnir)
Sleep(0.5) // Wait
Const TIME_OUT = 90
tm = Gettime()
pid=pnir.GetDocumentID(pnir.ActiveIndex)
repeat
Sleep(0.2)
ifb Gettime() - tm > TIME_OUT
MsgBox("Time Out:BusyWait")
ExitExit
endif
until (! pnir.IsBusy(pid))
Sleep(0.5)
Fend
ENDTEXTBLOCK
//------ファイル名に使えない文字列の変換
//眠たい詩人様のHTMLStarkNaked.uwsから流用させてもらいました
//http://nem.symphonic-net.com/uwsct/0610uwsct.html
function repStrFNam(string1)
dim aryChr[]="/","[","]","\",":",";","*","?","#","<#CR>","<#DBL>","<#TAB>","<",">","|"," "," "
dim i
for i=0 to length(aryChr)-1
string1=chgmoj(trim(string1),aryChr[i],"_")
next
string1=chgmoj(chgmoj(chgmoj(string1,"__","_"),"_-","-"),"-_","-")
result=string1
fend
//------onclikイベント
Procedure Eventsrc
ifb brow=2
pnir=CreateOleObj("Sleipnir.API")
IE=pnir.GetWebBrowserObject((pnir.GetDocumentID(pnir.ActiveIndex)))
else
IE=GetactiveOLEObj("InternetExplorer.Application")
endif
doc=IE.document
aelem=doc.activeElement
Fend
- Comments: 0
楽天の携帯メルマガ定期解除スクリプト
- 2010-05-05 (Wed)
- ポイント関連スクリプト
楽天の携帯メルマガがPCからでも一括配信解除が可能になったのでUWSCで自動解除するやつ作った。
これをUWSCのスケジュールかWinのタスクで設定してやればよし。 ちなみにこのスクリプトで解除するのはショップの分だけです。
このスクリプトをちょこっと改編すればPC版もつくれるのでお試しを ログイン認証画面の次の画面でPCはこちらでみたいなボタンがあるので それをクリックしてやればよし。
それとIEのクリックはどれも同じようなやつなのでclickIEという関数をこしらえた。こういうのを作って置けばスクリプト書く手間も省ける。 画像クリックとかjavascript系のリンクとかもcaseを増やしていけば拡張できる(今回はまだ書いてない)
6/14追記:ログインフォームが変ったみたいなので若干修正した
CONST ID = "***" //楽天のID
CONST PASS = "***" //楽天のパスワード
CONST E_MAIL="***" //携帯メールアドレス
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = true
IE.Navigate("http://emagazine.rakuten.co.jp/ns?act=chg_data")
BusyWait(IE)
doc=IE.document
doc.getElementsByName("email").item(0).value = E_MAIL
clickIE(IE,"送信",1)
clickIE(IE,"こちらから配信停止できます。",0)
ifb pos("ログイン",IE.LocationName)>0
doc.all.tags("input").u.value=ID
doc.all.tags("input").p.value=PASS
clickIE(IE,"ログイン",1)
endif
clickIE(IE,"すべてのショップメルマガを配信停止する",0)
clickIE(IE,"配信停止する",1)
IE.quit
//------
Procedure BusyWait(ie)
Sleep(0.5) // Wait
Const TIME_OUT = 90
tm = Gettime()
repeat
Sleep(0.2)
ifb Gettime() - tm > TIME_OUT
MsgBox("Time Out:BusyWait")
ExitExit
endif
until (! ie.busy) and (ie.readyState=4)
Sleep(0.5)
Fend
//------
Procedure clickIE(IE,c_str,c_type)
doc=IE.document
Select c_type
case 0 //link
for i=0 to doc.links.length-1
ifb pos(c_str,doc.links(i).innerText)>0
doc.links(i).click()
Break
endif
next
BusyWait(IE)
case 1 //btn
for i=0 to doc.all.tags("input").length-1
ifb pos(c_str,doc.all.tags("input").item(i).value)>0
doc.all.tags("input").item(i).click()
Break
endif
next
BusyWait(IE)
Selend
Fend
- Comments: 0
リストからテーブルタグを作成するUWSCスクリプト
- 2009-10-16 (Fri)
- ブログ作成に役立つスクリプト
ブログでアフィリエイトとかしてる人はテーブルタグで表組したりすると思うのですがあれって結構面倒。
という事でなんか良い方法ないかなとか思い作りました。
<--例-->
| 1-1 | 1-2 | 1-3 |
| 2-1 | 2-2 | 2-3 |
| 3-1 | 3-2 | 3-3 |
こういうテーブルが作りたいときに
1-1
1-2
1-3
2-1
2-2
2-3
3-1
3-2
3-3
こんな風にリスト書きしてやって行事に1行明けてあげて、
スクリプトを回してフォーカスを当ててあげれば自動的にテーブルタグに置き換わります。
tdのwidthとかは設定してないので適当に改変してあげるか
スクリプトの先頭でインプットボックスで質問するとか
適当に改変して使ってください。
あと5秒じゃ短いとか言う方は
until time=5の数字を大きくしてください。
※2行目~8行目のsckey(id,VK_CTRL,VK_C)までの部分と最後の行を削除して
クリップボードの中身を変換するみたいにして使ってもいいかも。(てか自分はそうしてる)
最初簡単にできるかなぁ?とか思ってたんですが
結構なやむとこもありました。(バカなだけですがw)
ダウンロード(ダウンロード後ファイル名の.txtを削除してください)
- Comments: 0
- Search
- Meta
- Links
- Feeds
- PR
- PR