1 (изменено: jbn238, 2022-04-29 20:55:02)

Тема: AHK: получение данных с сайта

Хочу написать программу чтоб с сайта https://ru.dotabuff.com/heroes/luna/counters получались данные, допустим мне надо чтоб эти https://prnt.sc/tqdm7tMpmcyc цифры копировались, понятие не имею как это сделать, это вообще возможно? Подскажите пожалуйста.

2

Re: AHK: получение данных с сайта

Возможно. Посылаете HTTP запрос на сайт (если не знаете, что это такое, тогда можно использовать команду UrlDownloadToFile), в полученном тексте ищете нужную информацию, извлекаете её с помощью RegEx.

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

3 (изменено: jbn238, 2022-04-29 22:53:54)

Re: AHK: получение данных с сайта

teadrinker

Спасибо, разобрался с UrlDownloadToFile, загрузил страницу, сделал чтоб она шла в переменную, а вот с RegExMatch возникли не большие проблемки.
Написал такой код:

F1::
FileRead, string, C:\Users\qwerty\Desktop\dota.txt
RegExMatch(string, "href=""/heroes/disruptor"">Disruptor</a></td><td data-value=(.*)<div class", out)
msgbox, %out1%
return

F12::
reload
return

оно находит нужную строчку, но не останавливается, и происходит вот такое https://prnt.sc/E9c0Z6mZ8XJ7 ,то есть оно захватывает весь оставшийся текст который идёт после нужным цифр.

вот открывок из dota.txt

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

<a class="link-type-hero" href="/heroes/disruptor">Disruptor</a></td><td data-value="-0.5972">-0.60%<div class="bar bar-default"><div class="segment segment-disadvantage"

4

Re: AHK: получение данных с сайта

Попробуйте знак вопроса после звёздочки.

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

5 (изменено: jbn238, 2022-04-30 00:49:01)

Re: AHK: получение данных с сайта

teadrinker
Ничего не выводиться в таком случае, просто пустой msgbox.
Не знаю как быть, уже в недоумении от этой ситуации.
https://prnt.sc/GVn-tcPOZh97

6

Re: AHK: получение данных с сайта

Попробуйте так:

url := "https://ru.dotabuff.com/heroes/luna/counters"

html := WebRequest(url,,,, error := "")
if error
   throw error
if !RegExMatch(html, "(data-value="")Disruptor"".*?\1\K-?\d+\.\d+", m)
   MsgBox, not found
else
   MsgBox, % Round(m, 2)

WebRequest(url, method := "GET", HeadersArray := "", body := "", ByRef error := "") {
   Whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
   Whr.Open(method, url, true)
   for name, value in HeadersArray
      Whr.SetRequestHeader(name, value)
   Whr.Send(body)
   Whr.WaitForResponse()
   status := Whr.status
   if (status != 200)
      error := "HttpRequest error, status: " . status
   Arr := Whr.responseBody
   pData := NumGet(ComObjValue(arr) + 8 + A_PtrSize)
   length := Arr.MaxIndex() + 1
   Return StrGet(pData, length, "UTF-8")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: получение данных с сайта

teadrinker
Так работает, спасибо большое, завтра буду разбираться в написанном, а так же дублировать код для остальных 120-ти героев. Ещё раз приношу свои благодарности!

8

Re: AHK: получение данных с сайта

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

+ открыть спойлер
WebRequest(url, method := "GET", HeadersArray := "", body := "", ByRef error := "") {
   Whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
   Whr.Open(method, url, true)
   for name, value in HeadersArray
      Whr.SetRequestHeader(name, value)
   Whr.Send(body)
   Whr.WaitForResponse()
   status := Whr.status
   if (status != 200)
      error := "HttpRequest error, status: " . status
   Arr := Whr.responseBody
   pData := NumGet(ComObjValue(arr) + 8 + A_PtrSize)
   length := Arr.MaxIndex() + 1
   Return StrGet(pData, length, "UTF-8")
}

9

Re: AHK: получение данных с сайта

jbn238 пишет:

у вас там кстати видимо ошибка

Нет, ошибки нет, такое поведение вызывает команда throw, я использовал её для упрощения. Этот участок можно переписать так:

if error {
   MsgBox, % error
   Return
}

Нижняя часть кода — это пользовательская функция, внутри которой я создаю COM-объект WinHttp.WinHttpRequest.5.1, который применяю для отправки http-запроса на сайт, и в ответ получаю html-код. То же самое делает браузер, когда мы переходим по ссылке.

jbn238 пишет:

почему без них не сможет работать скрипт?

Может с помощью UrlDownloadToFile. Разница в том, что в моём примере полученный html-код не записывается на диск в файл, а все манипуляции с данными происходят в оперативной памяти. Этот способ более производительный.
На начальном этапе эта информация может показаться трудной для воспиятия (хотя на самом деле не всё так сложно, как может показаться), ничего страшного, сперва можно просто пользоваться без полного понимания, а со временем, если будет желание, постепенно во всём разобраться.

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

10

Re: AHK: получение данных с сайта

А меня больше интересуют строки:

   pData := NumGet(ComObjValue(arr) + 8 + A_PtrSize)
   length := Arr.MaxIndex() + 1
   Return StrGet(pData, length, "UTF-8")

Почему так, а не responseText?

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

11

Re: AHK: получение данных с сайта

teadrinker
Хорошо, поверхностно понял, спасибо большое что помогли и объяснили!

12

Re: AHK: получение данных с сайта

Phoenixxx_Czar пишет:

Почему так, а не responseText

У responseText могут быть проблемы с кодировкой, может вернуть кракозябры вместо русского текста.

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

13

Re: AHK: получение данных с сайта

Это сработает даже в ANSI версии?

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

14

Re: AHK: получение данных с сайта

Должно, но Юникод-символы не будут отображаться.

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

15 (изменено: jbn238, 2022-05-02 01:17:44)

Re: AHK: получение данных с сайта

teadrinker

Вновь здравствуйте, возникла проблема такого рода... что на этом герое https://ru.dotabuff.com/heroes/alchemist/counters , герой Puck есть в двух местах, сверху https://prnt.sc/frHaTKbHmZyo , а так же снизу страницы https://prnt.sc/buSv1Vohenlh , и программа находит верхнее значение, а оно без минуса как должно быть, этот момент сильно портит задумку программы, так как значение не верное выходит, можете пожалуйста подсказать как это исправить ?

Часть html кода верхней части страницы, откуда берётся значение без минуса.

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

</a></div></td><td data-value="Puck">Puck</td><td data-value="3.0195">3.02%<div class="bar bar-default"><div class="segment segment-advantage"

Часть html кода нижней части страницы, значение которое не берётся.

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

</a></div></td><td class="cell-xlarge"><a class="link-type-hero" href="/heroes/puck">Puck</a></td><td data-value="-3.0195">-3.02%<div class="bar bar-default"><div class="segment segment-disadvantage"

16

Re: AHK: получение данных с сайта

А как программа узнает, какое именно значение нужно брать?

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

17

Re: AHK: получение данных с сайта

teadrinker
Я ж по этому и пишу, потому что сам не знаю, хотел поменять эту строчку, но не выходит, решил у вас спросить

if !RegExMatch(html, "(</a></td><td data-value="")Puck"".*?\1\K-?\d+\.\d+", count)

18

Re: AHK: получение данных с сайта

Если нужно то, что с минусом, тогда так:

RegExMatch(html, "href=""/heroes/puck"">Puck</a>.+?data-value=""\K-\d+\.\d+", m)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK: получение данных с сайта

teadrinker
Теперь не работают значения с плюсом, допустим на том же https://ru.dotabuff.com/heroes/alchemist/counters , герой Lich, показывает значение -0,0212, хотя должен 0,49 https://prnt.sc/RgtVzAcY1bTN , а значение -0,0212, принадлежит герою Mirana https://prnt.sc/Wb0lnTOy5bIT .

20

Re: AHK: получение данных с сайта

Так я не зря спросил, как скрипт должен узнать, какое именно значение брать: с плюсом, с минусом, первое попавшееся, или какое? Нужно как-то чётко сформулировать задачу.

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

21

Re: AHK: получение данных с сайта

teadrinker
Значение должно брать которое написано справа от имени персонажа, в верху страницы, топ-5 который там пишется не должен учитываться, если справа от имени персонажа значение с плюсом, значит оно с плюсом и должно быть, а если с минусом, то минус должен оставаться.

22

Re: AHK: получение данных с сайта

Так должно сработать:

RegExMatch(html, "(data-value="")Puck(?!.*<header>)"".*?\1\K-?\d+\.\d+", m)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: получение данных с сайта

teadrinker
Так действительно работает, спасибо