1

Тема: AHK: Поиск и сравнение ключей с серийным номером.

Добрый вечер всем читающим. Дело в том, что никак не могу сделать рабочий скрипт, прошу помощи у тех, кто не занят сильно. Суть проста, он заходит на сайт где есть несколько "ключей" написанных в столбик, нужно что бы он нашел тот, что я вписал в поле ввода и затем сравнил, есть ли он вообще на сайте? Если есть, то далее он должен проверить, совпадает ли серийный номер жесткого диска с ключом, который я ввел в поле ввода и тогда он выдаст "Успешный вход!" и сделает переменную OpenScript := true. Дам небольшой кусочек из него:

#NoEnv
CoordMode, pixel, Window

OpenScript := false

DriveGet, SerialNumber, Serial, C:

url := "https://pastebin.com/raw/yCsSHyNJ" ;   PODPISKA

httpRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
httpRequest.Open("GET", url, false)
httpRequest.Send()

responseBody := Trim(httpRequest.ResponseText)

Gui, Add, Text, x20 y10 w360 h20, Введите ваш ключ:
Gui, Add, Edit, vUserLogin x20 y30 w200 h30,
Gui, Add, Button, x20 y80 w200 h30 gLoginButton, Войти
Gui, Add, Button, x20 y115 w200 h30 gBuyButton, Купить

GuiClose(GuiHwnd) {
    MsgBox 4,, Вы уверены что хотите закрыть скрипт?
    ifMsgBox No
        return true
    ifMsgBox Yes
        ExitApp
}

Gui, Show, w250 h150, Вход

return

LoginButton:
    GuiControlGet, vUserLogin,, Edit1
    Gui, Submit

    ; Просто проверяем, есть ли введенный ключ на сайте
    if !InStr(responseBody, vUserLogin) {
        MsgBox, Ключ не найден на сайте!
		Gui, Show
        Return
    }

    ; Если ключ найден, тогда проверяем серийный номер жесткого диска
    keyInfo := RegExMatch(responseBody, "i)(\Q" vUserLogin "\E)\t(.*)", match)

    if (keyInfo && match[2] = SerialNumber) {
        OpenScript := true
        MsgBox, Успешный вход!
    } else {
        MsgBox, Ключ найден, но серийный номер не совпадает!
		Gui, Show
		Return
    }

    return

BuyButton:
    Run, https://example.com/ ; тестовая ссылка
    Gui, +LastFound
    Gui, Destroy
    ExitApp
return

Также если возможно, как только введеный ключ удалится на сайте, то с помощью итераций скрипт должен будет закрыться.

SetTimer, CheckKeyAvailability, 5000
CheckKeyAvailability:
    httpRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
    httpRequest.Open("GET", url, false)
    httpRequest.Send()

    responseBody := Trim(httpRequest.ResponseText)

    if (responseBody = "") {
        SetTimer, CloseScript, 3000
        MsgBox, 0, , У вас закончилась подписка на данный скрипт, чтобы приобрести новую
        Return
    }
return

CloseScript:
    ExitApp
return

2

Re: AHK: Поиск и сравнение ключей с серийным номером.

DmitriWhite пишет:
GuiControlGet, vUserLogin,, Edit1

Переменная, связанная с контролом не vUserLogin, а просто UserLogin, буква v — это символ, означающий, что вслед за ним будет идти переменная.

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

3

Re: AHK: Поиск и сравнение ключей с серийным номером.

teadrinker
Хорошо, я исправил, но все еще при вводе верного ключа соответствующему серийному номеру жёсткого диска, при нажатии кнопки Войти пишет "Ключ не найден на сайте или серийный номер не совпадает!"

4

Re: AHK: Поиск и сравнение ключей с серийным номером.

Приведите минимальный код, демонстрирующий проблему.

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

5

Re: AHK: Поиск и сравнение ключей с серийным номером.

teadrinker
Сократил как мог.
1. При вводе пустого значения пишется "Ключ найден, но серийный номер не совпадает!"
2. При вводе верного ключа с сайта имеющим тот же серийный номер что у меня, пишется "Ключ найден, но серийный номер не совпадает!"
В остальном скрипт работает. Стоит ли скачивать всю страницу или можно оставить как есть?


OpenScript := false

DriveGet, SerialNumber, Serial, C:

url := "https://pastebin.com/raw/yCsSHyNJ" ;   PODPISKA

httpRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
httpRequest.Open("GET", url, false)
httpRequest.Send()

responseBody := Trim(httpRequest.ResponseText)

Gui, Add, Text, x20 y10 w360 h20, Введите ваш ключ:
Gui, Add, Edit, vUserLogin x20 y30 w200 h30,
Gui, Add, Button, x20 y80 w200 h30 gLoginButton, Войти

Gui, Show, w250 h150, Вход

return

LoginButton:
    GuiControlGet, UserLogin,, Edit1
    Gui, Submit

    if !InStr(responseBody, UserLogin) {
        MsgBox, Ключ не найден на сайте!
		Gui, Show
        Return
    }

    keyInfo := RegExMatch(responseBody, "i)(\Q" UserLogin "\E)\t(.*)", match)

    if (keyInfo && match[2] = SerialNumber) {
        OpenScript := true
        MsgBox, Успешный вход!
    } else {
        MsgBox, Ключ найден, но серийный номер не совпадает!
		Gui, Show
		Return
    }

    return

6

Re: AHK: Поиск и сравнение ключей с серийным номером.

DmitriWhite пишет:

Стоит ли скачивать всю страницу или можно оставить как есть?

Не совсем понял, какую страницу имеете в виду?

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

7

Re: AHK: Поиск и сравнение ключей с серийным номером.

Потом, непонятна логика скрипта. Сначала у вас определяется серийный номер диска C, потом пользователь должен ещё что-то ввести. Что именно он должен ввести, и какая связь между серийным номером диска, пользовательским вводом, и текстом, который скачивается с сайта?

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

8

Re: AHK: Поиск и сравнение ключей с серийным номером.

teadrinker

url := "https://pastebin.com/raw/yCsSHyNJ"

это сама ссылка на сайт.
В ней находится список ключей. Ключ = серийный номер. Суть такова, пользователь вводит свой серийный номер, если этот серийный номер есть в списке на сайте, тогда следующая проверка. Скрипт сравнивает тот серийный номер, который ввел пользователь и серийный номер его жесткого диска, если все две проверки прошли успешно, переменная должна изменится на OpenScript := true. Допустим пользователь дал другу этот скрипт, но его серийного номера нету на сайте, даже если он введет серийный номер друга, тогда вторая проверка не допустит его.

9

Re: AHK: Поиск и сравнение ключей с серийным номером.

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

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

10

Re: AHK: Поиск и сравнение ключей с серийным номером.

teadrinker
Хорошо, допустим введение номера в поле ввода не обязательно, но тогда нужна уже одна проверка. Есть ли серийный номер пользователя на сайте, если да, то тогда в переменную также пишет OpenScript := true, если нет - выведет текст с ошибкой входа. Допустим все лишние кнопки убрать в Gui и оставить только текст с ожиданием входа. С итерацией я разобрался, а с этим никак не могу, как не писал бы, не выходит.

11

Re: AHK: Поиск и сравнение ключей с серийным номером.

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

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

12

Re: AHK: Поиск и сравнение ключей с серийным номером.

Если задача узнать, существует ли серийник в списке, разделённом переносами строк, то проще всего так:

serials =
(
2342124523
2342432134
5324352345
3252452345
)

serial1 := 2342432134
serial2 := 234243213

MsgBox % serials ~= "m`a)^" . serial1 . "$"
MsgBox % serials ~= "m`a)^" . serial2 . "$"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder