プロが教える店舗&オフィスのセキュリティ対策術

あるWEBサービスにログインして、
一覧表示画面を表示した後の処理を自動化できないか模索しています。

その一覧表中に、
「ログ出力」というリンクテキストを上から順番にクリックしていきたいのです。

実際にはクリックすると、自動的に IDがファイル名のcsvファイルが自動ダウンロードされるので、
機械的に次々クリックすればファイル名の重複もなくあとで特定も出来るようになっています。
UWSCでそんな処理できますか?

欲を言えば、
「ログ出力」が20回出てきた後、右下の「次の20件 >>」をクリックすると、
ページが変わるのでまた「ログ出力」を順番に20箇所クリック・・・を次のページが無くなるまで繰り返したいです。
(何ページあるか分からないので手動でも構わないのですが)

アドバイス頂ければ幸いです。

質問者からの補足コメント

  • うーん・・・

    それで方針を変える事にしました。
    ・WEB全ページ全体をコピーしてExcelに値で貼り付け
     これをWEBページをめくり、ExcelでShift+F11で新規シート作って貼付けを繰り返します。
    ・貼り付けた表にIDがあり、ダウンロードしたファイル名と紐づけられるのでダウンロードは後で手動で必要なファイルのみ行います。

      補足日時:2021/02/13 18:56
  • うーん・・・

    ・「あるWEBサービス」は事前に開いておきAlt+Tabでウィンドウ切替のみにします。
     例えばこんな感じです。※もっと上手な方法があったらご教授ください。
     KBD(VK_ALT,DOWN)
     KBD(VK_TAB,CLICK,100)
     ACW(GETID("タスクの切り替え","MultitaskingViewFrame"),0,0,1920,1040,0)
     KBD(VK_ALT,UP,100)
     ACW(GETID("WEBCAS e-mail - Internet Explorer","IEFrame"),0,0,1920,1040,0)

    ・IEに切り替えたら、Ctrl+A→Ctrl+Cで全選択コピー
     例えばこんな感じです。※もっと上手な方法があったらご教授ください。
     KBD(VK_CTRL,DOWN,1360)
     KBD(VK_A,CLICK,203)

      補足日時:2021/02/13 18:57
  • うーん・・・

    KBD(VK_C,CLICK,469)
     KBD(VK_CTRL,UP,16)

    ・Excelに切り替えてセルA1の場所で右クリック→値で貼り付け
     例えばこんな感じです。※もっと上手な方法があったらご教授ください。
     KBD(VK_ALT,DOWN)
     KBD(VK_TAB,CLICK,100)
     ACW(GETID("タスクの切り替え","MultitaskingViewFrame"),0,0,1920,1040,0)
     KBD(VK_ALT,UP,32)
     ACW(GETID("テスト.xlsx - Excel","XLMAIN"),-8,-8,1936,1056,0)
     BTN(RIGHT,CLICK,64,250,297)
     BTN(LEFT,CLICK,141,346,94)

      補足日時:2021/02/13 18:58
  • うーん・・・

    ・Shift+F11 で新規シート作成
     例えばこんな感じです。※もっと上手な方法があったらご教授ください。
     KBD(VK_SHIFT,DOWN,1250)
     KBD(VK_F11,CLICK,453)
     KBD(VK_SHIFT,UP,93)

    分からないのは、
    IEページ右下にある「次の20件 >>」リンクをクリックする方法です。
    リンクがなくなったテキストのみの「次の20件 >>」になったら終了するのが理想ですが、
    単に FOR文で100回繰り返すだけでも仕方ないと思っています。

    長くなりましたが以上です。

      補足日時:2021/02/13 18:58

A 回答 (2件)

ご質問者が投稿されたスクリプトをみると「記録モード」で記録したものを利用して作成されているようです。


もちろんそのような方法もありますが、低レベル関数はできるだけ避けたほうが良いと思います。

インターネットに接続している場合、「予期しないポップアップが出る」などということはよくあることです。低レベル関数だと、「起動している当該アプリにそのコマンドを適用したい」といった細かい設定は困難です。単純に「キーボードのキーを送出する」といった動きになってしまいます。
その結果「予期しないポップアップにコマンドを送る」などということになりかねないからです。

前回のサンプルに続き、EXCELにIEの画面テキストを貼り付けるサンプルを作成してみました。
EXCELを起動し、最小化してタスクトレイに入れた状態にしてから、UWSCを起動してください。

このサンプルの動作は、
①「教えて!goo」の「コンピュータ・テクノロジー」のカテゴリの質問一覧ページにIEでアクセスし、CTRL+AおよびCTRL+Cでテキストを取得
②EXCEL画面を表示し、シートを追加して、テキストを貼り付け
③IEに戻り「次の結果→」をクリック、①に戻り「次の結果→」がなくなったら終了
という動きをするものです。

従って
(1)URLを「あるWEBサービス」に書き換える。
(2)「次の結果→」を「次の20件 >>」に書き換える
(3)EXCELを起動し、最小化してタスクトレイに入れた状態からスタート
とすれば、ご希望の動作になるのではないかと思いますが、EXCELとIEを組み合わせるならUWSCではなく、VBAで記述したほうがよいような気もします。
なお、
>リンクがなくなったテキストのみの「次の20件 >>」になったら終了する
>のが理想です
一応対応したつもりですが、実際動かしてみないとわかりません。

IE = CreateOLEObj("InternetExplorer.Application")
URL = "https://oshiete.goo.ne.jp/articles/qa/2012/"
IE.Visible = True
IE.Navigate (URL)
BusyWait (IE)
SLEEP(0.2)
IE2EXCEL()
flag0 = 1
While true
IF flag0 = 0 Then Break
KeyWordClick(IE,"次の結果→",Flag0)
Wend
MsgBox ("終了しました")

Procedure BusyWait(IE)
Repeat
Sleep (0.2)
until (! ie.busy) and (ie.readyState=4)
Fend

Procedure KeyWordClick(IE, KeyWord,Var Flag)
flag = 0
a_tag = IE.Document.getElementsByTagName("a")
For i=0 to GETOLEITEM(a_tag)-1
COM_ERR_IGN
If ALL_OLE_ITEM[i].innerText = KeyWord Then
flag = 1
ALL_OLE_ITEM[i].Click()
BALLOON("次ページへのリンクを見つけました。遷移します。")
BusyWait (IE)
BALLOON()
IE2EXCEL()
BREAK
EndIf
COM_ERR_RET
Next
Fend

procedure IE2EXCEL()
While true
ID0=GETID(" - Internet Explorer")
if id0>0 then break
SLEEP(0.2)
Wend
SLEEP(0.2)
CTRLWIN(ID0,MAX)
CTRLWIN(ID0,ACTIVATE)
SLEEP(0.2)
MOUSEORG(ID0)
BTN(LEFT,CLICK,84,15,300) //IEのウィンドウの上部枠をクリック(実際の画面にあわせてクリック位置を調整する)
SLEEP(0.2)
SENDSTR(0,"")
While true
IF GETSTR(0)<>"" then break
SCKEY(ID0,VK_CTRL,A,C)
SLEEP(0.2)
WEND
While true
ID1=GETID("- Excel")
if id1>0 then break
SLEEP(0.2)
Wend
SLEEP(0.2)
CTRLWIN(ID1,MAX)
CTRLWIN(ID1,ACTIVATE)
SCKEY(ID1,VK_SHIFT,VK_F11)
SLEEP(0.2)
SCKEY(ID1,VK_CTRL,VK_HOME)
SLEEP(0.2)
SCKEY(ID1,VK_CTRL,V)
SLEEP(0.3)
Fend

EXCELに貼り付けするのではなく、HTMLをそのまま保存する方法もありますが、当該ページのリンクの記述方法によっては取得したHTMLが正しく機能しない場合もあります。以下はC:\ログ出力というフォルダを作成しておけば、そのフォルダに上記のEXCELに貼り付ける内容をそのままページ毎にHTMLで、LOG1,html、LOG2.html・・・というように保存するスクリプトです。
(1)URLを「あるWEBサービス」に書き換える。
(2)「次の結果→」を「次の20件 >>」に書き換える
(3)「C:\ログ出力\」の部分を実際に保存するフォルダ名に変更する
を実施してご利用ください。

No = 0
IE = CreateOLEObj("InternetExplorer.Application")
URL = "https://oshiete.goo.ne.jp/articles/qa/2012/"
IE.Visible = True
IE.Navigate (URL)
BusyWait (IE)
SLEEP(0.2)
No=No+1
save_html(IE,No)
flag0 = 1
While true
IF flag0 = 0 Then Break
KeyWordClick(IE,"次の結果→",Flag0,No)
Wend
MsgBox ("終了しました")

Procedure BusyWait(IE)
Repeat
Sleep (0.2)
until (! ie.busy) and (ie.readyState=4)
Fend

Procedure KeyWordClick(IE, KeyWord,Var Flag,var No)
flag = 0
a_tag = IE.Document.getElementsByTagName("a")
For i=0 to GETOLEITEM(a_tag)-1
COM_ERR_IGN
If ALL_OLE_ITEM[i].innerText = KeyWord Then
flag = 1
ALL_OLE_ITEM[i].Click()
BALLOON("次ページへのリンクを見つけました。遷移します。")
BusyWait (IE)
BALLOON()
No=No+1
save_html(IE,No)
BREAK
EndIf
COM_ERR_RET
Next
Fend

Procedure save_html(IE,No)
BaLLOON("LOG"+No+".htmlを保存中です。")
body = IEGetSrc(IE, "BODY")
body= replace(body,'//','https://')
body= replace(body,'https:https://','https://')
f_Name ="Log"+No+".html"
fid0=fopen("c:\ログ出力\"+F_Name,F_WRITE8)
FPUT(fid0,body,F_ALLTEXT)
FCLOSE(fid0)
BaLLOON()
fend

この投稿サイトでは「"」が変換されてしまうので、「'」で記述してあります。上記スクリプトの「'」は全て「"」に置換してからご利用ください。

保存されたHTMLを開いたらが文字化けする場合は「エンコード」を「UTF-8」にしてくださいい。
    • good
    • 0

UWSCのサンプルを作成してみました。

このサンプルは
①「教えて!goo」の「コンピュータ・テクノロジー」のカテゴリの質問一覧ページにIEでアクセスし、
②「プログラミング」という文字列を含むリンクをクリックして、
③何らかの処理を行う
④さらに②と③を繰り返し「プログラミング」というリンクがなくなったら「次の結果→」をクリックし、
⑤さらに②③④を繰り返し、「次の結果→」がなくなったら終了
という動きをするものです。

ご質問者のいう「あるWEBサービス」のHTMLソースが不明ですので何ともいえませんが、ダウンロード処理は「単なるリンク」ではない気もしますし、クリックすれば、保存するか開くかといったダイアログも表示される気がします。それらの処理はご質問者が自作する前提ですが、

(1)URLを「あるWEBサービス」に書き換える。
(2)「次の結果→」を「次の20件 >>」に書き換える
(3)「プログラミング」を「ログ出力」に、その行のfalseをtrueに書き換える。
(4)「ここから」「ここまで」の行を自作のダウンロード用の処理に書き換える

を実施すれば、一応ご希望の処理は可能だと思われます。
なお、動作をチェックするなら、「ログ出力①」「ログ出力②」の行をコメントアウトすれば、一覧画面が次々に表示される状態を再現できます。

IE = CreateOLEObj("InternetExplorer.Application")
URL = "https://oshiete.goo.ne.jp/articles/qa/2012/"
IE.Visible = True
IE.Navigate (URL)
BusyWait (IE)
Log_Output (IE) //ログ出力①
KeyWordClick(IE,"次の結果→")
MsgBox ("終了しました")

Procedure BusyWait(IE)
Repeat
Sleep (0.2)
until (! ie.busy) and (ie.readyState=4)
Fend

Procedure KeyWordClick(IE, KeyWord)
flag = 0
While True
If flag = 1 Then break
If IELINK(IE, KeyWord, 1, True) Then
BusyWait (IE)
BALLOON("次ページへ遷移しました。続行します。")
Sleep(2)
BALLOON()
Log_Output (IE) //ログ出力②
Else
flag = 1
EndIf
Wend
Fend

Procedure Log_Output(IE)
flag = 0
cnt = 0
While True
If flag = 1 Then break
cnt = cnt + 1
BALLOON("処理中です")
Sleep(2)
BALLOON()
IF IELINK( IE,"プログラミング",cnt,false) then
BusyWait (IE)
BALLOON("ここでDownLoad処理") //ここから
Sleep(2)
BALLOON() //ここまで
Else
flag = 1
EndIf
Wend
Fend
    • good
    • 0
この回答へのお礼

こんなに早く作っていただいてありがとうございます!
内容を確認・考察していたためお礼が遅くなりました。すみません。

頂いたソースでテストしたら、ちゃんと動作しました。
しかし実際にテストしてみて問題点が分かりました。
・「ログ出力」をクリックした後、別の画面が遷移する場合が多く、この手順だと駄目だという事が分かりました。
・「次の20件 >>」でページが変わっていくと最終的に無くなるのではなく、リンクの外れた「次の20件 >>」が表示されることが分かりました。

それで方針を変える事にしました。
・WEBページをめくりながらExcelにテキスト貼り付けするだけで良しとする事にします。
・貼り付けた表にIDがあり、ダウンロードしたファイル名と紐づけられるのでダウンロードは後で手動で必要なファイルのみ行います。

細かい問題点などがあります。
詳細が長くなるため補足に書かせていただきます。

長くなって申し訳ありませんが、可能な限りアドバイス頂けると嬉しいです。

お礼日時:2021/02/13 18:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています