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
OS: Win7x64, AutoHotkey_L v1.1.30.01 (Unicode 32-bit).

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
OS: Win7x64, AutoHotkey_L v1.1.30.01 (Unicode 32-bit).

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, код оформляется специальным тегом, я поправил Ваше сообщение.