Тема: AHK: Получить текст с HTML страницы в переменную
Возможно ли такое?
Или единственный вариант, зайти через браузер и скопировать содержимое в клипбоард?
Спасибо!
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Возможно ли такое?
Или единственный вариант, зайти через браузер и скопировать содержимое в клипбоард?
Спасибо!
Только текст или с картинками ?
Только текст.
Как вариант вот так. Сейчас в соседней теме как раз это же и обсуждаем.
AHK: WinHTTP
;Константы используемые в WinHttpRequest
global WinHttpRequestOption_EnableRedirects := 6
global WinHttpRequestOption_MaxAutomaticRedirects := 14
global WinHttpRequestOption_EnableHttpsToHttpRedirects := 12
; Создаём объект для запросов по HTTP протоколу
global oHttpRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;Включаем автоматические редиректы
oHttpRequest.Option(WinHttpRequestOption_EnableRedirects) := -1
;Включаем автоматические редиректы с HTTP на HTTPS
oHttpRequest.Option(WinHttpRequestOption_EnableHttpsToHttpRedirects) := -1
;Выставляем максимальное количество редиректов
oHttpRequest.Option(WinHttpRequestOption_MaxAutomaticRedirects) := 20
; Загружаем страницу c сайта РБК
oHtmlDoc := documentFromURL("http://www.rbc.ru/")
MsgBox % oHtmlDoc.body.outerText
; Функция загрузки и построения документа с указанного URL
documentFromURL(ByRef sURL) {
; Отправляем GET запрос на сервер
oHttpRequest.open("GET", sURL, false)
oHttpRequest.send()
; Строим из полученных данных документ и возвращаем из функции
return documentFromHTML(oHttpRequest.responseText, sURL)
}
; Функция создания документа из HTML кода
documentFromHTML(ByRef sHTMLCode, ByRef sBaseURL) {
; Создаём объект для парсинга HTML кода
oDoc := ComObjCreate("htmlfile")
oDoc.open()
; Вставляем базовый тэг чтобы у относительных ссылок была верная адрессация от базового адреса
oDoc.write("<base href=""" . sBaseURL . """>")
oDoc.close()
oDoc.body.innerHTML := sHTMLCode
return oDoc
}
Круто! Спасибо!
Даже и не думал, что такое возможно.
А что можно добавить, чтоб он читал только первое сообщение этого форума (при условии, что его нельзя показать отдельно)
А что можно добавить, чтоб он читал только первое сообщение этого форума (при условии, что его нельзя показать отдельно)
Моя реакция на вопрос... O_o
Такс... По порядку.
1) Зачем это надо ?
2) В форуме множество разделов. Сообщение из какого раздела интересует ?
3) Что значит "при условии, что его нельзя показать отдельно" ?
1) Чтобы на треккере следить только за изменениями в шапке темы.
2) Да хотя бы в этом топике получить мой вопрос.
Возможно ли такое?
Или единственный вариант, зайти через браузер и скопировать содержимое в клипбоард?
Спасибо!
3) Нету прямой ссылки на это мое первое сообщение, только на весь тред.
Апдейт. Извиняюсь за свою невнимательность - отдельная ссылка на сообщение есть - просто она не показывается в новом окне.
Большое спасибо!
По прежнему с трудом понимаю смысл вопроса. Но вот вроде то, что Вы хотели.
;Константы используемые в WinHttpRequest
global WinHttpRequestOption_EnableRedirects := 6
global WinHttpRequestOption_MaxAutomaticRedirects := 14
global WinHttpRequestOption_EnableHttpsToHttpRedirects := 12
; Создаём объект для запросов по HTTP протоколу
global oHttpRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;Настраиваем HttpRequest
oHttpRequest.Option(WinHttpRequestOption_EnableRedirects) := -1
;Включаем автоматические редиректы
oHttpRequest.Option(WinHttpRequestOption_EnableHttpsToHttpRedirects) := -1
;Выставляем максимальное количество редиректов
oHttpRequest.Option(WinHttpRequestOption_MaxAutomaticRedirects) := 20
; Загружаем страницу
oHtmlDoc := documentFromURL("http://forum.script-coding.com/")
;Получаем все тэги LI
colLiTags := oHtmlDoc.all.tags("li")
;Перебираем тэги LI
loop , % colLiTags.length-1
{
i++
oLi := colLiTags[i]
;Находим тэги с классом info-lastpost
if (oLi.className = "info-lastpost")
{
;Выводим заголовок сообщения + ссылку
MsgBox % oLi.innerText . "`r Ссылка: " . oLi.all.tags("a")[0].href
}
}
; Функция загрузки и построения документа с указанного URL
documentFromURL(ByRef sURL) {
; Отправляем GET запрос на сервер
oHttpRequest.open("GET", sURL, false)
oHttpRequest.send()
; Строим из полученных данных документ и возвращаем из функции
return documentFromHTML(oHttpRequest.responseText, sURL)
}
; Функция создания документа из HTML кода
documentFromHTML(ByRef sHTMLCode, ByRef sBaseURL) {
; Создаём объект для парсинга HTML кода
oDoc := ComObjCreate("htmlfile")
oDoc.open()
; Вставляем базовый тэг чтобы у относительных ссылок была верная адрессация от базового адреса
oDoc.write("<base href=""" . sBaseURL . """>")
oDoc.close()
;oDoc.write(sHTMLCode)
oDoc.body.innerHTML := sHTMLCode
return oDoc
}
Все-таки не получается задуманное.
Я хочу получить только первое сообщение в этой теме:
Вот оно:
http://forum.script-coding.com/viewtopi … 040#p81040
Но если я вставляю эту ссылку в ваш первый скрипт, то он мне выдает полностью всю нашу с вами переписку.
А если во второй, то вообще ничего не выдает, хотя я там пробовал менять таги.
Не вижу в чём сложность. Замените в предыдущем скрипте код на этот блок.
oHtmlDoc := documentFromURL("http://forum.script-coding.com/viewtopic.php?pid=81050#p81050")
colDivTags := oHtmlDoc.all.tags("div")
loop , % colDivTags.length-1
{
i++
oDivTag := colDivTags[i]
;Находим тэги с классом
if (oDivTag.className = "postbody online")
{
;Выводим заголовок сообщения + ссылку
MsgBox % oDivTag.innerText
exit
}
}
Работает!
Не могли бы вы поделиться алгоритмом, как вы все эти таги нашли и перебрали?
Или киньте, пожалуйста, ссылку, где об этом доходчиво пишут.
Алгоритм прост. Открыл в браузере ( в моём случае хром ) страницу сайта. Нажал F12, чтобы вызвать панель разработчика. Кликнул по значку лупы, а потом на интересующий меня блок на странице. В окне с деревом html тэгов раскрылся тот который я искал. Из кода я выяснил, что у ячейки установлен только classname, значит придётся искать по нему, что я и сделал в скрипте. Механику парсинга и отбора тэгов я позаимствовал у HTML DOM Document. Вот вроде бы и всё.
Разобрался.
Спасибо!
Кстати, у вас ошибка
;Находим тэги с классом
if (oDivTag.className = "postbody online")
Этот таг появляется если только пользователь в онлайне.
Поэтому для высвечивания первого сообщения надо брать этот таг:
;Находим тэги с классом
if (oDivTag.className = "post odd firstpost topicpost")
Malcev, действительно. Поздравляю, вот Вы уже в теме лучше меня разобрались.
Копался тут с разными сайтами и понял, что в ваш код нужно добавить:
oHttpRequest.SetRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)")
А то некоторые сайты возвращают ошибку - "0x80072F78" ERROR_WINHTTP_INVALID_SERVER_RESPONSE
А вот что изменить в коде, чтобы получить текст с флешсайта, так и не понял.
Вот такой код работает:
URL := "http://www.sensisoft.com/"
oHTTP := ComObjCreate("WinHttp.WinHttpRequest.5.1")
oHTTP.Open("GET", URL , False)
oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)")
oHTTP.Send
Gui, Add, Edit, w800 r30, % oHTTP.ResponseText
Gui, Show
return
GuiClose:
ExitApp
Ваш же скрипт подвисает
;Константы используемые в WinHttpRequest
global WinHttpRequestOption_EnableRedirects := 6
global WinHttpRequestOption_MaxAutomaticRedirects := 14
global WinHttpRequestOption_EnableHttpsToHttpRedirects := 12
; Создаём объект для запросов по HTTP протоколу
global oHttpRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;Включаем автоматические редиректы
oHttpRequest.Option(WinHttpRequestOption_EnableRedirects) := -1
;Включаем автоматические редиректы с HTTP на HTTPS
oHttpRequest.Option(WinHttpRequestOption_EnableHttpsToHttpRedirects) := -1
;Выставляем максимальное количество редиректов
oHttpRequest.Option(WinHttpRequestOption_MaxAutomaticRedirects) := 20
; Загружаем страницу c сайта РБК
oHtmlDoc := documentFromURL("http://www.sensisoft.com/")
MsgBox % oHtmlDoc.body.outerText
; Функция загрузки и построения документа с указанного URL
documentFromURL(ByRef sURL) {
; Отправляем GET запрос на сервер
oHttpRequest.open("GET", sURL, false)
oHttpRequest.send()
; Строим из полученных данных документ и возвращаем из функции
return documentFromHTML(oHttpRequest.responseText, sURL)
}
; Функция создания документа из HTML кода
documentFromHTML(ByRef sHTMLCode, ByRef sBaseURL) {
; Создаём объект для парсинга HTML кода
oDoc := ComObjCreate("htmlfile")
oDoc.open()
; Вставляем базовый тэг чтобы у относительных ссылок была верная адрессация от базового адреса
oDoc.write("<base href=""" . sBaseURL . """>")
oDoc.close()
oDoc.body.innerHTML := sHTMLCode
return oDoc
}
В чем может быть причина?
А как получить текст с сайта если там установлен Ddos Protection?
http://facepunch.com/
;Константы используемые в WinHttpRequest
global WinHttpRequestOption_EnableRedirects := 6
global WinHttpRequestOption_MaxAutomaticRedirects := 14
global WinHttpRequestOption_EnableHttpsToHttpRedirects := 12
; Создаём объект для запросов по HTTP протоколу
global oHttpRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;Включаем автоматические редиректы
oHttpRequest.Option(WinHttpRequestOption_EnableRedirects) := -1
;Включаем автоматические редиректы с HTTP на HTTPS
oHttpRequest.Option(WinHttpRequestOption_EnableHttpsToHttpRedirects) := -1
;Выставляем максимальное количество редиректов
oHttpRequest.Option(WinHttpRequestOption_MaxAutomaticRedirects) := 20
; Загружаем страницу c сайта РБК
oHtmlDoc := documentFromURL("http://facepunch.com/")
MsgBox % oHtmlDoc.body.outerText
; Функция загрузки и построения документа с указанного URL
documentFromURL(ByRef sURL) {
; Отправляем GET запрос на сервер
oHttpRequest.open("GET", sURL, false)
oHttpRequest.send()
; Строим из полученных данных документ и возвращаем из функции
return documentFromHTML(oHttpRequest.responseText, sURL)
}
; Функция создания документа из HTML кода
documentFromHTML(ByRef sHTMLCode, ByRef sBaseURL) {
; Создаём объект для парсинга HTML кода
oDoc := ComObjCreate("htmlfile")
oDoc.open()
; Вставляем базовый тэг чтобы у относительных ссылок была верная адрессация от базового адреса
oDoc.write("<base href=""" . sBaseURL . """>")
oDoc.close()
oDoc.body.innerHTML := sHTMLCode
return oDoc
}
Пока написал вот это, но как узнать правильный answer?
url = http://facepunch.com/
Post_url = http://facepunch.com/cdn-cgi/l/chk_jschl?jschl_vc=
HTTP := ComObjCreate("WinHttp.WinHttpRequest.5.1")
HTTP.Open("GET", url, false)
HTTP.Send()
PostData := StringBetween(HTTP.ResponseText, "jschl_vc"" value=""", """/>")
HTTP.Open("POST", Post_url . PostData, false)
HTTP.Send()
msgbox % HTTP.ResponseText
StringBetween(Str, NS, NE) {
If (P1:=InStr(Str, NS, 1)) && (P2:=InStr(Str, NE, 1, P1+=StrLen(NS)))
Return SubStr(Str, P1, P2-P1)
}
В последней редакции StringBetween была такой:
StringBetween(Str, NS, NE) {
If (P1:=InStr(Str, NS, 1)+StrLen(NS)) && (P2:=InStr(Str, NE, 1, P1))
Return SubStr(Str, P1, P2-P1)
}
хотя отличия Я и сам не помню.
А что за answer имеется ввиду?
Так все-таки из 44 сообщения или 45?
http://forum.script-coding.com/viewtopi … 170#p83170
Если зайти на этот сайт через броузер и посмотреть, что подгружается, то мы увидим,
что загружается такой редирект:
http://facepunch.com/cdn-cgi/l/chk_jschl?jschl_vc=b82a32dbba6147d316840394eb88f515&jschl_answer=90
И вот не понятно откуда взять answer?
Так все-таки из 44 сообщения или 45?
Точно не помню, погоняй пока из 45.
И вот не понятно откуда взять answer?
Непойму, там же написано что 90.
Там он каждый раз генерится.
В общем он как-то подсчитывается броузером в этом коде и посылается переменная a.value = parseInt(zbbQQmj.MRKyiKkkyYoz, 10) + t.length
<script type="text/javascript">
//<![CDATA[
(function(){
var a = function() {try{return !!window.addEventListener} catch(e) {return !1} },
b = function(b, c) {a() ? document.addEventListener("DOMContentLoaded", b, c) : document.attachEvent("onreadystatechange", b)};
b(function(){
var a = document.getElementById('cf-content');a.style.display = 'block';
setTimeout(function(){
var t,r,a,f, zbbQQmj={"MRKyiKkkyYoz":+((+!![]+[])+(!+[]+!![]+!![]))};
t = document.createElement('div');
t.innerHTML="<a href='/'>x</a>";
t = t.firstChild.href;r = t.match(/https?:\/\//)[0];
t = t.substr(r.length); t = t.substr(0,t.length-1);
a = document.getElementById('jschl-answer');
f = document.getElementById('challenge-form');
;zbbQQmj.MRKyiKkkyYoz-=+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]));zbbQQmj.MRKyiKkkyYoz*=+((!+[]+!![]+[])+(!+[]+!![]+!![]));zbbQQmj.MRKyiKkkyYoz*=+((+!![]+[])+(!+[]+!![]+!![]));zbbQQmj.MRKyiKkkyYoz-=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]));zbbQQmj.MRKyiKkkyYoz-=!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![];a.value = parseInt(zbbQQmj.MRKyiKkkyYoz, 10) + t.length;
f.submit();
}, 5850);
}, false);
})();
//]]>
</script>
Решил таки эту задачку:
link := "http://forum.teamspeak.com"
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", link, true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)")
HTTP.Send()
HTTP.WaitForResponse()
msgbox % clipboard := ResponseText := HTTP.ResponseText
RegexMatch(ResponseText, "s)setTimeout.+?, (.+?)=\{""(.+?)"":(.+?)}.+?jschl_vc"" value=""(.+?)"".+?pass"" value=""(.+?)""", match)
var := match1 "." match2
jschl_vc := match4
pass := match5
FinalResult := Count(match3)
match := "", Pos := 1
While Pos := RegExMatch(ResponseText, "s);" var "(..)(.+?)(?=;)",match,Pos+StrLen(match))
{
result := Count(match2)
if (match1 = "+=")
FinalResult += result
if (match1 = "-=")
FinalResult -= result
if (match1 = "*=")
FinalResult *= result
}
JsLink := RegexReplace(link, "(^https?://.+?)/.*","$1")
finalresult += StrLen(RegexReplace(JsLink, "^https?://"))
JsLink .= "/cdn-cgi/l/chk_jschl?jschl_vc=" jschl_vc "&pass=" pass "&jschl_answer=" finalresult
sleep 5000
HTTP.Open("GET", Jslink, true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)")
HTTP.Send()
HTTP.WaitForResponse()
msgbox % clipboard := ResponseText := HTTP.ResponseText
Count(var)
{
match := digit := "", Pos := 1
While Pos := RegExMatch(var, ".+?(\+\(|$)",match,Pos+StrLen(match))
{
RegexReplace(match, "(!\+\[]|\+!!\[])",,count)
digit .= count
}
return digit
}
; +[] = 0
; +!![] = 1
; !+[] = 1
; *=+((!+[]+!![]+!![]+!![]+[])+(+!![])) 41
; ; +=+((+!![]+[])+(+[])) 10
Интересно, возможно такое воплотить с htmlfile, т.е. выполнение js напрямую?
Подниму тему.
Как выполнить джаваскрипт на странице http://forum.teamspeak.com и посчитать ответ с помощью
https://github.com/Lexikos/ActiveScript.ahk
Есть у кого-нибудь идеи?
В идеале хотелось бы получить алгоритм выполнения любых джава-скриптов на страницах, чтобы результат потом отправлять через WinHttpRequest.
Как вариант вот так.
Здравствуйте!
В примере отсюда http://forum.script-coding.com/viewtopi … 045#p81045
не удаётся вести URL как переменную.
Пытаюсь и так:
IN_URL = "http://ya.ru"
....
MsgBox IN_URL: %IN_URL%
tempvar = documentFromURL(%IN_URL%)
MsgBox tempvar: %tempvar%
oHtmlDoc := tempvar
и так:
oHtmlDoc := documentFromURL(IN_URL)
Получаю ошибку / пустоту.
Помогите пожалуйста, ввести URL в виде переменной? Как это правильно сделать?
Спасибо!
lemurr-filter, код оформляется специальным тегом, я поправил Ваше сообщение.
lemurr-filter, в первом примере у вас две ошибки использования переменных.
stealzy, здравствуйте!
А как правильно указать переменную для этого кода, подскажите пожалуйста?
А зачем вам именно этот код?
Что вы именно хотите получить?
Malcev, здравствуйте!
Хочу получить текст HTML страницы в переменную (как в теме топика), но только из разных, подставляемых URL.
Cейчас пытаюсь воспользоваться Вашим примером отсюда http://forum.script-coding.com/viewtopi … 74#p101274, но на данном компьютере возникает иная ошибка, Autohotkey говорит:
"Error at line 2.
Line Text: global WinHttpRequestOption_EnableRedirects := 6
Error: This line does not contain a recognized action.
The program will exit".
((( И с кодом Xameleon'а - на данном компьютере тоже похожая.
Не подскажете в чём может быть дело?
P.S. другие мои скрипты (попроще) работают нормально.
UPD: Обновил Autohotkey, теперь всё хорошо.
Спасибо всем!
Зачем вы 2 поста постоянно поднимаете?
url := "https://ya.ru/"
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", url, 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")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
msgbox % HTTP.ResponseText
Malcev Спасибо огромное!
Дабы новой темы не создавать спрошу здесь.
Не получается по описанным способам получить из страницы текст в переменную.
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
HttpObj.Open("POST", "http://pwlegendary.ucoz.ru/Clients.txt")
HttpObj.Send()
rawHtmlResponse := HttpObj.ResponseText
document := ComObjCreate("HTMLfile")
document.write(rawHtmlResponse)
textElement := document.getElementsByTagName("pre")[0].innertext
MsgBox, % textElement
Не работает никак.
;Константы используемые в WinHttpRequest
global WinHttpRequestOption_EnableRedirects := 6
global WinHttpRequestOption_MaxAutomaticRedirects := 14
global WinHttpRequestOption_EnableHttpsToHttpRedirects := 12
; Создаём объект для запросов по HTTP протоколу
global oHttpRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;Включаем автоматические редиректы
oHttpRequest.Option(WinHttpRequestOption_EnableRedirects) := -1
;Включаем автоматические редиректы с HTTP на HTTPS
oHttpRequest.Option(WinHttpRequestOption_EnableHttpsToHttpRedirects) := -1
;Выставляем максимальное количество редиректов
oHttpRequest.Option(WinHttpRequestOption_MaxAutomaticRedirects) := 20
; Загружаем страницу c сайта РБК http://forum.script-coding.com/ "http://pwlegendary.ucoz.ru/Clients.txt
oHtmlDoc := documentFromURL("http://pwlegendary.ucoz.ru/Clients.txt")
MsgBox, % oHtmlDoc.body.outerText
Работает, но извлекает в сплошную линию, нужно извлечь так же как открывается ссылка то есть построчно.
wb := COM_CreateObject("InternetExplorer.Application")
wb.visible := True
wb.navigate("http://pwlegendary.ucoz.ru/Clients.txt")
While wb.readystate <> 4
sleep, 100
OutputText := wb.document.getElementsByTagName("pre")[0].innertext
MsgBox, % OutputText
wb.quit()
С этим вариантом вообще глюки. Один раз извлек, потом поменял содержимое на странице и при повторном запуске получал результат с первого запуска и так далее. wb.quit вообще не помогает, в диспетчере задач окна остаются. Примечание: первый запуск был wb.visible := false, может скрытое окно где-то в системе потерялось и из него прошлые результаты извлекались. Пробовал другими способами отследить и убить скрытые объекты IE, - не помогло.
В общем, есть ссылка. Как извлечь построчно текст не знаю.
Вариант с FTP не подходит.
url := "http://pwlegendary.ucoz.ru/Clients.txt"
http := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
http.Open("GET", url)
http.Send()
http.WaitForResponse()
MsgBox, % http.ResponseText
teadrinker, спасибо, если честно, то искал с обеда по интернету ответ.)
teadrinker,
http.WaitForResponse() - здесь лишний.
Да, точно, это только для асинхронного варианта.
Странникх, вы ведь темой ошиблись. Вам же не текст html страницы нужен, а просто файл.
искал с обеда
WTF???
первая ссылка,
URLdownloadToVar.
Мне нужен именно текст, потому что как я писал выше
Вариант с FTP не подходит.
Вариант с FTP я начинал еще использовать пару лет назад. Мне через скачивание не нужно, не подходит для целей просто вот и все.
teadrinker, а как вывести условие (что-то вроде if site != open), что проблема с соединением (нет подключения) или запрос на страницу не загружается?
Как-то так:
url := "http://pwlegendary.ucoz.ru/Clients.txt"
http := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
http.Open("GET", url)
try http.Send()
catch e {
MsgBox,, Ошибка подключения, % e.Message
Return
}
MsgBox, % http.ResponseText
А если ссылка удалена (если не существует, ошибка 404)?
Модератор: Избыточное цитирование запрещено. Цитата предыдущего поста удалена.
В том виде, в котором сейчас, с точки зрения http-запроса это не ошибка, просто сайт отдаёт страницу с такой информацией. Так что только парсингом ответа.
Странникх, какое ftp, где вы его увидели вообще тут? По ссылкам пройдите хоть...
Тема про получение текста из html. А вам нужно просто содержание файла по url, на что и даны ссылки.
Разницу понимаете?
В UrlDownloadToVar() ошибки помещаются в ErrorLevel.
А, вспомнил, возвращённый код статуса нужно проверить:
url := "http://pwlegendary.ucoz.ru/Clients.txt"
http := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
http.Open("GET", url)
try http.Send()
catch e {
MsgBox,, Ошибка подключения, % e.Message
Return
}
status := http.Status
if (status != 200) { ; HTTP_STATUS_OK
MsgBox,, Что-то не так, Status = %status%
Return
}
MsgBox, % http.ResponseText
Я бы это
if (status != 200) { ; HTTP_STATUS_OK
заменил на
if (status != 200) and (status != 304) { ; HTTP_STATUS_OK
304 Not Modified (не изменялось)
А в каком случае может прийти последнее?
Сам нашёл:
304 Not Modified — сервер возвращает такой код, если клиент запросил документ методом GET, использовал заголовок If-Modified-Since или If-None-Match и документ не изменился с указанного момента.
По-моему, не тот случай.
Согласен. Пока случай не тот.
Но, по-моему, лучше заранее предусмотреть и такой вариант.
Хотя, вроде как, возможны всякие случаи:
IIS 7 returns 304 instead of 200
I have a strange issue with IIS 7.
Sometimes it seems to return a 304 instead of a 200.
Here is a sample request captured with Fiddler:
(Note that the file requested is not located in my browsers cache yet.)
GET https://[mysite]/Content/js/jquery.form.js HTTP/1.1
Accept: */*
Referer: https://[mysite]/Welcome/News
Accept-Language: sv-SE
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: [mysite]
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: ...
Note that there is no If-Modified-Since or If-None-Match in the request.
But still the response is:
HTTP/1.1 304 Not Modified
Cache-Control: public
Expires: Tue, 02 Mar 2010 06:26:08 GMT
Last-Modified: Mon, 22 Feb 2010 21:58:44 GMT
ETag: "1CAB40A337D4200"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Mon, 01 Mar 2010 17:06:34 GMT
Хотя, вроде как, возможны всякие случаи
Так зачем гадать, ответ зависит от запроса.
Ну по ссылке, котоую я привел, как я понял, человек не отправляя ни If-Modified-Since ни If-None-Match получал в ответ 304.
Ну, просто объект выдал поведение, которое не описано в той справке, которую человек читал. Все такие случаи предусмотреть невозможно, почему ты именно этот берёшь?
Я предлагал вставить на проверку 304 Not Modified (не изменялось), не для того чтобы избежать багов некоторых серверов (это я уже загуглив нашел и запостил сюда как диковинку), а для того чтобы, если в будущем захочется посылать соответствующие запросы, то не получить в ответ, что "Что-то не так, Status = %status%", хотя всё будет так, как надо.
И, кстати, справка по автохотки со мной согласна:
https://autohotkey.com/docs/commands/UR … ToFile.htm
Ready() {
global req
if (req.readyState != 4) ; Not done yet.
return
if (req.status == 200 || req.status == 304) ; OK.
MsgBox % "Latest AutoHotkey version: " req.responseText
else
MsgBox 16,, % "Status " req.status
ExitApp
}
Как и автор книги Bulletproof Ajax by Jeremy Keith:
function doSomething() {
if (request.readyState == 4) {
if (request.status == 200 || request.status == 304
) {
// the response was sent successfully
} else {
// something went wrong!
}
}
}
если в будущем захочется посылать соответствующие запросы
Так ещё раз, ответ зависит от запроса. Статусы могут быть самые разные, и они не всегда означают какую-то ошибку.
Как и автор книги Bulletproof Ajax by Jeremy Keith:
Ну читаем внимательно
A value of 304 translates as “Not Modified.” The server sometimes returns this response if a browser performs what’s known as a conditional GET request.
Теперь смотрим здесь: GET-запрос с условием (Conditional GET)
В вышеприведённом примере никаких условий нет, соответственно подобный статус не будет возвращён никогда. С другой стороны, если какие-то заголовки будут указаны, возвращённый статус может быть самым разным. О чём тут спорить?
Да, действительно, нету смысла указывать.
Я что-то сразу не подумал, что при ответе 304, Response Body не возврашается.
url := "https://autohotkey.com/download/1.1/version.txt"
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", url)
HTTP.Send()
date:= HTTP.getResponseHeader("Last-Modified")
msgbox % HTTP.Status
msgbox % HTTP.ResponseText
HTTP.Open("GET", url)
HTTP.SetRequestHeader("If-Modified-Since", date)
HTTP.Send()
msgbox % HTTP.Status
msgbox % HTTP.ResponseText
А в справке по автохотки в примере получается недочет.
Example: Make an asynchronous HTTP request.
req := ComObjCreate("Msxml2.XMLHTTP")
; Open a request with async enabled.
req.open("GET", "https://autohotkey.com/download/1.1/version.txt", true)
; Set our callback function (v1.1.17+).
req.onreadystatechange := Func("Ready")
; Send the request. Ready() will be called when it's complete.
req.send()
/*
; If you're going to wait, there's no need for onreadystatechange.
; Setting async=true and waiting like this allows the script to remain
; responsive while the download is taking place, whereas async=false
; will make the script unresponsive.
while req.readyState != 4
sleep 100
*/
#Persistent
Ready() {
global req
if (req.readyState != 4) ; Not done yet.
return
if (req.status == 200 || req.status == 304) ; OK.
MsgBox % "Latest AutoHotkey version: " req.responseText
else
MsgBox 16,, % "Status " req.status
ExitApp
}
А как быть с одинаковыми элементами?
http://prntscr.com/hl1t1w
<td class="number sorting_1">0.02530089</td>
https://bitconnect.co/user/trade?Market=BCC
Нужно в переменную извлекать только данные из первой строчки самого левого столбца как на скриншоте.
Получаете коллекцию элементов.
Выбираете нужный вам элемент.
В начале темы Xameleon объяснял, как это делать.
Добрый день!
Сразу оговорю, я полный новичок в АНК, потому для Вас возможно это вполне рядовая задача, а для меня полный тупик.
Подскажите, как средствами АНК выловить значение 1068,94 и открыть текстовый блокнот, записать, сохранить и закрыть. Естественно, значение постоянно будет меняться, нужно ловить тэгами. Пробовал все вышеуказанные способы, но msgbox постоянно выходит пустым.
<span class="currency-amount ng-binding" ng-bind="vm.amount$ | async:this">1 068,94 </span>
MrRutts Используй RegExMatch http://www.script-coding.com/AutoHotke … Match.html .
qqlexa, спасибо, действительно верное для меня направление!
Но ввиду отсутствия должных навыков, не могу правильно применить функцию:
text := UrlDownloadToVar("https://binomo.com/ru/trading")
Msgbox % RegExReplace(text, <span class="currency-amount ng-binding" ng-bind="vm.amount$ | async:this">, " </span>" )
UrlDownloadToVar(URL, UserAgent = "")
{
WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("GET", Url)
UserAgent ? WebRequest.Option(WinHttpRequestOption_UserAgentString := 0) := UserAgent
WebRequest.Send()
Text := WebRequest.ResponseText
WebRequest := ""
return Text
}
Должен принять число 1068,94:
<span class="currency-amount ng-binding" ng-bind="vm.amount$ | async:this">1 068,94 </span>
но msgbox выдает пустоту.
MrRutts, во-первых для передачи в ф-ию строки нужно обрамлять кавычками.
Во-вторых, вы уверены что на данной странице это число есть ? Я вот уверен, что нет, потому что нужно сначала залогинится на сайте.
Можете посмотреть темы по автоматизации браузера с помощью ComObjCreate("WinHttp.WinHttpRequest.5.1"). RegEx кстати не обязателен, можно извлекать значение по классу элемента.
stealzy, я даже не подумал, что для чтения данных ему необходима авторизация, т.к. сам то уже вошел, и визуально вижу сайт).
Спасибо за направление, буду мурыжить дальше!
MrRutts оформите код тегом "code":
http://forum.script-coding.com/viewtopi … 43#p123943,
http://forum.script-coding.com/viewtopi … 18#p123918.
qqlexa, оформите ссылки тегом "url".
http://forum.script-coding.com/viewtopi … 17#p123917
http://forum.script-coding.com/viewtopi … 56#p123856
http://forum.script-coding.com/viewtopi … 52#p123852
http://forum.script-coding.com/viewtopi … 51#p123851
http://forum.script-coding.com/viewtopi … 50#p123850
http://forum.script-coding.com/viewtopi … 49#p123849
http://forum.script-coding.com/viewtopi … 48#p123848
http://forum.script-coding.com/viewtopi … 46#p123846
Третий час не могу понять, почему, когда ссылки генерируются из скрипта — UrlDownloadToVar завершается ошибкой, —
#SingleInstance Force
step := 1
lnk_1 := "https://vk.com/al_wall.php?act=get_replies&al=1&count=1&from=wkview&offset="
lnk_2 := "&post=1_2285269&rev=0"
loop % 1 + 1 // step
api_lst .= lnk_1 (A_index - 1) * step lnk_2 "`n"
msgbox % api_lst
api_lst := RegExReplace(api_lst,"\R+","`n")
Loop, parse, api_lst, `n
{
api_lst_index := A_LoopField
api_lst_index := UrlDownloadToVar(api_lst_index)
All_api_lst_vars .= api_lst_index
}
MsgBox % All_api_lst_vars "`n`n`n"
return
UrlDownloadToVar(URL, UserAgent = "")
{
WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("GET", Url)
UserAgent ? WebRequest.Option(WinHttpRequestOption_UserAgentString := 0) := UserAgent
WebRequest.Send()
Text := WebRequest.ResponseText
WebRequest := ""
return Text
}
а когда те же ссылки даны в переменной в явном виде — скачивает? —
#SingleInstance Force
api_lst=
(
https://vk.com/al_wall.php?act=get_replies&al=1&count=1&from=wkview&offset=0&post=1_2285269&rev=0
https://vk.com/al_wall.php?act=get_replies&al=1&count=1&from=wkview&offset=1&post=1_2285269&rev=0
)
api_lst := RegExReplace(api_lst,"\R+","`n")
Loop, parse, api_lst, `n
{
api_lst_index := A_LoopField
api_lst_index := UrlDownloadToVar(api_lst_index)
All_api_lst_vars .= api_lst_index
}
MsgBox % All_api_lst_vars "`n`n`n"
return
UrlDownloadToVar(URL, UserAgent = "")
{
WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("GET", Url)
UserAgent ? WebRequest.Option(WinHttpRequestOption_UserAgentString := 0) := UserAgent
WebRequest.Send()
Text := WebRequest.ResponseText
WebRequest := ""
return Text
}
Неужели нельзя через UrlDownloadToVar скачать составленные в коде ссылки?
Так вставьте msgbox и посмотрите, что отправляете функции.
Отправляю рабочую ссылку:
loop % 1 + 1 // 1
api_lst .= "https://vk.com/al_wall.php?act=get_replies&al=1&count=1&from=wkview&offset=" (A_index - 1) * 1 "&post=1_2285269&rev=0" "`n"
Loop, parse, api_lst, `n
{
api_lst_index := A_LoopField
msgbox % api_lst_index
api_lst_index := UrlDownloadToVar(api_lst_index)
All_api_lst_vars .= api_lst_index
}
MsgBox % All_api_lst_vars "`n`n`n"
return
UrlDownloadToVar(URL, UserAgent = "")
{
WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("GET", Url)
UserAgent ? WebRequest.Option(WinHttpRequestOption_UserAgentString := 0) := UserAgent
WebRequest.Send()
Text := WebRequest.ResponseText
WebRequest := ""
return Text
}
Но если заменить первые две строки (в которых ссылки составляются программно), на следующий фрагмент (где эти же ссылки находятся в переменной), — всё скачается:
api_lst=
(
https://vk.com/al_wall.php?act=get_replies&al=1&count=1&from=wkview&offset=0&post=1_2285269&rev=0
https://vk.com/al_wall.php?act=get_replies&al=1&count=1&from=wkview&offset=1&post=1_2285269&rev=0
)
Замените
msgbox % api_lst_index
на
msgbox %A_Index% ссылка которая отправляется в функцию`n "%api_lst_index%"
Получается, это пустая строка создавала ошибку). Спасибо!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться