1

Тема: AHK: Пустой ответ через Get запрос

Код ниже получает IP до и после перезагрузки модема. Проблема в том, что когда IP сменился, get запрос получает пустой ответ, со второй попытки все нормально (ответ получен). Почему первая попытка заканчивается неудачей? Ставил паузы до 10 сек не помогает. Помогите разобраться в проблеме.
P.s, в ahk и в WinHTTP разбираюсь плохо.

RunWait cmd /c "%A_WinDir%\System32\rasdial.exe /d" ,,hide
gosub, get_ip
gosub, restart_usb_modem
sleep 5000
gosub, get_ip
ExitApp

get_ip:
Loop, 5
	{ 
		ComObjError(true)
		HTTP := ComObjCreate("WinHttp.WinHttpRequest.5.1")
		HTTP.Open("GET", "http://api.ipify.org", true)
		HTTP.SetTimeouts(2000, 2000, 2000, 2000)
		HTTP.Send()
		HTTP.WaitForResponse(1)
		result = % HTTP.ResponseText
		if (result > "")
			break
		else
			MsgBox, Пустой ответ (%a_index%) %result%
	}
return
	
restart_usb_modem:
RunWait cmd /c "%A_WinDir%\System32\rasdial.exe "MTS" /callback:*99#" ,,hide
return

2

Re: AHK: Пустой ответ через Get запрос

Уберите строку HTTP.SetTimeouts(2000, 2000, 2000, 2000), вызывайте HTTP.WaitForResponse(1) без параметров, после неё вставьте MsgBox % HTTP.Status для дебаггинга, гуглите, что означает возвращённый статус.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: mastersat45, 2022-01-29 16:31:58)

Re: AHK: Пустой ответ через Get запрос

teadrinker Сделал, как вы сказали.
первое получение IP статус 200, далее перезагрузка модема и ahk выдает ошибку на "HTTP.WaitResponse" Error 0x80072EFE (Соединение с сервером было неожиданно прервано), ну и Status следовательно тоже выдает ошибку.
WaitResponse ждет ответа от 12 до 40 сек, вроде достаточно чтобы дождаться ответа.
Если прогнать скрипт без рестарта модема, то все отлично отрабатывает, проблема появляется только при перезагрузке модема, параллельно пингую через cmd сайт ya.ru и модем шустро подключается, да и пинг ровный на уровне 60 мс. (т.е сам модем отрабатывает хорошо)

4

Re: AHK: Пустой ответ через Get запрос

Может быть тут имеет место какой то кэш, который при повтором запросе не сбрасывается, либо некая внутренняя переменная, которая делает запрос через тот самый интернет, что еще был активен до перезагрузки модема? Я просто совсем не знаю о WinHTTP, и как бы понимаю, что задавая вопрос здесь на форуме AHK, то обращаюсь не совсем по адресу.

5

Re: AHK: Пустой ответ через Get запрос

Если хотите понять, почему скрипт выдаёт ошибку, в то время, как cmd пингует успешно, я вряд ли смогу помочь. Если хотите, чтобы ошибка не мешала дальнейшей работе скрипта, просто используйте блок try - catch, в catch делайте запрос повторно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Пустой ответ через Get запрос

teadrinker
Я попробовал просто после HTTP.Send поставить следующее и это помогло

If(A_index = 1)
	continue

Так скрипт отрабатывает шустро, т.к. нет нужды ждать ответа, которого все равно не дождаться. Но это конечно костыль, да и все равно отправляется два запроса.

7

Re: AHK: Пустой ответ через Get запрос

В этом ничего страшного нет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder