1

Тема: AHK: ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

Добрый день!
Есть код, который должен получать информацию с сайта закупок в виде текста.
Работает в 50% случаев. Зацикливание запросов результата не дает.
После перезапуска скрипта может сработать.
Непонятно следующее:
1) Связано ли  это именно с тем что я использую именно AHK?
2) Почему цикл не добивается нормального результата, а перезагрузка скрипта помогает?
3) Не посчитают ли подобное попыткой обвалить сайт закупок? мне бы этого не хотелось(
4) Есть ли более простой способ, получения такой информации?

#Persistent
#SingleInstance force
#InstallKeybdHook
#InstallMouseHook
#UseHook
#NoEnv
DetectHiddenWindows, On
if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
{
    try
    {
    if A_IsCompiled
        Run *RunAs "%A_ScriptFullPath%" /restart
    else
        Run *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%"
    }
    ExitApp
}
StartTime := A_TickCount



Label:
Filename := "C:\Users\sda\Desktop\output.txt"
FileRecycle, %Filename%
link := "https://zakupki.gov.ru/epz/order/notice/ea44/view/common-info.html?regNumber=0334200012520000315"
req := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
req.Open("GET", link, false)
req.Send()
sleep 1000
text := req.responseText
text := StrReplace(text,"`r`n`r`n","`r`n")
text := StrReplace(text,"`n`n","`n")
if not InStr(text, "Единая информационная система в сфере закупок")
{
    ToolTip, %Count%`r`n%text%, 1, 1
    Count += 1
    Goto, Label
}
FileAppend, %text%, %Filename%
run %Filename%
return

2

Re: AHK: ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

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

ie := ComObjCreate("InternetExplorer.Application")
ie.Navigate(link)

3 (изменено: KusochekDobra, 2020-07-13 11:33:44)

Re: AHK: ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

Не отвечу прямо на Ваш вопрос, но надеюсь направить по верному пути.

Сайты, особенно те, которые относят себя к серьёзным ресурсам, любят, когда к ним обращаются максимально корректно.
Чтобы наверняка узнать, какую форму обращения от Вас ожидает сайт, нужно перейти на него в браузере, открыть отладчик(Ctrl + Shift + I — в хроме) и на вкладке "Network"(в хроме), найти интересующий запрос. Тыкнув по нему курсором, обнаружите всю интересующую информацию.

Теперь, Ваша задача состоит в том, чтобы повторить свой запрос максимально похожим образом.

Так же, стоит иметь под рукой какую-нибудь простую поделку, позволяющую налету дополнять свои попытки новыми данными и для удобства, визуализировать результат. Например:


#NoEnv
#SingleInstance, Force
SetWorkingDir,% A_ScriptDir

DetectHiddenWindows, On
SetTitleMatchMode, 2
ListLines, Off
SetBatchLines, -1
OnExit, BeforeExit

SplitPath,% A_ScriptFullPath,,,, fNameNoExt

; >>--++--<<  >>--++--<<
	ww := 800
; >>--++--<<  >>--++--<<
	INI := "Config.ini"
	if (!FileExist(INI))
		FileAppend,,% INI,UTF-16
	
	IniRead, x_pos,% INI, Main, x_pos, -1
	IniRead, y_pos,% INI, Main, y_pos, -1
	IniRead, url,% INI, Main, url, https://zakupki.gov.ru/epz/order/notice/ea44/view/common-info.html?regNumber=0334200012520000315
; >>--++--<<  >>--++--<<

Gui, 1: +HWND_main_h
Gui, 1: Margin, 10, 10
Gui, 1: Font, s10 w500 cBlue, Consolas
Gui, 1: Add, Edit, w%ww% v_url,% url
Gui, 1: Add, Edit, w%ww% r5 v_headers,Headers
Gui, 1: Add, Edit, w%ww% r20 v_body,Body
Gui, 1: Font
Gui, 1: Add, Button, w%ww% gDoGet,Get

if (x_pos > -1 && y_pos > -1)
	Gui, 1: Show,x%x_pos% y%y_pos%,% fNameNoExt
else
	Gui, 1: Show,,% fNameNoExt

;	Повторяем заголовки из браузера, исключая из списка те, что запрашивают сжатие контента
request_headers =
(
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
Host: zakupki.gov.ru
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
)

prepare_headers := []
For k, v in StrSplit(request_headers, "`n")
	prepare_headers.Push(StrSplit(v, ": "))

Return
DoGet:
	Gui, 1: Submit, NoHide
	; result := _Get(_url)
	result := _Get(_url, prepare_headers)
	GuiControl,,_headers,% result.headers
	GuiControl,,_body,% result.text
Return

_Get(url, headers := "", proxy := "") {
	oHTTP := ComObjCreate("WinHttp.WinHttpRequest.5.1")
	oHTTP.Open("GET", url, false)
	if (proxy)
		oHTTP.SetProxy(2, proxy)
	if (!headers)
		oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0")
	else
		For k, v in headers
			oHTTP.SetRequestHeader(v[1], v[2])
	oHTTP.Send()
	return {text: oHTTP.ResponseText, headers: oHTTP.getAllResponseHeaders()}
}

BeforeExit:
	
	Gui, 1: Submit
	WinGetPos, xx, yy, , , ahk_id%_main_h%
	
	if (xx != x_pos && xx > 0)
		IniWrite,% xx,% INI, Main, x_pos
	if (yy != y_pos && yy > 0)
		IniWrite,% yy,% INI, Main, y_pos
	if (_url != url && _url)
		IniWrite,% _url,% INI, Main, url
	
	; Some commands
	
	if (A_ExitReason) {
		ExitApp
	}
Return

GuiClose:
	ExitApp

4

Re: AHK: ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

KusochekDobra
сейчас обнаружил https://www.autohotkey.com/docs/command … ToFile.htm
Эта штука работает вроде стабильно, я выходит велосипед изобретал...

5

Re: AHK: ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

В стремлении за своим любопытством, сквозь терни неизведанного, брошенный в прошлое взгляд из любой перспективы будет видеть велосипеды. Много велосипедов ... Свалку!

Я утешаю себя тем, что в моих экспериментах, не пострадало ни одного котика.
Всё это, в любом случае == не зря.

6

Re: AHK: ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

Тут вроде достаточно было только User-Agent прописать.

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