4

AHK スクリプトを使用して POST リクエストを送信しています。ユーザーにメッセージをポップアップできるように、タイムアウト応答を取得しようとしています。「SetTimeouts」メソッドと「WaitForResponse」の使用方法がわかりません。以下のコードを参照してください

WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.SetTimeouts(3000,3000,3000,3000)

openConnection(WebRequest,ip){
   WebRequest.Open("POST", "http://" ip "/cgi/drsLogin",true)
   WebRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   WebRequest.Send("action=login&username=admin&password=admin")
   time := WebRequest.WaitForResponse(2)

   if (time = -1) {
    addTextToGui("Connection Timeout")
   }
   else{
     return
   }
 return
}
4

2 に答える 2

6

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 が無効です

于 2015-09-16T22:32:09.640 に答える