目的は、日本郵便の法人向けページからPDFをダウンロードすることなのですが、
JavaScriptで右クリックができなくなっていたり、
新しいIEウィンドウで開くため、そちらへObjectを移してあげなければならなかったり、
ダウンロードページに行くまでの全URLにトークンが付与されていたり、
ダウンロードファイルのpath自体にも
トークンとは別のワンタイムパスワードが設定されていて、かなり難儀しております。
新しいIEウインドウの特定と、URLトークンはなんとか取得できたため問題ないのですが、
トークンとは別のワンタイムパスワードがどうしても取得できません。
と言いますのも、そのワンタイムパスワードは、
Framesetの以下要素として存在しており、
ページ内の全htmlソース取得コードを走らせてもその中身が取れません。
まずは、以下が実行コードとなります。
(※未開示箇所が多くて申し訳ございません)
VBA
1Sub N_YUUBIN() 2 3 Dim objIE As InternetExplorer 4 Dim UserName As String 5 Dim PassWord As String 6 Dim AuthUrl As String 7 Dim objShell As Object 8 Dim objExec As Object 9 Dim ST As Date 10 Dim ret As String 11 Dim ONETIMEPASS As String 12 Dim Pg As String 13 14 UserName = "未開示" 'ユーザー名 15 PassWord = "未開示" 'パスワード 16 AuthUrl = "未開示" '認証ページのURL 17 18 Set objIE = CreateObject("Internetexplorer.Application") 19 20 objIE.Visible = True 21 Call ieView(objIE, AuthUrl) 22 Call Wait(objIE) 23 24 Dim htmlDoc As HTMLDocument 25 Set htmlDoc = objIE.Document 26 27 htmlDoc.getElementsByName("linIds")(0).Value = UserName 28 htmlDoc.getElementsByName("pwdLinIds")(0).Value = PassWord 29 htmlDoc.getElementsByName("EI012")(0).Click 30 31 Call ieCheck(objIE) 32 Call Wait(objIE) 33 34 htmlDoc.getElementById("daiBiki").Click 35 36 Call Wait(objIE) 37 Call ieCheck(objIE) 38 Call Wait(objIE) 39 40 41 '新しいIEウインドウのハンドルが取得できるまで待機(ここからがトークン付与ページ) 42 Dim ie As Long 43 Do 44 DoEvents 45 ie = FindWindow("IEFrame", "メニュー - Internet Explorer") 46 If ie <> 0 Then 47 Exit Do 48 End If 49 Loop 50 51 52 'objectを新しいウインドウで開いたIEに移すため、開いているIE全部のURL(トークン含む)を取得 53 Dim urlIE As String 54 Dim IE1 As InternetExplorer 55 Dim Doc As HTMLDocument 56 Dim sh As Object 57 Dim win As Object 58 59 Set sh = CreateObject("Shell.Application") 60 For Each win In sh.Windows 61 If win.Name = "Internet Explorer" Then 62 Set IE1 = win 63 IE1.Navigate IE1.LocationURL 64 IE1.Visible = True 65 Do While IE1.Busy = True Or IE1.readyState < READYSTATE_COMPLETE 66 DoEvents 67 Loop 68 Set Doc = IE1.Document 69 Debug.Print IE1.LocationURL ', Doc.title 70 '最後に開いたURLが[urlIE]に格納される 71 urlIE = IE1.LocationURL 72 End If 73 Next 74 Set win = Nothing 75 Set sh = Nothing 76 Set Doc = Nothing 77 Set IE1 = Nothing 78 79 Dim objIE2 As InternetExplorer 80 Dim htmlDoc2 As HTMLDocument 81 82 '新しいウインドウで開いたIEをURLから探してobjectに入れる 83 Set objIE2 = ieFind(urlIE) 84 Set htmlDoc2 = objIE2.Document 85 86 Do 87 DoEvents 88 On Error Resume Next 89 ONETIMEPASS = htmlDoc2.getElementsByName("PS_SCREEN_UNIQUE_ID")(0).Value 90 If ONETIMEPASS <> "" Then 91 Exit Do 92 End If 93 Loop 94 95 Pg = "https://未開示PS_SCREEN_UNIQUE_ID=" & ONETIMEPASS 96 97 Call Wait(objIE) 98 Call ieView(objIE, Pg) 99 Call Wait(objIE) 100 101 'ダウンロードリンクボタン 102 htmlDoc.getElementsByName("E325")(0).Click 103 104End Sub 105
###試したこと
JavaScriptで動的に展開しなければならない階層にあるのか分かりませんが、
ピンポイントに値を取りに行こうとしても、
ページは完全に開いているのに以下のLoopから抜けてくれません。
VBA
1Do 2DoEvents 3On Error Resume Next 4ONETIMEPASS = htmlDoc2.getElementsByName("PS_SCREEN_UNIQUE_ID")(0).Value 5If ONETIMEPASS <> "" Then 6Exit Do 7End If 8Loop
Typeがhiddenのため取得できないのかと思いきや、
Fremeset⇒Frame以下の値がすべて取得できないようでした。
問題のページのHTMLソースは以下になります。
(※全要素取得コードで得たHTMLソースでは階層状態が分からないため画像にて掲載)
実現したいこと
画像のコメントにもある通り、
<html lang="ja"><head>以下の子要素が取得できれば、 今回の目的となる <input type="hidden" name="PS_SCREEN_UNIQUE_ID" value="123456789123456789">や、
<a href="/JP_未開示PS_SCREEN_UNIQUE_ID=123456789123456789" onclick="return checkSend();">PDFダウンロード</a>
に記載されているワンタイムパスワードが取得できるため、
本当の意味での全要素を取得する方法を、
ヒントや参考ページだけでも何とかお知恵を拝借できませんでしょうか。
何とぞよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
Win10 x64
Office2016 x32