Re: AHK: Скачивание через GET/POST-запросы
Я посылаю их чтобы минимизировать вероятность получения ответа из кеша.
Хотя где-то пишут, что WinHttp и так не получает, но официального заявления я не видел.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Я посылаю их чтобы минимизировать вероятность получения ответа из кеша.
Хотя где-то пишут, что WinHttp и так не получает, но официального заявления я не видел.
Вот тут написано:
A number of WinINet features are not supported in WinHTTP, including URL caching...
Хотя точно неизвестно, не будет ли результат взят из кеша, если он там всё же присутствует, надо протестировать.
teadrinker, если используешь прокси, то точно надо использовать.
DD, как вариант вы можете начать использовать MSXML2.ServerXMLHTTP.6.0 объект.
В отличие от XMLHTTP Он происходит из WinHttpRequest, соответственно (все?) методы унаследованы тоже от него + новые возможности.
Сам я его глубоко не копал, поэтому о каких-либо возможных багах не в курсе.
https://support.microsoft.com/en-us/hel … verxmlhttp
https://docs.microsoft.com/en-us/previo … v%3dvs.85)
teadrinker, выше Вы приводили пример отлова ошибки —
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", "https://www.livejournal.com/__rpc_get_thread?journal=v-sidorov&itemid=310165&flat=&skip=&media=&expand_all=1&page=0", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
status := HTTP.status
if status not in 200,304
{
MsgBox, Статус: %status%
Return
}
try ResponseText := HTTP.ResponseText
catch {
MsgBox, Error
}
но при тестировании без соединения у меня выводится стандартное окно ошибки. Как сделать, чтобы при ошибке/норме соединения показывался соответствующий MsgBox?
Обрамляйте try->catch то место, где происходит ошибка.
Как ни пробую, выводит стандартное окно.
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", "https://vk.com/foaf.php?id=6", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
status := HTTP.status
if status in 200,304
{
try {
ResponseText := HTTP.ResponseText
MsgBox, %ResponseText%
}
catch {
MsgBox, Error
}
}
Else
{
MsgBox, Error
}
В окне обычно указана строка, которая вызывает проблему.
А разве у вас там ошибка?
teadrinker, вот эта строка выделяется: HTTP.WaitForResponse().
Malcev, когда отключаю соединение, выводится стандартная ошибка, а мне надо, чтобы вместо нее была моя команда.
Её и обрамляйте в try-catch, а лучше вместе с предыдущей.
Можно ли сделать то же самое без использования функций — то есть, вернуться из "catch" к тому, что перед этим скачивалось? На практике, в скрипте с восемью HTTP.WaitForResponse(), этот вариант не работает.
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
tt:
loop
{
dwn_fnc_1()
dwn_fnc_1()
{
Global
HTTP.Open("GET", "https://vk.com/foaf.php?id=z6", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
try {
HTTP.WaitForResponse()
}
catch {
sleep 1000
tooltip, - - -
dwn_fnc_1()
}
}
ResponseText := HTTP.ResponseText
tooltip, %ResponseText%
sleep 4000
}
return
А зачем вам вообще отлавливать ошибки?
Не проще ли их отключить?
Если отключить — в месте конкретной загрузки код будет снова и снова пытаться загрузить то, что сорвалось из-за проблем с соединением?
В скрипте выше при сбое соединения происходит ожидание и повторный переход к последней загрузке, пока она не скачается.
Не понимаю чего вы хотите добиться.
Задача в том, чтобы когда возникает ошибка соединения в строчке HTTP.WaitForResponse() — делалась бы пауза и затем повторная попытка скачать то, что не скачалось сразу перед этим. Так это сделано в 112 сообщении — с переходом к функции. Но в больших файлах, с рядом последовательных скачиваний, этот способ не срабатывает.
Можно в цикле проверять:
loop
{
HTTP.Open("GET", "https://vk.com/foaf.php?id=z6", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
if (HTTP.ResponseText != "")
break
sleep 1000
}
Спасибо, заработало) —
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
loop
{
HTTP.Open("GET", "https://vk.com/foaf.php?id=z6", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
try {
HTTP.WaitForResponse()
break
}
catch {
sleep 5000
}
}
MsgBox % HTTP.ResponseText
return
Теперь на следующий код, ВК выводит сообщение, что браузер IE не поддерживается. Можно ли в обход IE действовать?
post := "https://vk.com/wall-22822305_377885"
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("POST", post, true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
ResponseText := HTTP.ResponseText
MsgBox % ResponseText
Для этого вам нужно будет понять откуда сервер получает информацию, что вы заходите с IE.
Как же это сделать? И зачем тогда была строчка «HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")»?
Где была?
В кодах по скачиваниям через GET/POST-запросы.
Ого. Оказывается, если закомментировать эту строчку с "User-Agent", всё работает.
Потому что сервер может ругаться если не отправить ему User-Agent.
Если хотите подделать под фаерфокс, посмотрите какой User-Agent отправляет фаерфокс, а можете вообще свой придумать.
Привет. Программа логинится и скачивает Заметку с Фейсбука в мобильной версии, совершая переходы на предыдущие страницы комментариев. Но почему-то в скрипте переход происходит на ту же самую страницу, хотя в браузере они подгружаются к уже открытой в нем странице. Можно ли скриптом сымитировать поведение в браузере?
SetBatchLines -1
#SingleInstance Force
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
;-------------------------------------------------------
login := "***********"
password := "***********"
;-------------------------------------------------------
email := login
dest_path := A_ScriptDir
post_link := "https://mobile.facebook.com/notes/125979897479306/"
If not (LoginMode == 1)
{ ; при первом запуске один раз:
GoSub, login
LoginMode = 1
}
loop
{
sleep 1000
If A_Index = 1
URL := post_link
Else
URL := URL
HTTP.Open("GET", URL, true)
; HTTP.SetRequestHeader("Cookie", "remixlang=0") ; имена на русском
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
ResponseText := HTTP.ResponseText
match := "", Pos := 1
While Pos := RegExMatch(ResponseText, "s)(<div class=""[^""]*"" data-store=""[^""]*"" id=""\d+"".*?Ещё</a></div></div></div>)",match,Pos+StrLen(match))
all .= match1 "`n"
URL := ""
match := ""
If RegExMatch(ResponseText, "s)<a[^>]* href=""([^""]*)""[^>]*>(<[^>]*>)+ Просмотр предыдущих комментариев", match)
{
StringReplace match1, match1, &`;, &, All
URL := match1
URL = https://mobile.facebook.com%URL%
msgbox % URL
}
if (URL = "")
break
If (URL~="^https://mobile.facebook.com$")
break
}
all := all
fileappend, %all%, %dest_path% ;, UTF-8
all := ""
Return
login:
SplashImage,, y-2 x60 w40 h14 M C11 ZH0 ZW0 ZX1 ZY1 B1
. CTffffff CW3B5998 FM8 FS6 WM600 WS400,, login
;--------------------------------------------
;Авторизация:
;--------------------------------------------
HTTP.Open("POST", "https://mobile.facebook.com/login.php", true)
;HTTP.Open("POST", "https://mobile.facebook.com/login.php?refsrc=https%3A%2F%2Fmobile.facebook.com%2Flogin%2F&lwv=101&ref=dbl", true)
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send("email=" email "&pass=" password "&login=" login)
HTTP.WaitForResponse()
ResponseText := HTTP.ResponseText
ResponseText =
;--------------------------------------------
SplashImage, OFF
Return
С чего бы эта страница не скачивается?
page_link := "https://g_al_lic_a.b_n_f.fr/a_rk:/12148/bp_t6k9105580c/"
StringReplace, page_link, page_link, _,, All
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
User_Agent := "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
HTTP.Open("GET", page_link, true)
;HTTP.SetRequestHeader("Cookie", cookies)
HTTP.SetRequestHeader("DNT", "1")
HTTP.SetRequestHeader("Accept-Language", "ru-RU")
HTTP.SetRequestHeader("Connection", "Keep-Alive")
HTTP.SetRequestHeader("Accept", "text/html, application/xhtml+xml, */*")
HTTP.SetRequestHeader("User-Agent", User_Agent)
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
RTxt := HTTP.ResponseText
msgbox % RTxt
Может потому что в одну строку весь HTML-код?
В каком смысле не скачивается? Пустой MsgBox?
Тут об этом пишут, попробую — http://forum.script-coding.com/viewtopic.php?id=11238.
Где-то на оф. форуме обсуждали, можете поискать по номеру ошибки.
Только так работает:
page_link := "https://g_all_i_ca.bn_f.f_r/ar_k:/12_148/bpt6k_9105580c/"
StringReplace, page_link, page_link, _,, All
HTTP := ComObjCreate("Msxml2.XMLHTTP.6.0")
;HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
User_Agent := "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
HTTP.Open("GET", page_link, 0)
HTTP.SetRequestHeader("User-Agent", User_Agent)
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
;HTTP.WaitForResponse()
msgbox % HTTP.ResponseText
По какой причине оба запроса на winXP вызывают ошибки насчёт «WaitForResponse», «Send» и т.п.?
XMLHTTP := ComObjCreate("Msxml2.XMLHTTP.6.0")
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
XMLHTTP.Open("GET", "https://vivaldi.nlr.ru/bx000010589/details", 0)
XMLHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36")
XMLHTTP.SetRequestHeader("X-Requested-With", "XMLHttpRequest")
XMLHTTP.Send()
MsgBox % XMLHTTP.ResponseText
HTTP.Open("GET", "https://vivaldi.nlr.ru/bx000010589/details", 1)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36")
HTTP.SetRequestHeader("X-Requested-With", "XMLHttpRequest")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
MsgBox % HTTP.ResponseText
А зачем в 2020 году пользоваться WinXP???
Согласен, но есть люди, которые по разным причинам ещё пользуются. Допустимо скачивание через GET/POST-запросы на XP?
Думаю допустимы, но точно не знаю.
Я знакомство с автохотки начал с семерки.
Пересаживайте людей на десятку - избавитесь от многих танцев с бубнами.
Затрудняюсь понять, по какому принципу из этой книги скачать какую-нибудь страницу. Вроде указываю все хедеры, куки, но ответ приходит с ошибкой:
HTTP := ComObjCreate("Msxml2.XMLHTTP.6.0")
;HTTP := ComObjCreate("WinHTTP.WinHttpRequest.5.1")
User_Agent := "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
cookies := "ui=standard; VUFIND_SESSION=od9caslg428hesfidlc6fe4a41; supportOnlineTalkID=xo0W0UaclRRdAz0UVbVUhcDH7p2UuFrA; supportOnlineTalkID=xo0W0UaclRRdAz0UVbVUhcDH7p2UuFrA; s_l_p=STD9QvE5xSQpCthbBp38VrPSWfw00Z5O; s_l_p=STD9QvE5xSQpCthbBp38VrPSWfw00Z5O; supportListen=1; supportListen=1"
HTTP.Open("Get", "https://cdn.libfl.ru/books/BJVVV/001/390/849/JPEG_HQ/00004.jpg", 0)
HTTP.SetRequestHeader("User-Agent", User_Agent)
HTTP.SetRequestHeader("Cookie", cookies)
HTTP.SetRequestHeader("Accept", "image/webp,image/apng,image/*,*/*;q=0.8")
HTTP.SetRequestHeader("Accept-Encoding", "gzip, deflate, br")
HTTP.SetRequestHeader("Accept-Language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7")
HTTP.SetRequestHeader("Connection", "keep-alive")
HTTP.SetRequestHeader("Host", "cdn.libfl.ru")
HTTP.SetRequestHeader("Sec-Fetch-Mode", "no-cors")
HTTP.SetRequestHeader("Sec-Fetch-Site", "same-site")
HTTP.SetRequestHeader("ETag", "542a70f0-bc410")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.SetRequestHeader("bookID", "BJVVV_1390849")
HTTP.SetRequestHeader("view_mode", "HQ")
HTTP.Send()
msgbox % HTTP.ResponseText
Достаточно указывать только Referer.
С чем может быть связано, что скомпилированным AHK-скриптом не качается заблоченная провайдером страница через программу AdvOR, которая пропускает трафик выбранных исполняемых программ или браузеров через свои прокси?
А не скомпилированным скриптом качается?
А через какой объект качаете?
Если через Winhttp, то пробуйте через Msxml2.XMLHTTP.6.0.
Нескомпилированные AdvOR не видит. Через оба объекта пробовал, с соответствующими настройками для обоих —
lnk := "http://btdig.com/search?q=Starry+Eyes+2014"
Loop 1 {
if !html := GetHtml(lnk) {
break
}
else
msgbox % html
}
GetHtml(url) {
;ComObjError(false)
whr := ComObjCreate("Msxml2.XMLHTTP.6.0")
;whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
loop ;CONNECT_LOOP
{ ;CONNECT_LOOP
whr.Open("GET", url, false)
whr.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36")
whr.SetRequestHeader("Pragma", "no-cache")
whr.SetRequestHeader("Cache-Control", "no-cache, no-store")
whr.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
try {
whr.Send()
;whr.WaitForResponse()
Return html := whr.ResponseText
}
catch {
if (html != "")
break
msgbox Error2
Sleep, 2000
}
} ;CONNECT_LOOP
}
Я эту программу ставить не хочу, но если в IE указать нужное прокси, то Msxml2.XMLHTTP.6.0 будет также использовать его.
А для WinHttp его нужно прописывать в коде.
А-а, спасибо. Программу вроде можно и сразу запускать, без установки. Хороша тем, что в ней списки проксей, которые автоматически перебираются, в зависимости от отклика.
Оказалось, что AdvOR тоже надо параллельно запускать — прописывать прокси из него в IE и ещё в открываемых ссылках менять HTTPS на HTTP.
Но с чем связано, что не меняется IP?
Хороша тем, что в ней списки проксей, которые автоматически перебираются, в зависимости от отклика.
У меня платный сервис VPN.
AdvOR настраивать надо как-то так:
https://www.youtube.com/watch?v=IOP6q2hS0ng
С чем связано, что в коде страницы из браузера виден список guid всех страниц книги —
new Array("7BFD1A77-F1C8-5F1C-9A02-2B8DC22D527D","939037C6-6D78-E8B1-AFA6-61DDC68D35AA","97B9F3D7-7630-2202-46ED-3021C894C7AF","CD9F3D13-607D-60B1-842A-92991B8F9698","957585EB-AA40-FB0F-9A4F-8D932B7D57CA"
...
Но если скачивать страницу следующим скриптом, с указанием всех хедеров, то списка guid на ней нет? —
HTTP := ComObjCreate("Msxml2.XMLHTTP.6.0")
;HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", "http://arran.ru/bookreader/publication.php?guid=65A604C7-7FBD-4626-B8ED-9DCD463ACAF6&ida=1&kod=9#page/1/mode/1up", 0)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36")
HTTP.SetRequestHeader("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")
HTTP.SetRequestHeader("Connection", "Keep-Alive")
HTTP.SetRequestHeader("Content-Type", "text/html; charset=UTF-8")
HTTP.SetRequestHeader("Date", "Fri, 28 Aug 2020 12:39:28 GMT")
HTTP.SetRequestHeader("Keep-Alive", "timeout=5, max=100")
HTTP.SetRequestHeader("Server", "Apache/2.4.6 (CentOS) mod_auth_gssapi/1.3.1 mod_auth_kerb/5.4 PHP/7.4.1")
HTTP.SetRequestHeader("Transfer-Encoding", "chunked")
HTTP.SetRequestHeader("X-DNS-Prefetch-Control", "off")
HTTP.SetRequestHeader("X-Powered-By", "PHP/7.4.1")
HTTP.SetRequestHeader("Accept-Encoding", "gzip, deflate")
HTTP.SetRequestHeader("Accept-Language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7")
HTTP.SetRequestHeader("Cache-Control", "max-age=0")
HTTP.SetRequestHeader("Connection", "keep-alive")
HTTP.SetRequestHeader("Cookie", "has_js=1")
HTTP.SetRequestHeader("DNT", "1")
HTTP.SetRequestHeader("Host", "arran.ru")
HTTP.SetRequestHeader("Referer", "http://arran.ru/bookreader/publication.php?guid=65A604C7-7FBD-4626-B8ED-9DCD463ACAF6&ida=1&kod=9")
HTTP.SetRequestHeader("Upgrade-Insecure-Requests", "1")
HTTP.SetRequestHeader("guid", "65A604C7-7FBD-4626-B8ED-9DCD463ACAF6")
HTTP.SetRequestHeader("ida", "1")
HTTP.SetRequestHeader("kod", "9")
HTTP.Send()
;HTTP.WaitForResponse()
RTxt := HTTP.ResponseText
msgbox, % RTxt
FileAppend, %RTxt%, %A_desktop%\======.html, UTF-8
Оказывается, в ссылке не должно было быть "#page/1/mode/1up".
Как настроить этот код на постоянное скачивание, пока не перестанет приходить фрагмент текста с "erreur</title>"? Или может есть другой с таким функционалом?
url := "https://rapportgallica.bnf.fr/rapport/list?query=dc.XXXsource+all+'departement+Estampes+et+photographie'+and+dc.type+all+'image'+and+century+all+'18'+and+provenance+all+'bnf.fr'&entryNumber=af99c6fd1c39438ba532ab9518f827d3"
Loop 1 {
if !html := GetHtml(url) {
error := "Failed to load html`n" url
break
}
else
RTxt := html
}
msgbox % RTxt
GetHtml(url) {
whr := ComObjCreate("Msxml2.XMLHTTP.6.0")
loop ;CONNECT_LOOP
{ ;CONNECT_LOOP
whr.Open("GET", url, false)
whr.SetRequestHeader("User-Agent", User_Agent)
whr.SetRequestHeader("Pragma", "no-cache")
whr.SetRequestHeader("Cache-Control", "no-cache, no-store")
whr.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
try {
whr.Send()
;whr.WaitForResponse()
Return html := whr.ResponseText
;if (HTTP.ResponseText != "")
break
}
catch {
Sleep, 2000
}
} ;CONNECT_LOOP
}
Так вроде работает:
html := whr.ResponseText
if InStr(html, "erreur</title>")
continue
Return html
Перехватывайте через другой броузер.
Смотрел в старых и в новых, но видимо какие-то особенности есть у этого инструмента разработчика, что его опознают на странице.
Ну и что показывает хром?
То же самое, и страница не загружается.
Смотрите тогда через fiddler.
Следующий код скачивает фрагменты картинок, с возрастающим вторым числом: 0_0.jpg, 0_1.jpg, 0_2.jpg — пока содержимое не будет картинкой (до 0_28.jpg). Как после скачивания увеличить первое число, обнулить второе и продолжить загрузку файлов 1_0.jpg, 1_1.jpg, 1_2.jpg (до 1_28.jpg) — и т.д.?
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
User_Agent := "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
start := 0
while (value := start + (A_Index - 1)*1) <= 9999999
{
loop ;CONNECT_LOOP
{ ;CONNECT_LOOP
HTTP.Open("GET", "http://www.bl.uk/manuscripts/Proxy.ashx?view=yates_thompson_ms_36_f001r_files/13/0_" value ".jpg", true)
HTTP.SetRequestHeader("User-Agent", User_Agent)
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
try {
HTTP.Send()
HTTP.WaitForResponse()
Body := HTTP.ResponseBody
RTxt := HTTP.ResponseText
;If InStr(RTxt, "NoImage.jpg - The remote server returned an error")
If !InStr(RTxt, "ÿØÿà")
break
pData := NumGet(ComObjValue(Body), A_PtrSize = 8? 16:12, "ptr")
File := FileOpen(A_ScriptDir "\" page_code "\0_" value ".jpg", "w")
File.RawWrite(pData + 0, Body.MaxIndex() + 1)
File.Close()
break
}
catch {
Sleep, 5000
}
} ;CONNECT_LOOP
} ;while
А как этот вопрос связан с названием темы "Скачивание через GET/POST-запросы"?
Это же скачивание через GET-запрос.
Но вопрос-то ваш связан не с этим.
Вы же спрашиваете про обнуление переменных.
Просто обнулить я бы мог, но надо увязать это со скачиванием). Согласен, можно было бы сузить название темы.
Возможно ли скачать страницу, чтобы отработали js-сценарии, как в браузере? Ниже код скачивает страницу и выводит её фрагмент, в котором js-сценарий в браузере заменяет переменные на соответствующий им текст (что видно в инструментах разработчика). Как добиться того же через скрипт?
HTTP := ComObjCreate("Msxml2.XMLHTTP.6.0")
HTTP.Open("GET", "https://gallica.bnf.fr/ark:/12148/btv1b8449039t/?lang=FR", 0)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
;HTTP.WaitForResponse()
RTxt := HTTP.ResponseText
RTxt := RegExReplace(RTxt, "s).*(<span id=""id_gallicarteSpan"".*?</span>).*", "$1")
msgbox % RTxt
Возможно ли скачать страницу, чтобы отработали js-сценарии, как в браузере?
Конечно, браузер это и делает!
Имеется в виду: скачать как в браузере — скриптом. Причём — AHK.
Браузер примерно так же и скачивает.
Вот вам пример для размышления:
html = <script>alert("hi")</script>
doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
doc.write(html)
А как этот пример применить к тому, что я приводил?
Немного пошевелить мозгами.
Вот подставляю HTML-код с того сайта вместо <script>alert("hi")</script> — ничего не даёт:
html := RTxt
doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
doc.write(html)
html := RegExReplace(html, "s).*(<span id=""id_gallicarteSpan"".*?</span>).*", "$1")
msgbox % html
Во-первых я не знаю зачем teadrinker использует допотопный IE9.
Я бы 'эмулировал через edge.
doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=Edge"">")
Во-вторых вы в панеле разработчика разве через регулярку получаете нужные вам данные?
Ну или даже если хотите получать через регулярку, то вам надо сначала подождать пока они все загрузятся, после чего получить outerhtml документа в переменную и после чего ее уже парсить регуляркой.
По примеру teadrinker'а с выводом alert мне казалось, что после строки "doc.write(html)" — HTML-код уже сформирован.
Как подождать, чтобы они загрузились и получить outerhtml?
Так же как и в автоматизации IE.
Пользуйтесь поиском.
Так тоже не работает:
html := RTxt
doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=Edge"">")
doc.write(html)
html := doc.documentElement.outerhtml
;html := doc.document.documentElement.OuterHtml
html := RegExReplace(html, "s).*(<span id=""id_gallicarteSpan"".*?</span>).*", "$1")
msgbox % html
document.body тоже не подходит:
html := doc.document.body.outerhtml
Значит хтмл документа не перезаписывается.
Получайте этот элемент так же, как вы получаете его в консоле броузера.
И я не вижу, что вы ожидаете, что документ загрузился.
Вот этой строкой
doc := ComObjCreate("htmlfile")
вы получаете объект документа - DOM.
https://www.w3schools.com/jsref/dom_obj_document.asp
Получайте этот элемент так же, как вы получаете его в консоле броузера.
А как я его получаю в консоле браузера?
Посмотрел по сайту — нет примеров с ожиданием отработки сценариев на странице. Что надо добавить?
url := "https://gallica.bnf.fr/ark:/12148/btv1b8449039t/?lang=FR"
if !html := GetHtml(url) {
MsgBox, Failed to get HTML
ExitApp
}
Doc := DocumentFromHtml(html)
elem := Doc.GetElementById("id_gallicarteSpan")
msgbox % elem
GetHtml(url) {
whr := ComObjCreate("Msxml2.XMLHTTP.6.0")
whr.Open("GET", url, false)
whr.SetRequestHeader("Pragma", "no-cache")
whr.SetRequestHeader("Cache-Control", "no-cache, no-store")
whr.Send()
Return html := whr.ResponseText
}
DocumentFromHtml(html) {
doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
doc.write(html)
Return doc
}
По ссылке же все написано.
https://www.w3schools.com/jsref/met_doc … lector.asp
То есть, вместо этого
elem := Doc.GetElementById("id_gallicarteSpan")
должен быть такой формат?
document.querySelector("p.example");
Ищите на форуме.
Об этом говорилось уже много раз.
Посмотрел по сайту — нет примеров с ожиданием отработки сценариев на странице. Что надо добавить?
Применяю, тоже не срабатывает:
while Doc.readystate <> 4
{
continue
}
Malcev, кстати, тот случай, когда с IE=edge не работает.
Что не так делаю?
url := "https://gallica.bnf.fr/ark:/12148/btv1b8449039t/?lang=FR"
req := ComObjCreate("MSXML2.XMLHTTP.6.0")
req.Open("GET", url, 0)
req.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36")
req.SetRequestHeader("Pragma", "no-cache")
req.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
req.send()
html := req.ResponseText
while (req.ReadyState != 4)
Continue
req := ComObjCreate("htmlfile")
req.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")
req.write(html)
html := req.body.outerhtml
msgbox % html
;html := req.doc.getElementById("id_gallicarteSpan")
;html := req.document.querySelector("#id_gallicarteSpan")
html := RegExReplace(html, "s).*(<span id=""id_gallicarteSpan"".*?</span>).*", "$1")
msgbox % html
Для начала поясните, каков сакральный смысл создания переменной RTxt, если она потом не используется.
Она вроде передаётся в переменную html —
html := RTxt
А в чём сакральный смысл подобной передачи?
Это когда я различные фрагменты кодов применял во время тестов, мне так проще было. Особого смысла не вкладывал).
Ну вот и вложите, пишите код со смыслом, тогда и вопросы начнут сами собой отпадать.
А из существенного что там не так?
Давайте сначала исправим уже найденные недостатки. И напрасно вы путаницу с переменными считаете несущественной.
Исправил.
while (req.ReadyState != 4) Continue
А какой смысл в этой части?
Вроде, это ожидание полной загрузки страницы, который я подсмотрел в разных кодах. Был ещё такой вариант:
while req.readystate <> 4
Полной загрузки куда? Ведь ответ вы уже получили строкой ранее в переменную html. Думаете, её содержание должно каким-то чудесным образом измениться?
В смысле — полной загрузки, вместе с ява-сценариями, на необходимости чего Malcev настаивал.