1

Тема: AHK: Получить текст с HTML страницы в переменную

Возможно ли такое?
Или единственный вариант, зайти через браузер и скопировать содержимое в клипбоард?
Спасибо!

2

Re: AHK: Получить текст с HTML страницы в переменную

Только текст или с картинками ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3

Re: AHK: Получить текст с HTML страницы в переменную

Только текст.

4

Re: AHK: Получить текст с HTML страницы в переменную

Как вариант вот так. Сейчас в соседней теме как раз это же и обсуждаем.
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
}
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5

Re: AHK: Получить текст с HTML страницы в переменную

Круто! Спасибо!
Даже и не думал, что такое возможно.
А что можно добавить, чтоб он читал только первое сообщение этого форума (при условии, что его нельзя показать отдельно)

6

Re: AHK: Получить текст с HTML страницы в переменную

Malcev пишет:

А что можно добавить, чтоб он читал только первое сообщение этого форума (при условии, что его нельзя показать отдельно)

Моя реакция на вопрос... O_o

+ открыть спойлер

http://trollface-fun.ru/wp-content/uploads/Dzheki-Chan-mem-150x150.jpg

Такс... По порядку.

1) Зачем это надо ?
2) В форуме множество разделов. Сообщение из какого раздела интересует ?
3) Что значит "при условии, что его нельзя показать отдельно" ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

7 (изменено: Malcev, 2014-03-21 02:33:29)

Re: AHK: Получить текст с HTML страницы в переменную

1) Чтобы на треккере следить только за изменениями в шапке темы.
2) Да хотя бы в этом топике получить мой вопрос.

Возможно ли такое?
Или единственный вариант, зайти через браузер и скопировать содержимое в клипбоард?
Спасибо!

3) Нету прямой ссылки на это мое первое сообщение, только на весь тред.
Апдейт. Извиняюсь за свою невнимательность - отдельная ссылка на сообщение есть - просто она не показывается в новом окне.
Большое спасибо!

8

Re: AHK: Получить текст с HTML страницы в переменную

По прежнему с трудом понимаю смысл вопроса. Но вот вроде то, что Вы хотели.


;Константы используемые в 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
}
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

9 (изменено: Malcev, 2014-03-21 02:52:39)

Re: AHK: Получить текст с HTML страницы в переменную

Все-таки не получается задуманное.
Я хочу получить только первое сообщение в этой теме:
Вот оно:
http://forum.script-coding.com/viewtopi … 040#p81040
Но если я вставляю эту ссылку в ваш первый скрипт, то он мне выдает полностью всю нашу с вами переписку.
А если во второй, то вообще ничего не выдает, хотя я там пробовал менять таги.

10

Re: AHK: Получить текст с HTML страницы в переменную

Не вижу в чём сложность. Замените в предыдущем скрипте код на этот блок.


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
    }
}
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: AHK: Получить текст с HTML страницы в переменную

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

12

Re: AHK: Получить текст с HTML страницы в переменную

Алгоритм прост. Открыл в браузере ( в моём случае хром ) страницу сайта. Нажал F12, чтобы вызвать панель разработчика. Кликнул по значку лупы, а потом на интересующий меня блок на странице. В окне с деревом html тэгов раскрылся тот который я искал. Из кода я выяснил, что у ячейки установлен только classname, значит придётся искать по нему, что я и сделал в скрипте. Механику парсинга и отбора тэгов я позаимствовал у HTML DOM Document. Вот вроде бы и всё.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

13

Re: AHK: Получить текст с HTML страницы в переменную

Разобрался.
Спасибо!
Кстати, у вас ошибка

    ;Находим тэги с классом
    if (oDivTag.className = "postbody online")

Этот таг появляется если только пользователь в онлайне.
Поэтому для высвечивания первого сообщения надо брать этот таг:

    ;Находим тэги с классом
    if (oDivTag.className = "post odd firstpost topicpost")

14

Re: AHK: Получить текст с HTML страницы в переменную

Malcev, действительно. Поздравляю, вот Вы уже в теме лучше меня разобрались.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

15

Re: AHK: Получить текст с HTML страницы в переменную

Копался тут с разными сайтами и понял, что в ваш код нужно добавить:

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
}

В чем может быть причина?

16 (изменено: Malcev, 2014-06-26 09:46:12)

Re: AHK: Получить текст с HTML страницы в переменную

А как получить текст с сайта если там установлен 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
}

17

Re: AHK: Получить текст с HTML страницы в переменную

Пока написал вот это, но как узнать правильный 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)
}

18

Re: AHK: Получить текст с HTML страницы в переменную

В последней редакции 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 имеется ввиду?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

19 (изменено: Malcev, 2014-07-01 19:06:49)

Re: AHK: Получить текст с HTML страницы в переменную

Так все-таки из 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?

20

Re: AHK: Получить текст с HTML страницы в переменную

Так все-таки из 44 сообщения или 45?

Точно не помню, погоняй пока из 45.

И вот не понятно откуда взять answer?

Непойму, там же написано что 90.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

21 (изменено: Malcev, 2014-07-01 22:27:18)

Re: AHK: Получить текст с HTML страницы в переменную

Там он каждый раз генерится.
В общем он как-то подсчитывается броузером в этом коде и посылается переменная 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>

22 (изменено: Malcev, 2016-09-05 15:21:17)

Re: AHK: Получить текст с HTML страницы в переменную

Решил таки эту задачку:

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 напрямую?

23 (изменено: Malcev, 2016-05-11 01:19:46)

Re: AHK: Получить текст с HTML страницы в переменную

Подниму тему.
Как выполнить джаваскрипт на странице http://forum.teamspeak.com и посчитать ответ с помощью
https://github.com/Lexikos/ActiveScript.ahk
Есть у кого-нибудь идеи?
В идеале хотелось бы получить алгоритм выполнения любых джава-скриптов на страницах, чтобы результат потом отправлять через WinHttpRequest.

24 (изменено: ypppu, 2017-01-12 17:37:22)

Re: AHK: Получить текст с HTML страницы в переменную

Xameleon пишет:

Как вариант вот так.

Здравствуйте!
В примере отсюда 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 в виде переменной? Как это правильно сделать?
Спасибо!

25

Re: AHK: Получить текст с HTML страницы в переменную

lemurr-filter, код оформляется специальным тегом, я поправил Ваше сообщение.

26

Re: AHK: Получить текст с HTML страницы в переменную

lemurr-filter, в первом примере у вас две ошибки использования переменных.

27 (изменено: lemurr-filter, 2017-01-13 18:51:17)

Re: AHK: Получить текст с HTML страницы в переменную

stealzy, здравствуйте!
А как правильно указать переменную для этого  кода, подскажите пожалуйста?

28

Re: AHK: Получить текст с HTML страницы в переменную

А зачем вам именно этот код?
Что вы именно хотите получить?

29 (изменено: lemurr-filter, 2017-01-14 03:09:08)

Re: AHK: Получить текст с HTML страницы в переменную

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, теперь всё хорошо.
Спасибо всем!

30

Re: AHK: Получить текст с HTML страницы в переменную

Зачем вы 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

31 (изменено: lemurr-filter, 2017-01-14 03:07:44)

Re: AHK: Получить текст с HTML страницы в переменную

Malcev Спасибо огромное!

32 (изменено: Странникх, 2017-04-28 00:17:02)

Re: AHK: Получить текст с HTML страницы в переменную

Дабы новой темы не создавать спрошу здесь.
Не получается по описанным способам получить из страницы текст в переменную.

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 не подходит.

33

Re: AHK: Получить текст с HTML страницы в переменную

url := "http://pwlegendary.ucoz.ru/Clients.txt"
http := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
http.Open("GET", url)
http.Send()
http.WaitForResponse()
MsgBox, % http.ResponseText
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

34

Re: AHK: Получить текст с HTML страницы в переменную

teadrinker, спасибо, если честно, то искал с обеда по интернету ответ.)

35

Re: AHK: Получить текст с HTML страницы в переменную

teadrinker,
http.WaitForResponse() - здесь лишний.

36

Re: AHK: Получить текст с HTML страницы в переменную

Да, точно, это только для асинхронного варианта.

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

37

Re: AHK: Получить текст с HTML страницы в переменную

Странникх, вы ведь темой ошиблись. Вам же не текст html страницы нужен, а просто файл.

Странникх пишет:

искал с обеда

WTF???
первая ссылка,
URLdownloadToVar.

38

Re: AHK: Получить текст с HTML страницы в переменную

Мне нужен именно текст, потому что как я писал выше

Странникх пишет:

Вариант с FTP не подходит.

Вариант с FTP я начинал еще использовать пару лет назад. Мне через скачивание не нужно, не подходит для целей просто вот и все.

teadrinker, а как вывести условие (что-то вроде if site != open), что проблема с соединением (нет подключения) или запрос на страницу не загружается?

39

Re: AHK: Получить текст с HTML страницы в переменную

Как-то так:

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
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

40

Re: AHK: Получить текст с HTML страницы в переменную

А если ссылка удалена (если не существует, ошибка 404)?

Модератор: Избыточное цитирование запрещено. Цитата предыдущего поста удалена.

41 (изменено: teadrinker, 2017-04-28 02:40:46)

Re: AHK: Получить текст с HTML страницы в переменную

В том виде, в котором сейчас, с точки зрения http-запроса это не ошибка, просто сайт отдаёт страницу с такой информацией. Так что только парсингом ответа.

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

42 (изменено: stealzy, 2017-04-28 03:31:58)

Re: AHK: Получить текст с HTML страницы в переменную

Странникх, какое ftp, где вы его увидели вообще тут? По ссылкам пройдите хоть...
Тема про получение текста из html. А вам нужно просто содержание файла по url, на что и даны ссылки.
Разницу понимаете?

В UrlDownloadToVar() ошибки помещаются в ErrorLevel.

43

Re: AHK: Получить текст с HTML страницы в переменную

А, вспомнил, возвращённый код статуса нужно проверить:

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
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

44

Re: AHK: Получить текст с HTML страницы в переменную

Я бы это

if (status != 200)  { ; HTTP_STATUS_OK

заменил на

if (status != 200) and (status != 304) { ; HTTP_STATUS_OK

304 Not Modified (не изменялось)

45

Re: AHK: Получить текст с HTML страницы в переменную

А в каком случае может прийти последнее?

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

46

Re: AHK: Получить текст с HTML страницы в переменную

Сам нашёл:

304 Not Modified — сервер возвращает такой код, если клиент запросил документ методом GET, использовал заголовок If-Modified-Since или If-None-Match и документ не изменился с указанного момента.

По-моему, не тот случай.

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

47 (изменено: Malcev, 2017-04-28 16:53:32)

Re: AHK: Получить текст с HTML страницы в переменную

Согласен. Пока случай не тот.
Но, по-моему, лучше заранее предусмотреть и такой вариант.
Хотя, вроде как, возможны всякие случаи:

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

https://serverfault.com/questions/11797 … ead-of-200

48

Re: AHK: Получить текст с HTML страницы в переменную

Malcev пишет:

Хотя, вроде как, возможны всякие случаи

Так зачем гадать, ответ зависит от запроса.

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

49

Re: AHK: Получить текст с HTML страницы в переменную

Ну по ссылке, котоую я привел, как я понял, человек не отправляя ни If-Modified-Since ни If-None-Match получал в ответ 304.

50

Re: AHK: Получить текст с HTML страницы в переменную

Ну, просто объект выдал поведение, которое не описано в той справке, которую человек читал. Все такие случаи предусмотреть невозможно, почему ты именно этот берёшь?

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

51

Re: AHK: Получить текст с HTML страницы в переменную

Я предлагал вставить на проверку 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!
    }
  }
}

https://doc.lagout.org/programmation/Aj … 20Ajax.pdf

52 (изменено: teadrinker, 2017-04-28 20:04:32)

Re: AHK: Получить текст с HTML страницы в переменную

Malcev пишет:

если в будущем захочется посылать соответствующие запросы

Так ещё раз, ответ зависит от запроса. Статусы могут быть самые разные, и они не всегда означают какую-то ошибку.

Malcev пишет:

Как и автор книги 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)
В вышеприведённом примере никаких условий нет, соответственно подобный статус не будет возвращён никогда. С другой стороны, если какие-то заголовки будут указаны, возвращённый статус может быть самым разным. О чём тут спорить?

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

53

Re: AHK: Получить текст с HTML страницы в переменную

Да, действительно, нету смысла указывать.
Я что-то сразу не подумал, что при ответе 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
}

54 (изменено: Странникх, 2017-12-09 05:51:38)

Re: AHK: Получить текст с HTML страницы в переменную

А как быть с одинаковыми элементами?
http://prntscr.com/hl1t1w

<td class="number sorting_1">0.02530089</td>

https://bitconnect.co/user/trade?Market=BCC
Нужно в переменную извлекать только данные из первой строчки самого левого столбца как на скриншоте.

55

Re: AHK: Получить текст с HTML страницы в переменную

Получаете коллекцию элементов.
Выбираете нужный вам элемент.
В начале темы Xameleon объяснял, как это делать.

56

Re: AHK: Получить текст с HTML страницы в переменную

Добрый день!
Сразу оговорю, я полный новичок в АНК, потому для Вас возможно это вполне рядовая задача, а для меня полный тупик.
Подскажите, как средствами АНК выловить значение 1068,94 и открыть текстовый блокнот, записать, сохранить и закрыть. Естественно, значение постоянно будет меняться, нужно ловить тэгами. Пробовал все вышеуказанные способы, но msgbox постоянно выходит пустым.
<span class="currency-amount ng-binding" ng-bind="vm.amount$ | async:this">1 068,94 </span>

57 (изменено: qqlexa, 2018-03-07 01:50:14)

Re: AHK: Получить текст с HTML страницы в переменную

MrRutts Используй RegExMatch http://www.script-coding.com/AutoHotke … Match.html .

58

Re: AHK: Получить текст с 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 выдает пустоту.

59

Re: AHK: Получить текст с HTML страницы в переменную

MrRutts, во-первых для передачи в ф-ию строки нужно обрамлять кавычками.
Во-вторых, вы уверены что на данной странице это число есть ? Я вот уверен, что нет, потому что нужно сначала залогинится на сайте.
Можете посмотреть темы по автоматизации браузера с помощью ComObjCreate("WinHttp.WinHttpRequest.5.1"). RegEx кстати не обязателен, можно извлекать значение по классу элемента.

60

Re: AHK: Получить текст с HTML страницы в переменную

stealzy, я даже не подумал, что для чтения данных ему необходима авторизация, т.к. сам то уже вошел, и визуально вижу сайт).
Спасибо за направление, буду мурыжить дальше!

61

Re: AHK: Получить текст с HTML страницы в переменную

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

62 (изменено: DD, 2018-05-21 17:26:21)

Re: AHK: Получить текст с HTML страницы в переменную

Третий час не могу понять, почему, когда ссылки генерируются из скрипта — 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
}

63

Re: AHK: Получить текст с HTML страницы в переменную

Неужели нельзя через UrlDownloadToVar скачать составленные в коде ссылки?

64

Re: AHK: Получить текст с HTML страницы в переменную

Так вставьте msgbox и посмотрите, что отправляете функции.

65 (изменено: DD, 2018-05-22 01:23:30)

Re: AHK: Получить текст с HTML страницы в переменную

Отправляю рабочую ссылку:

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
)

66

Re: AHK: Получить текст с HTML страницы в переменную

Замените

msgbox % api_lst_index

на

msgbox %A_Index% ссылка которая отправляется в функцию`n "%api_lst_index%"

67 (изменено: DD, 2018-05-22 01:39:37)

Re: AHK: Получить текст с HTML страницы в переменную

Получается, это пустая строка создавала ошибку). Спасибо!