AutoHotkey は、関数内の値を引用符で囲むのが好きです。
変更してみてください:
WebRequest.SetTimeouts(3000,3000,3000,3000)
に
WinHttpReq.SetTimeouts("30000", "30000", "30000", "30000")
編集:わかりました、私は間違っていたようで、両方の方法が機能します。
このWebサイトを使用して上記をテストしました:http://tmlinshi.sinaapp.com/test/timeout-test-20s.php
以下のコードでSetTimouts
は 10 秒に設定されています。テストは 20 秒で応答するように設定されているため、タイムアウトが保証されます。
WinHttpReq := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WinHttpReq.SetTimeouts("10000", "10000", "10000", "10000")
WinHttpReq.Open("GET", "http://tmplinshi.sinaapp.com/test/timeout-test-20s.php", false)
WinHttpReq.Send()
WinHttpReq.WaitForResponse()
webpage := WinHttpReq.ResponseText
MsgBox % webpage
タイムアウト エラーが発生しましたが、これによりスクリプトが中断され、タイムアウト メッセージを取得する方法がわかりません。
タイムアウト エラーが発生しているため、コードにエラー処理を追加する必要があります。Try / Catchを使用してこれを行います。
WinHttpReq := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WinHttpReq.SetTimeouts("10000", "10000", "10000", "10000")
Try {
WinHttpReq.Open("GET", "http://tmplinshi.sinaapp.com/test/timeout-test-20s.php", false)
WinHttpReq.Send()
WinHttpReq.WaitForResponse()
webpage := WinHttpReq.ResponseText
}
Catch e{
MsgBox % e
ExitApp
}
MsgBox % webpage
スクリプトは壊れなくなりましたが、MsgBox は空白ですか? これは機能していません。
エラーメッセージがオブジェクトからオブジェクトとして返されているため、空白です! オブジェクトを調べると、e
データを文字列や整数値として格納するいくつかのキーが含まれていることがわかりました。キーには、Extra、File、Line、Message、What などのラベルが付けられています。では、Message を見てみましょう。
WinHttpReq := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WinHttpReq.SetTimeouts("10000", "10000", "10000", "10000")
Try {
WinHttpReq.Open("GET", "http://tmplinshi.sinaapp.com/test/timeout-test-20s.php", false)
WinHttpReq.Send()
WinHttpReq.WaitForResponse()
webpage := WinHttpReq.ResponseText
}
Catch e{
MsgBox % e.Message
ExitApp
}
MsgBox % webpage
さて、今私は見る:
0x80072EE2 -
ソース: WinHttp.WinHttpRequest
説明: 操作がタイムアウトしました
ヘルプファイル: (null)
ヘルプ コンテキスト: 0
そうです、タイムアウト メッセージと、おそらく必要のないその他の情報を大量に受け取ったようです。今できることは、メッセージから必要なデータを解析することです! そのようです:
WinHttpReq := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WinHttpReq.SetTimeouts("10000", "10000", "10000", "10000")
Try {
WinHttpReq.Open("GET", "http://tmplinshi.sinaapp.com/test/timeout-test-20s.php", false)
WinHttpReq.Send()
WinHttpReq.WaitForResponse()
webpage := WinHttpReq.ResponseText
}
Catch e{
For Each, Line in StrSplit(e.Message, "`n", "`r") {
Results := InStr(Line, "Description:")
? StrReplace(Line, "Description:")
: ""
If (Results <> "")
Break
}
MsgBox % Trim(Results)
ExitApp
}
MsgBox % webpage
編集:
このメソッドはタイムアウトをキャッチするだけでなく、到達不能なアドレスや無効な URL などの他のさまざまなエラーをキャッチし、それらのエラーを正しく表示することを忘れていました。
http://www.isitdownrightnow.com/ にアクセスし、ダウンしているサイトで上記のコードを使用してみてください。次のように返されます。
サーバー名またはアドレスを解決できませんでした
また、コードが生成する URL に属さない文字またはスペースを追加します。
URL が無効です