###●やりたいこと
インターネット上のあるサイトにログインして、そこに保存されているcsvファイルを自動でダウンロードできるようにしようと思っています。
さしあたって、一番簡単そうなVBAでHttpRequestを使った方法を検討中です。
###●問題(発生現象)
下記のコードを実行後、タイムアウトエラーが出ます。
lang
1Option Explicit 2 3Public Sub Sample04() 4 Dim req As Object 5 Dim dat As Variant 6 7 Const UserName = "User" 'ユーザー名 8 Const PassWord = "Password" 'パスワード 9 Const AuthUrl = "https://xxxx.jp/login.aspx" '認証ページのURL 10 Const FileUrl = "https://xxxx.jp/logs.csv?start=2017%2f12%2f01&end=2017%2f12%2f31" 'ダウンロード対象のURL 11 Const SaveFilePath = "C:\Users\User01\Documents\MyFiletest.csv" 'ローカルのダウンロード先 12 13 Const adTypeBinary = 1 14 Const adSaveCreateOverWrite = 2 15 16 Set req = Nothing '初期化 17 Set req = CreateHttpRequest() 18 If req Is Nothing Then Exit Sub 19 20 '認証 21 req.Open "POST", AuthUrl, False 22 dat = "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2dwzKFGoOuiYCVzJJPEcC0RavMKGsUBdZNkyy7CiR8fW44tJ4T1HtL3sw2TryxZF3NnFDbKUud8ZxYHRhL41C1htjjdGyPDRScI44wWxYmC1q1rFQmgug&__VIEWSTATEGENERATOR=20B48FBE&__EVENTVALIDATION=%2k6CsmGmvppDJ3c6sFZpiGzl6kovsNmuyTbSSXJZoAA2fZpbp0DjbrvU6LbUS9Av1PeGZj5ymBh&UserId=" & UserName & "&Password=" & PassWord & "&Submit=%30%B8%E2%83%E2%E3%B3%83%AD%A4%E3%83" 'パラメーター設定 23 req.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 24 req.Send dat '★この段階でタイムアウトエラー発生 25 If req.Status <> 200 Then 26 MsgBox "認証に失敗しました。" & vbCrLf & _ 27 "処理を中止します。", vbCritical + vbSystemModal 28 Exit Sub 29 End If 30 31 'ファイルのダウンロード 32 req.Open "GET", FileUrl, False 33 'XMLHTTPRequestを考慮してキャッシュ対策 34 req.setRequestHeader "Pragma", "no-cache" 35 req.setRequestHeader "Cache-Control", "no-cache" 36 req.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT" 37 req.Send 38 Select Case req.Status 39 Case 200 40 With CreateObject("ADODB.Stream") 41 .Type = adTypeBinary 42 .Open 43 .Write req.responseBody 44 .SaveToFile SaveFilePath, adSaveCreateOverWrite 45 .Close 46 End With 47 Case Else 48 MsgBox "エラーが発生しました。" & vbCrLf & _ 49 "ステータスコード:" & req.Status, _ 50 vbCritical + vbSystemModal 51 Exit Sub 52 End Select 53 54 MsgBox "処理が終了しました。", vbInformation + vbSystemModal 55End Sub 56 57Private Function CreateHttpRequest() As Object 58'WinHttpRequest/XMLHTTPRequestオブジェクト作成 59'http://www.f3.dion.ne.jp/~element/msaccess/AcTipsWinHTTP1.html 参考 60 Dim progIDs As Variant 61 Dim ret As Object 62 Dim i As Long 63 64 Set ret = Nothing '初期化 65 progIDs = Array("WinHttp.WinHttpRequest.5.1", _ 66 "WinHttp.WinHttpRequest.5", _ 67 "WinHttp.WinHttpRequest", _ 68 "Msxml2.ServerXMLHTTP.6.0", _ 69 "Msxml2.ServerXMLHTTP.5.0", _ 70 "Msxml2.ServerXMLHTTP.4.0", _ 71 "Msxml2.ServerXMLHTTP.3.0", _ 72 "Msxml2.ServerXMLHTTP", _ 73 "Microsoft.ServerXMLHTTP", _ 74 "Msxml2.XMLHTTP.6.0", _ 75 "Msxml2.XMLHTTP.5.0", _ 76 "Msxml2.XMLHTTP.4.0", _ 77 "Msxml2.XMLHTTP.3.0", _ 78 "Msxml2.XMLHTTP", _ 79 "Microsoft.XMLHTTP") 80 On Error Resume Next 81 For i = LBound(progIDs) To UBound(progIDs) 82 Set ret = CreateObject(progIDs(i)) 83 If Not ret Is Nothing Then Exit For 84 Next 85 On Error GoTo 0 86 Set CreateHttpRequest = ret 87End Function
上記コマンド実行後、20秒ほどしてからreq.Send dat
部分で下記エラーが出ます。
「Microsoft Visual Basic」
実行時エラー'-2147012894(80072ee2)'
処理がタイムアウトになりました。
###●確認したこと
1.現象発生時点で変数req
の値は各項目「<この操作を完了するのに必要なデータは、まだ利用できません>」です。
2.Internet Explorer で該当サイトを開き、「F12]キーの開発者ツール → 「ネットワーク」でログイン時の情報を収集した結果は下記
URL | プロトコル | メソッド | 結果 | 種類 |
---|---|---|---|---|
/login.aspx | HTTPS | POST | 302 | text/html |
/edit_profile.aspx | HTTPS | POST | 200 | text/html |
-
HTTPSのPOSTが2つあり、1行目の結果が302なのも気になりましたが、302は"Found"の応答のようなので特に問題なし?
-
試しに2行目の「https://xxxx.jp/edit_profile.aspx」をAuthUrlに代入してみましたが、結果は同じくタイムアウト。
-
ちなみに、2行目の「要求本文」も1行目と全く同じ。
-
また、ステータスの確認までコードが進んでいないので、現状
req.Send dat
部分で引っかかる部分を何とかしたいです。 -
変数
dat
の内容は「要求本文」で確認した内容を使っています。
かなり長いのが気になりましたが、送られている要求本文は毎回全く同じでした。 -
「要求ヘッダー」の「Content-Type」は「application/x-www-form-urlencoded」でした。
-
「要求」は「POST /login.aspx HTTP/1.1」です。
正直、他にどこを確認すれば良いのかよくわからない状態です。
確認すべき項目があれば補足いたします。
参考情報:
- 「VBAでインターネット上のファイルをダウンロードする方法をまとめてみました。」内の下記項目

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。