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 страницы в переменную

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