101

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Если здесь не ответят, то можно обратиться к Blackholyman напрямую:
https://jszapp.com
Он, как я понимаю, в теме.

102

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Чтобы самому стать в теме, нужны комментарии на родном языке.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

103

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Ну это к вопросу про выполняемые скрипты, у меня то вопрос простой, после авторизации через WinHTTPRequest, загрузив с сервера страницу мы получаем её содержимое, но загрузив повторно и оставшись авторизованными получаем снова и снова её старое содержимое, хотя на сервере всё уже давно поменялось.
Даже если снова получить ComObjCreate("WinHTTP.WinHTTPRequest.5.1") и пройти авторизацию, результата нет.
И только перезапустив скрипт, и соответственно заново авторизовавшись, можно получить новое содержимое.

А можешь дать этот сайт и код? Интересно посмотреть.

104

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Доступ к почтовому ящику на mail.ru, код позже.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

105 (изменено: Malcev, 2015-07-20 12:31:04)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

У меня с помощью этой функции на mail.ru контент апдейтится.

cookies := Object()
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
HttpObj.Open("POST", "https://auth.mail.ru/cgi-bin/auth?from=splash")
HttpObj.Send("Domain=mail.ru&Login=MYLOGIN&Password=MYPASSWORD&new_auth_form=1&saveauth=1")
SaveCookies(HttpObj, cookies)
HttpObj.Open("GET", "https://e.mail.ru/messages/inbox/")
SetCookies(HttpObj, cookies)
loop
{
   HttpObj.Send()
   msgbox % clipboard := HttpObj.ResponseText
}


SaveCookies(ByRef WebRequest, ByRef cookies) {
    While (p := RegexMatch(WebRequest.GetAllResponseHeaders, "U)(^|\R)Set-Cookie:\s(.+)=(.+);.+domain=(.+)(\R|;|$)", match, p?p+1:1))
        cookies[match4, match2] := match3
}
 
SetCookies(ByRef WebRequest, ByRef cookies) {
    url := WebRequest.Option(1) ;the url that we are going to send our request to
    If (p := InStr(url,"://"))
        url := SubStr(url, p+3)
    If (p := InStr(url,"/"))
        url := SubStr(url, 1, p-1)
    If (p := InStr(url,"@"))
        url := SubStr(url, p+1)
    If (p := InStr(url,":"))
        url := SubStr(url, 1, p-1)
    StringSplit, a, url, .
    b := a0-1
    domain := a%b%
    ext := a%a0%
    url := "." . domain . "." . ext
 
    cookieString := ""
    For id, value in cookies[url]
        cookieString .= id . "=" . value . "; "
 
    If (cookieString) ;if there are any cookies
        WebRequest.SetRequestHeader("Cookie", cookieString)
}

http://ahkscript.org/boards/viewtopic.p … amp;t=2511

А без кукисов через ж... можно так еще:

loop
{
   HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
   HttpObj.Open("POST", "https://auth.mail.ru/cgi-bin/auth?from=splash&r=" A_INDEX)
   HttpObj.Send("Domain=mail.ru&Login=MYLOGIN&Password=MYPASSWORD&new_auth_form=1&saveauth=1")
   HttpObj.Open("GET", "https://e.mail.ru/messages/inbox/")
   HttpObj.Send()
   msgbox % clipboard := HttpObj.ResponseText
}

106

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Malcev
Большое тебе спасибо! С меня причитается.

А ты пробовал функции SaveCookies и SetCookies на других сайтах? Их надо как то подстраивать под каждый случай?

И:

HttpObj.Open("POST", "https://auth.mail.ru/cgi-bin/auth?from=splash")
HttpObj.Send("Domain=mail.ru&Login=MYLOGIN&Password=MYPASSWORD&new_auth_form=1&saveauth=1")

Эти параметры как нашёл, снифером выудил?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

107

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Да, пробовал еще на inbox.lv - вроде работает.
Параметры выудил через IE - панель разработчика в Post запросах.

108

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

А не пробовал некое управление страницей? Ну например сделать письмо прочитанным, или удалить. Есть идеи?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

109

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Всё, понял. Например запрос на удаление одного сообщения:

ajax_call=1&x-email=vap.vapvap.1996%40bk.ru&email=vap.vapvap.1996%40bk.ru&remove=1&folder=500002&id=%5B%2214373987020000000537%22%5D&move=1&ajaxmode=1&noredir=1&ids=%5B%2214373987020000000537%22%5D&api=1&token=4d02cb63511dd6f9ea8374a5852e84c2%3A42794a586a5c7604190056070b50530301010202515d01530c53550907050558050f040b5c000553031654475c6e4206

Начало понятно, а вот в конце:

&ids=%5B%2214373987020000000537%22%5D&api=1&token=4d02cb63511dd6f9ea8374a5852e84c2%3A42794a586a5c7604190056070b50530301010202515d01530c53550907050558050f040b5c000553031654475c6e4206

откуда взять ids и токен...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

110 (изменено: Malcev, 2015-07-20 21:20:00)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

id и ids  - это, как я понимаю, ID сообщения:

id: "1111111111111111111111",
prev: "",
next: "111111111111111111",
subject: u("test2"),
date: "1437378381",

Токен это тут:

patron.updateToken = function (token) {
var token_parts = token.split(':');
window['mailru_api_token'] = token;
window['mailru_api_token_parts'] = {
form_sign: token_parts[0],
form_token: token_parts[1]
};
};

patron.updateToken("111111111111111111111111111111111111111111111111111111111111111");

Вот так у меня удаляется, самое верхнее сообщение:

Email := "xxx"
Login := "xxx"
Password := "xxx"
cookies := Object()
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
HttpObj.Open("POST", "https://auth.mail.ru/cgi-bin/auth?from=splash")
HttpObj.Send("Domain=mail.ru&Login=" Login "&Password=" Password "&new_auth_form=1&saveauth=1")
SaveCookies(HttpObj, cookies)
HttpObj.Open("GET", "https://e.mail.ru/messages/inbox/")
SetCookies(HttpObj, cookies)
HttpObj.Send()
RegexMatch(HttpObj.ResponseText, "s)patron\.updateToken\(""(.+?)"".+?id: ""([^\R]+?)"",\s+prev: """"", id)
movefile := "ajax_call=1&x-email=" Email "&email=" Email "&remove=1&folder=500002&id=[""" id2 """]&move=1&ajaxmode=1&noredir=1&ids=[""" id2 """]&api=1&token=" id1
HttpObj.Open("POST", "https://e.mail.ru//api/v1/messages/move")
SetCookies(HttpObj, cookies)
HttpObj.Send(movefile)
return
    

SaveCookies(ByRef WebRequest, ByRef cookies) {
    While (p := RegexMatch(WebRequest.GetAllResponseHeaders, "U)(^|\R)Set-Cookie:\s(.+)=(.+);.+domain=(.+)(\R|;|$)", match, p?p+1:1))
        cookies[match4, match2] := match3
}
 
SetCookies(ByRef WebRequest, ByRef cookies) {
    url := WebRequest.Option(1) ;the url that we are going to send our request to
    If (p := InStr(url,"://"))
        url := SubStr(url, p+3)
    If (p := InStr(url,"/"))
        url := SubStr(url, 1, p-1)
    If (p := InStr(url,"@"))
        url := SubStr(url, p+1)
    If (p := InStr(url,":"))
        url := SubStr(url, 1, p-1)
    StringSplit, a, url, .
    b := a0-1
    domain := a%b%
    ext := a%a0%
    url := "." . domain . "." . ext
 
    cookieString := ""
    For id, value in cookies[url]
        cookieString .= id . "=" . value . "; "
 
    If (cookieString) ;if there are any cookies
        WebRequest.SetRequestHeader("Cookie", cookieString)
}

111

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Токен это тут:

Regex конечно хорошо...
Смотри, ведь в коде есть функции (скрипты). Как думаешь можно их как то использовать?
Например запустить updateToken и получить ответ.
Или например все сообщения запакованы в JSON массив, и он явно привязан к возврату функцией window.arMailRuMessages (примерно 1170 строка).
Вообще в среде WinHttp возможно получить доступ к скриптам и как то с ними взаимодействовать?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

112

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Lexicos писал, что в среде WinHttp запускать скрипты нельзя:

WinHttpRequest is not a web browser.  It just submits a HTTP request and gives you the response.
A web browser would submit a HTTP request and then render the response as a document, usually running any scripts it encounters and making further requests for any other resources used by the document. If you need to run scripts, then you need to use a web browser. You can use Internet Explorer for this purpose with the InternetExplorer.Application COM object.

http://www.autohotkey.com/board/topic/1 … avascript/
Xameleon в своих скриптах для этого использует ComObjCreate("htmlfile").

113

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Xameleon в своих скриптах для этого использует ComObjCreate("htmlfile").

Я так понял, что исключительно для разбора HTML, ну и воспользоватся чем нибудь встроенным в сам "htmlfile", типа "encodeURIComponent" опять же для разбора.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

114 (изменено: serzh82saratov, 2015-07-21 03:28:20)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Вроде как какие то JavaScript запросы мелькают при обмене, JSON массивы, может как то можно вызвать функцию неким запросом на сервер, и в ответе получить её результат...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

115

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Но отправить как письмо с mail.ru через WinHttp я так и не понял.
Хотя вроде там не стоит лимит на отправку сообщений через SMTP, поэтому можно использовать CDO.Message.

116

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Вот наткнулся на задачку.
Нужно получить номер телефона не используя IE.
Казалось бы просто - но джаваскрипт его как-то хитро изменяет.
http://www.doska.ru/msg/work/courses-ed … ailoo.html

WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("GET", "http://www.doska.ru/msg/work/courses-education/seminari-un-trenini/ailoo.html", false)
WebRequest.Send()
Body := WebRequest.ResponseBody
pArr := ComObjValue(Body)
cBytes := NumGet(pArr+0, A_PtrSize = 8? 24:16, "uint")
pText := NumGet(pArr+0, A_PtrSize = 8? 16:12, "ptr")
var := StrGet(pText, cBytes, "utf-8")
RegExMatch(var, "id=""ph_td_2"">(.+?)</span>", phone)
msgbox % phone1

117

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

На stackoverflow мне помогли,  но не до конца.
При неоднократном обращении к странице номер телефона прячется за ****.
После чего дается капча.
При ее распозновании отправляется новый запрос к джаваскрипту с добавлением Math.random() + "&reload=1 в конец.
Но в этом коде такое отправить не получается.
В броузере при выскакивании капчи можно просто перезагрузить броузер и тогда она исчезнет.
Может можно как-то хитро перезагрузить WinHttpRequest?
Или каким-нибудь другим способом отправить нужный запрос?

mainHtml := HtmlGet("http://www.doska.ru/msg/work/courses-education/seminari-un-trenini/ailoo.html")
RegExMatch(mainHtml, "<td width=100% class=""ads_contacts"" nowrap id=""ptd2_[^""]*"">([^<]+)<span class=""ads_contacts_bold"" id=""ph_td[^""]*"">([^<]+)</span>", phone)
RegExMatch(mainHtml, "var ss_w='показать';document.write\( '<scr'\+'ipt id=""contacts_js"" src=""([^\?]+)\?t='\+new Date\(\)\+'""></scr'\+'ipt>' \);", contactsJsPartUrl)
contactsJsUrl := "http://www.doska.ru" contactsJsPartUrl1 "?t=" GetJsDate()
;contactsJsUrl := "http://www.doska.ru" contactsJsPartUrl1 "?t=" GetJsDate() "0." GetRandomString(16,"0123456789") "&reload=1"
;http://www.doska.ru/js/2015-08-17/1941/VnQNHE9hRRBVfQgZVWJJQVZ6RUYLLkNaXn0A.js?t=Thu Sep 03 2015 00:16:12 GMT+0200 (W. Europe Standard Time)

secretVariablesJs := HtmlGet(contactsJsUrl)
/*
var PHONE_CNT=-1;var PHONE_CNT2=-1;var PHONE_CNT3=-1;var EMAIL_CNT=-1;var SHOW_CNT=29;var PH_c="";var PH_1=0;var PH_2=0;var PH_3=0;
pcc_id=0;PH_1=gpzd("JTgwJUEyJTdDX3BsJTdDWnUlOEYlN0UlNUJ4JThFciU5M3hpJTdGZg==","79325724");
PH_2 = gpzd( "JThFJTlEeCU1RXlvaSU4RXpobSU3RXUlN0MlOEZUJThEJThEeF8lN0MlOTF6ZHhlJTYwZw==","15372732");
PH_3 = gpzd( "JTdFJUEyelpwbSU3RSU1Q3MlOEQlN0VZcyU4RXMlOTV6ZyU3RGY=","45575927");
*/
msgbox % contactsJsUrl
_js_decode = 
(
function _js_decode(b) {
    return _ph_dec(b, "Hb9c0mOswgV4p{zDlf", 2)
}
)

_ph_dec =
(
function _ph_dec(g, r, k) {
    g = unescape(_b64_dec(g));
    var n = r.length;
    var d = g.length;
    var c = "";
    var q, p;
    for (var f = 0; f < d; f++) {
        q = g.substring(f, f + 1);
        p = r.substring(f `% n, f `% n + 1);
        if (k == 1) {
            q = q.charCodeAt(0) - p.charCodeAt(0)
        } else {
            if (k == 2) {
                q = q.charCodeAt(0) - p.charCodeAt(0) + 14
            } else {
                q = q.charCodeAt(0) ^ p.charCodeAt(0)
            }
        }
        c = c + String.fromCharCode(q)
    }
    return c
}
)

_b64_dec = 
 (
 function _b64_dec(n) {
    var f = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var d, c, b, s, r, q, p, u, k = 0,
        g = "";
    do {
        s = f.indexOf(n.charAt(k++));
        r = f.indexOf(n.charAt(k++));
        q = f.indexOf(n.charAt(k++));
        p = f.indexOf(n.charAt(k++));
        u = s << 18 | r << 12 | q << 6 | p;
        d = u >> 16 & 255;
        c = u >> 8 & 255;
        b = u & 255;
        if (q == 64) {
            g += String.fromCharCode(d)
        } else {
            if (p == 64) {
                g += String.fromCharCode(d, c)
            } else {
                g += String.fromCharCode(d, c, b)
            }
        }
    } while (k < n.length);
    return g
}
)

gpzd =
(
function gpzd(data, key) {
    key = key * 6 - 47289 + 517;
    ret = _ph_dec(data, new String(key), 2);
    return ret
}
)

jsCode := secretVariablesJs "`r`n"
jsCode .= _js_decode "`r`n"
jsCode .= gpzd "`r`n"
jsCode .= _ph_dec "`r`n"
jsCode .= _b64_dec "`r`n"

sc := ComObjCreate("ScriptControl")
sc.Language := "JScript"
sc.ExecuteStatement(jsCode)
phone2Decrypted := sc.Eval("_js_decode(PH_2)")
if InStr(phone2Decrypted,"*")
    phone2Decrypted := sc.Eval("_js_decode(PH_1)")
if InStr(phone2Decrypted,"*")
    phone2Decrypted := sc.Eval("_js_decode(PH_3)")
if InStr(phone2Decrypted,"*")
     msgbox failed to get the phone number
if !InStr(phone2Decrypted,"*")
    MsgBox, % phone1 " " phone2Decrypted


HtmlGet(url) {
    Static WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
    WebRequest.Open("GET", url)
    WebRequest.Send()
    Body := WebRequest.ResponseBody
    pArr := ComObjValue(Body)
    cBytes := NumGet(pArr+0, A_PtrSize = 8? 24:16, "uint")
    pText := NumGet(pArr+0, A_PtrSize = 8? 16:12, "ptr")
    Return StrGet(pText, cBytes, "utf-8")
}

GetJsDate() {
    sc := ComObjCreate("ScriptControl")
    sc.Language := "JScript"
    ;Return sc.Eval("''+new Date()+''")
    Return sc.Eval("encodeURI(''+new Date()+'')")
}

GetRandomString(length,chars:="") {
    If (chars = "")
        chars := "0123456789abcdefghijklmnopqrstuvwxyz"
    charsCount := StrLen(chars)
    Loop %length% {
        Random, num, 1, % StrLen(chars)
        string .= SubStr(chars,num,1)
    }
    Return string
}

118 (изменено: Malcev, 2015-09-06 17:16:27)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Может можно как-то хитро перезагрузить WinHttpRequest?

Можно. Как я понял, чтобы серевер подумал, что мы рестартнулись нужно повторно запустить какой-нибудь из джаваскриптов.
Например в моем вопросе нужно 2 раза запросить secretVariablesJs := HtmlGet(contactsJsUrl) и звездочки изчезнут.

Вообще в среде WinHttp возможно получить доступ к скриптам и как то с ними взаимодействовать?

Можно. Но без знаний джаваскрипт далеко не уедешь.
Вот работающий код:

url := "http://www.doska.ru/msg/electronics/audio-video-dvd-sat/dvd-and-video-technics/dvd-disks-mpeg-cassettes/gohcg.html"
mainHtml := HtmlGet(url)
RegExMatch(mainHtml, "var ss_w='показать';document.write\( '<scr'\+'ipt id=""contacts_js"" src=""([^\?]+)\?t='\+new Date\(\)\+'""></scr'\+'ipt>' \);", contactsJsPartUrl)
contactsJsUrl := "http://www.doska.ru" contactsJsPartUrl1 "?t=" GetJsDate()
secretVariablesJs := HtmlGet(contactsJsUrl)
secretVariablesJs := HtmlGet(contactsJsUrl)

_js_decode = 
(
function _js_decode(b) {
    return _ph_dec(b, "Hb9c0mOswgV4p{zDlf", 2)
}
)

_ph_dec =
(
function _ph_dec(g, r, k) {
    g = unescape(_b64_dec(g));
    var n = r.length;
    var d = g.length;
    var c = "";
    var q, p;
    for (var f = 0; f < d; f++) {
        q = g.substring(f, f + 1);
        p = r.substring(f `% n, f `% n + 1);
        if (k == 1) {
            q = q.charCodeAt(0) - p.charCodeAt(0)
        } else {
            if (k == 2) {
                q = q.charCodeAt(0) - p.charCodeAt(0) + 14
            } else {
                q = q.charCodeAt(0) ^ p.charCodeAt(0)
            }
        }
        c = c + String.fromCharCode(q)
    }
    return c
}
)

_b64_dec = 
 (
 function _b64_dec(n) {
    var f = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var d, c, b, s, r, q, p, u, k = 0,
        g = "";
    do {
        s = f.indexOf(n.charAt(k++));
        r = f.indexOf(n.charAt(k++));
        q = f.indexOf(n.charAt(k++));
        p = f.indexOf(n.charAt(k++));
        u = s << 18 | r << 12 | q << 6 | p;
        d = u >> 16 & 255;
        c = u >> 8 & 255;
        b = u & 255;
        if (q == 64) {
            g += String.fromCharCode(d)
        } else {
            if (p == 64) {
                g += String.fromCharCode(d, c)
            } else {
                g += String.fromCharCode(d, c, b)
            }
        }
    } while (k < n.length);
    return g
}
)

gpzd =
(
function gpzd(data, key) {
    key = key * 6 - 47289 + 517;
    ret = _ph_dec(data, new String(key), 2);
    return ret
}
)

jsCode := secretVariablesJs "`r`n"
jsCode .= _js_decode "`r`n"
jsCode .= gpzd "`r`n"
jsCode .= _ph_dec "`r`n"
jsCode .= _b64_dec "`r`n"

sc := ComObjCreate("ScriptControl")
sc.Language := "JScript"
sc.ExecuteStatement(jsCode)
If Instr(mainHtml, "PH_1")
{
    RegExMatch(mainHtml, "ptd2_1"">(.+?)<span", phone)
    phone2Decrypted := phone1 sc.Eval("_js_decode(PH_1)") "`n"
}
If Instr(mainHtml, "PH_2")
{
    RegExMatch(mainHtml, "ptd2_2"">(.+?)<span", phone)
    phone2Decrypted .= phone1 sc.Eval("_js_decode(PH_2)") "`n"
}
If Instr(mainHtml, "PH_3")
{
    RegExMatch(mainHtml, "ptd2_3"">(.+?)<span", phone)
    phone2Decrypted .= phone1 sc.Eval("_js_decode(PH_3)")
}
MsgBox, % phone2Decrypted


HtmlGet(url) {
    Static WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
    WebRequest.Open("GET", url)
    WebRequest.Send()
    Body := WebRequest.ResponseBody
    pArr := ComObjValue(Body)
    cBytes := NumGet(pArr+0, A_PtrSize = 8? 24:16, "uint")
    pText := NumGet(pArr+0, A_PtrSize = 8? 16:12, "ptr")
    Return StrGet(pText, cBytes, "utf-8")
}

GetJsDate() {
    sc := ComObjCreate("ScriptControl")
    sc.Language := "JScript"
    ;Return sc.Eval("''+new Date()+''")
    Return sc.Eval("encodeURI(''+new Date()+'')")
}

GetRandomString(length,chars:="") {
    If (chars = "")
        chars := "0123456789abcdefghijklmnopqrstuvwxyz"
    charsCount := StrLen(chars)
    Loop %length% {
        Random, num, 1, % StrLen(chars)
        string .= SubStr(chars,num,1)
    }
    Return string
}

119

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Можно.

Очень всё сложно, снова с RegEx, ничего не понял. Что то мне подсказывает что всё должно быть проще, и какие то примеры в памяти мелькают. Вроде так можно получить объект функции

ofunc := oScript["arMailRuMessages"]

как-то её вызвать и получить возвращаемое значение, наверняка тоже можно.

Login := ""
Password := ""
cookies := Object()
oDoc := ComObjCreate("htmlfile")
oDoc.open() 
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
HttpObj.Open("POST", "https://auth.mail.ru/cgi-bin/auth?from=splash")
HttpObj.Send("Domain=mail.ru&Login=" Login "&Password=" Password "&new_auth_form=1&saveauth=1")
SaveCookies(HttpObj, cookies)
HttpObj.Open("GET", "https://e.mail.ru/messages/inbox/")
SetCookies(HttpObj, cookies)
loop
{
    HttpObj.Send()
    oDoc.write(HttpObj.ResponseText)
    oScript := oDoc.Script
    ofunc := oScript["arMailRuMessages"]
    arr := ofunc........
    for k, v in arr
        MsgBox % k "`n" v "`n" k[1] "`n" v[1] 
    msgbox % clipboard := HttpObj.ResponseText
}


SaveCookies(ByRef WebRequest, ByRef cookies) {
    While (p := RegexMatch(WebRequest.GetAllResponseHeaders, "U)(^|\R)Set-Cookie:\s(.+)=(.+);.+domain=(.+)(\R|;|$)", match, p?p+1:1))
        cookies[match4, match2] := match3
}
 
SetCookies(ByRef WebRequest, ByRef cookies) {
    url := WebRequest.Option(1) ;the url that we are going to send our request to
    If (p := InStr(url,"://"))
        url := SubStr(url, p+3)
    If (p := InStr(url,"/"))
        url := SubStr(url, 1, p-1)
    If (p := InStr(url,"@"))
        url := SubStr(url, p+1)
    If (p := InStr(url,":"))
        url := SubStr(url, 1, p-1)
    StringSplit, a, url, .
    b := a0-1
    domain := a%b%
    ext := a%a0%
    url := "." . domain . "." . ext
 
    cookieString := ""
    For id, value in cookies[url]
        cookieString .= id . "=" . value . "; "
 
    If (cookieString) ;if there are any cookies
        WebRequest.SetRequestHeader("Cookie", cookieString)
}

Повторю свою догадку, что браузер ведь получает только HTML код, а значит всё что в нём находится вполне достаточно, чтобы аналогично выполнить скрипты и в среде htmlfile.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

120

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Броузер натыкается на скрипт и выполняет его. Сомневаюсь, что HtmlFile может сам сделать также.
Вот пример выполнения скрипта:
http://stackoverflow.com/questions/1361 … -control-a
У меня например постоянно выскакивают ошибки:

strHtml := HtmlGet("http://www.doska.ru/msg/work/courses-education/seminari-un-trenini/ailoo.html")
new WebBrowser(strHTML)

Class WebBrowser
{
    __New(strHTML) { 
        static WB
        Gui, New, Resize 
        Gui, Add, ActiveX, vWB w780 h580 , Shell.Explorer  
        Gui, show, w800 h600

        WB.Navigate("about:blank")
        Loop
           Sleep 10
        Until (WB.readyState=4 && WB.document.readyState="complete" && !WB.busy)    

        WB.Document.Write(strHtml)
        ; WB.Document.Close()


        return this

        GuiClose:
        ExitApp
    }
}

HtmlGet(url) {
    Static WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
    WebRequest.Open("GET", url)
    WebRequest.SetRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0")
    WebRequest.Send()
    Body := WebRequest.ResponseBody
    pArr := ComObjValue(Body)
    cBytes := NumGet(pArr+0, A_PtrSize = 8? 24:16, "uint")
    pText := NumGet(pArr+0, A_PtrSize = 8? 16:12, "ptr")
    Return StrGet(pText, cBytes, "utf-8")
} 

121

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Ну ошибку можно просто убрать:


strHTML =
(
<!DOCTYPE html>
<html>
    <head>
        <script> function displayDate() { document.getElementById("demo").innerHTML=Date(); }</script>
    </head>
    <body>
        <p id="demo" onclick="displayDate()">This is a paragraph. Click here.</p>
    </body>
</html> 
)

new WebBrowser(strHTML)

Class WebBrowser
{
    __New(strHTML) { 
        static WB
        Gui, New, Resize 
        Gui, Add, ActiveX, vWB w780 h580 , Shell.Explorer  
        Gui, show, w800 h600

        WB.Navigate("about:blank")
        Loop
           Sleep 10
        Until (WB.readyState=4 && WB.document.readyState="complete" && !WB.busy)    

        WB.Document.Write(strHtml)
        ; WB.Document.Close()
 
        ; WB.document.parentWindow.document.InvokeScript("displayDate") ; does not work
        return this 
    }
}

Скрипт в среде Shell.Explorer работает.

Сомневаюсь, что HtmlFile может сам сделать также.

Почему?
Точно также этот скрипт работает и в HtmlFile:

Gui HTML: -DPIScale
Gui, HTML: margin, 20, 20
Gui, HTML: Add, ActiveX, w333 h222 vIE, HTMLFile
Gui, HTML: show

strHTML =
(
<!DOCTYPE html>
<html>
    <head>
        <script> function displayDate() { document.getElementById("demo").innerHTML=Date(); }</script>
    </head>
    <body>
        <p id="demo" onclick="displayDate()">This is a paragraph. Click here.</p>
    </body>
</html> 
)
IE.Write(strHTML)
IE.Close() 
return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

122

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Под

Сомневаюсь, что HtmlFile может сам сделать также.

я имел в виду автовыполнение скриптов, без каких-либо действий.
А про ошибку я имел в виду вот этот код:

strHtml := HtmlGet("http://www.doska.ru/msg/work/courses-education/seminari-un-trenini/ailoo.html")
new WebBrowser(strHTML)

Class WebBrowser
{
    __New(strHTML) { 
        static WB
        Gui, New, Resize 
        Gui, Add, ActiveX, vWB w780 h580 , Shell.Explorer  
        Gui, show, w800 h600

        WB.Navigate("about:blank")
        Loop
           Sleep 10
        Until (WB.readyState=4 && WB.document.readyState="complete" && !WB.busy)    

        WB.Document.Write(strHtml)
        ; WB.Document.Close()


        return this

        GuiClose:
        ExitApp
    }
}

HtmlGet(url) {
    Static WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
    WebRequest.Open("GET", url)
    WebRequest.SetRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0")
    WebRequest.Send()
    Body := WebRequest.ResponseBody
    pArr := ComObjValue(Body)
    cBytes := NumGet(pArr+0, A_PtrSize = 8? 24:16, "uint")
    pText := NumGet(pArr+0, A_PtrSize = 8? 16:12, "ptr")
    Return StrGet(pText, cBytes, "utf-8")
} 

123

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

я имел в виду автовыполнение скриптов, без каких-либо действий.

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

А про ошибку я имел в виду вот этот код:

Думаю она связана с глобальными адресами, в то время как используется Document.Write. Наверное как то их можно все преобразовать в локальные, может быть что из этой оперы - buildURL, может нет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

124 (изменено: Malcev, 2015-09-07 01:08:01)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Вот из переписки с Forivin, который написал мне код:

- I am interesting in ComObjCreate("htmlfile").
I know that I can execute javascript there. But is it possible to make auto execution of java scripts?

- Executing JavaScript form the website without modifications in autohotkey has a high chance of failing because of multiple reasons. The main reasons being that the DOM (html stuff) is not there and lots of functionality is missing in microsofts so called "JScript".
Doing so form a Shell.Explorer would obviously work though, because it is running a whole Inernet Explorer in the background.
But as I said you would have to do additional work. As far as I remember the Shell.Explorer can be quite bitchy/buggy when it comes to injecting/messing with the JavaScript.
The htmlFile object on the other hand is not capable of executing javascript as far as I know. (I haven't really looked at the docs though, so I don'T really know.)

- So the best choice is execute jscript with ComObjCreate("ScriptControl")?

- Well, yes, but when you need to access HTML elements on the website you need to actually load the website, so then you'd have to use Shell.Explorer.
If that's not a requirement, then ScriptControl is the only good way of doing it that I'm aware of.
Shell.Explorer is really hacky and slow and buggy in general especially on older windows versions..

- But I can get HTML elements on the website through regexmatch without using Shell.Explorer

- Right, but not thorugh microsofts JScript

- Can You give me please example of this situation, because I do not understand?

- The JavaScript from the website relies on a fully functioning DOM and other tings that usually only come with browser js interpreters.

- Do You mean that these elements only can be seen after js execution?

- For example, let's say the website gives you this function:

function LoadMainScript() {
    var urlOfThisWebsite = window.location.href;
    var scriptName = document.getElementById("scriptNameContainer").innerHTML;
    LoadMyJs(urlOfThisWebsite + "/" + scriptName);
}

in JScript you don't have window and document, because these are objects created by the browser.

125 (изменено: serzh82saratov, 2015-09-07 01:38:18)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Мало что понял...

я имел в виду автовыполнение скриптов, без каких-либо действий.

Может быть натыкаясь на скрипт, автовыполнять неможет, но речь про то чтобы хотя бы прото вызвать функцию, и желательно получить возвращаемое ею значение. Например вызвать функцию во 2 коде 121 поста можно самому:

1:: IE.parentWindow.execScript("displayDate()")
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

126 (изменено: Malcev, 2015-09-07 01:55:24)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Ну он написал, что Shell.Explorer  с джаваскриптом глючит, а ScriptControl и htmlfile (он не уверен) работает только с JScript.
Что вызвать можно не все и привел код, который работает только интерпретатором js в браузере.
И что проще всего вызывать нужные функции через ScriptControl.
Что он и сделал мне в получении телефона с сайта.
Но например эта функция была зашифрована:

gpzd =
(
function gpzd(data, key) {
    key = key * 6 - 47289 + 517;
    ret = _ph_dec(data, new String(key), 2);
    return ret
}
)

И чтобы ее получить надо было в консоли броузера выполнить gpzd.toString().
То есть без знаний джаваскрипт тут никуда...
По Shell.Explorer он посоветовал обратиться к Blackholyman.
Что тот сможет рассказать возможно больше чем он.

127

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Xameleon пишет:

многобанофф, именно так. )
Чуток допилил.

Xameleon здравствуйте!
В примере отсюда http://forum.script-coding.com/viewtopi … 032#p81032
не удаётся вести 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 в виде переменной? Как это правильно сделать?
Спасибо!

128

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

IN_URL = "http://ya.ru"
MsgBox  % IN_URL

129

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

red2881, здравствуйте!
Никаких затруднений с выводом через Msgbox нету.
Проблема в том, что не работает указанный (исходный) скрипт при попытке передать URL пераметром.
Т.е. через Msgbox я вижу что содержимое параметра верно, но указанный код при попытке воспользоваться этим параметром - не работает.

130

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Уважаемые форумчане, Xameleon, здравствуйте!

На одном компьютере код "vk_auth.ahk" из поста Xameleonhttp://forum.script-coding.com/viewtopi … 032#p81032 запускается и отрабатывает нормально. На другом компьютере AutoHotkey говорит:

"Error at line 2.
Line Text: global WinHttpRequestOption_EnableRedirects := 6
Error: This line does not contain a recognized action.
The program will exit".

С чем это может быть связано, как это можно починить?

131 (изменено: sergeiplugatyr, 2017-01-13 19:42:27)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

lemurr-filter, Обнови версию AutoHotkey.

Как сказал мой дед - Я твой дед

132 (изменено: Malcev, 2017-01-13 22:06:43)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

serzh82saratov пишет:

Вообще в среде WinHttp возможно получить доступ к скриптам и как то с ними взаимодействовать?

Вариант, через htmlfile.

var = 
(
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
</head>

<body>

  <script>
    alert( 'JavaScript!' );
  </script>

</body>

</html>
)
oHTML := ComObjCreate("htmlfile")
; oHTML.designMode := "on"   ;   скрипты не будут выполняться  
oHTML.write(var)

Вот эта строка из 56 поста мне непонятна:

;Инициализируем JavaScript интерпретатор
oScript.execScript("eval()")

http://forum.script-coding.com/viewtopi … 480#p83480

133

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

sergeiplugatyr
Спасибо огромное!  Теперь всё ок

134

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Привет! Располагает ли кто-то актуальным кодом авторизации во ВКонтакте? Все публиковавшиеся старые варианты перестали работать, а воспроизвести из браузера по новой стало сложновато - видимо они поменяли метод, по которому даже пароль в явном виде не находится. Пробовал логиниться в мобильной версии (https://m.vk.com/) - там то же самое. Вот был прежний рабочий код:

email := "ТЕЛЕФОН"
password := "ПАРОЛЬ"

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", "https://vk.com/", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
RegexMatch(HTTP.ResponseText, "s)name=""ip_h"" value=""(.+?)"".+?name=""lg_h"" value=""(.+?)""", match)
PostData := "act=login&role=al_frame&expire=&recaptcha=&captcha_sid=&captcha_key=&_origin=https`%3A`%2F`%2Fvk.com&ip_h=" match1 "&lg_domain_h=" match2 "&email=" email "&pass=" password

HTTP.Open("POST", "https://login.vk.com/?act=login", true)
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send(PostData)
HTTP.WaitForResponse()
RTxt := HTTP.ResponseText

135

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Логиньтесь через их апи.

136

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

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

137

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Не знаю, надо читать какая там авторизация.
У меня примеров нет.

138

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

У меня есть очень древний код, авторства, по-моему, Xameleon'а, так он вроде до сих пор работает:

email := "my_email"
password := "my_password"

;Константы используемые в 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

writeLn("Loading the main page of the site")

; Загружаем основную страницу входа
oHtmlDoc := documentFromURL("http://vk.com")

writeLn("`nGet the first form")

; Получаем первую по счёту форму
oForm := oHtmlDoc.forms[0]

; Заполняем в форме поле email
oForm["email"].value := email
; Заполняем в форме поле пароль
oForm["pass"].value := password

; Эмулируем отправку формы
submitForm(oForm)

; Проверяем - есть ли в тексте сообщение о том, что авторизация прошла успешно
if !InStr(oHttpRequest.ResponseText,"LoginDone") {
    MsgBox % "Авторизация не удалась! Проверьте логин и пароль"
    ExitApp
}

; Загружаем ленту новостей контакта
oHtmlDoc := documentFromURL("http://vk.com/")
MsgBox, % Clipboard := oHtmlDoc.body.innerText

; Функция загрузки и построения документа с указанного URL
documentFromURL(ByRef sURL) {
    writeLn("documentFromURL")
    writeLn("   URL: " . sURL)
    
    ; Отправляем GET запрос на сервер
    oHttpRequest.open("GET", sURL, false)
    oHttpRequest.send()
    
    ; Строим из полученных данных документ и возвращаем из функции
    return documentFromHTML(oHttpRequest.responseText, sURL)
}

; Функция создания документа из HTML кода
documentFromHTML(ByRef sHTMLCode, ByRef sBaseURL) {
    writeLn("documentFromHTML")
    writeLn("   Base URL: " . sBaseURL)
    ; Создаём объект для парсинга HTML кода
    oDoc := ComObjCreate("htmlfile")
    oDoc.open()
    ; Вставляем базовый тэг чтобы у относительных ссылок была верная адрессация от базового адреса
    oDoc.write("<base href=""" . sBaseURL . """>")
    oDoc.close()
    ;oDoc.write(sHTMLCode)
    oDoc.body.innerHTML := sHTMLCode
    return oDoc
}

; Функция эмулятор отправки формы
submitForm(ByRef oForm){
    writeLn("submitForm")
    ; Получаем ссылку на объект Window от документа формы
    oScript := oForm.document.Script
    ; Сборка строки запроса формы
    loop , % oForm.elements.length 
    {
        elem := oForm.elements[A_Index-1]
        if (elem.name != "")
            ; Собираем значения полей формы в строку и кодируем их имена и значения
            sBody .= oScript.encodeURIComponent(elem.name) . "=" . oScript.encodeURIComponent(elem.value) . "&"
    }
    sBody := SubStr(sBody, 1, -1)

    ; Получаем текущий адрес на котором мы находимся (для заполнения referer и настройки свойства "action" формы )
    sCurrentURL := oHttpRequest.Option(1)
    ; Для формы BASE hRef не срабатывает, поэтому искусственно вычисляем полный путь запроса формы
    oForm.action := buildURL(sCurrentURL,oForm.action)

    writeLn("   Referer: " . sCurrentURL)
    writeLn("   form action: " . oForm.action)
    writeLn("   Body: " . sBody)

    oHttpRequest.open("POST", oForm.action, false)
    ; Указываем метод кодирования данных
    oHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    ; Выставляем Referer, дабы сайты не ругались, что мы себя плохо ведём.
    if sCurrentURL != "" 
        oHttpRequest.setRequestHeader("Referer", sCurrentURL)
    ; Отправляем данные формы
    oHttpRequest.send(sBody)
}

; Функция для построения полного пути из относительного для URL
buildURL(ByRef sBaseURL, ByRef sURL) {
    ; Создаём HTML документ с единственной ссылкой
    oDoc := documentFromHTML("<a href=""" . sURL . """>", sBaseURL)
    ; Берём href от этой ссылки.
    return oDoc.all.tags("a")[0].href
}

; Функция для вывода строки в консоль
writeLn(text){
    write(text . "`r")
}

; Функция для вывода текста в консоль
write(text){
    FileAppend, %text%, *
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

139

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

У меня не работает.
Токены получаются по гет запросу этой ссылки:

https://id.vk.com/auth?app_id=7913379&redirect_uri=https%3A%2F%2Fvk.com%2Ffeed

Остальное копать неинтересно.

140

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Не работает, в смысле появляется сообщение "Авторизация не удалась! Проверьте логин и пароль" ?

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

141

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

А ты его запускал?
У меня вот что:
https://storage.googleapis.com/openscreenshot/h%2FH%2F_/Rwwwbb_Hh.png

142

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

У меня после нескольких запусков тоже такое возникло, после ещё нескольких сработало. Пока не разбирался.

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

143 (изменено: teadrinker, 2023-04-17 18:57:35)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

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

email := "my_email"
password := "my_password"

;Константы используемые в 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

writeLn("Loading the main page of the site")

; Загружаем основную страницу входа
oHtmlDoc := documentFromURL("http://vk.com")

writeLn("`nGet the first form")

Loop 5 {
   oForm := oHtmlDoc.forms[A_Index - 1]

   ; Заполняем в форме поле email
   try oForm["email"].value := email
   catch {
      if (A_Index = 5) {
         MsgBox, email field not found
         ExitApp
      }
      continue
   }
   break
}
; Заполняем в форме поле пароль
oForm["pass"].value := password

; Эмулируем отправку формы
submitForm(oForm)

; Проверяем - есть ли в тексте сообщение о том, что авторизация прошла успешно
if !InStr(oHttpRequest.ResponseText,"LoginDone") {
    MsgBox % "Авторизация не удалась! Проверьте логин и пароль"
    ExitApp
}

; Загружаем ленту новостей контакта
oHtmlDoc := documentFromURL("http://vk.com/")
MsgBox, % Clipboard := oHtmlDoc.body.innerText

; Функция загрузки и построения документа с указанного URL
documentFromURL(ByRef sURL) {
    writeLn("documentFromURL")
    writeLn("   URL: " . sURL)
    
    ; Отправляем GET запрос на сервер
    oHttpRequest.open("GET", sURL, false)
    oHttpRequest.send()
    
    ; Строим из полученных данных документ и возвращаем из функции
    return documentFromHTML(oHttpRequest.responseText, sURL)
}

; Функция создания документа из HTML кода
documentFromHTML(ByRef sHTMLCode, ByRef sBaseURL) {
    writeLn("documentFromHTML")
    writeLn("   Base URL: " . sBaseURL)
    ; Создаём объект для парсинга HTML кода
    oDoc := ComObjCreate("htmlfile")
    oDoc.open()
    ; Вставляем базовый тэг чтобы у относительных ссылок была верная адрессация от базового адреса
    oDoc.write("<base href=""" . sBaseURL . """>")
    oDoc.close()
    ;oDoc.write(sHTMLCode)
    oDoc.body.innerHTML := sHTMLCode
    return oDoc
}

; Функция эмулятор отправки формы
submitForm(ByRef oForm){
    writeLn("submitForm")
    ; Получаем ссылку на объект Window от документа формы
    oScript := oForm.document.Script
    ; Сборка строки запроса формы
    loop , % oForm.elements.length 
    {
        elem := oForm.elements[A_Index-1]
        if (elem.name != "")
            ; Собираем значения полей формы в строку и кодируем их имена и значения
            sBody .= oScript.encodeURIComponent(elem.name) . "=" . oScript.encodeURIComponent(elem.value) . "&"
    }
    sBody := SubStr(sBody, 1, -1)

    ; Получаем текущий адрес на котором мы находимся (для заполнения referer и настройки свойства "action" формы )
    sCurrentURL := oHttpRequest.Option(1)
    ; Для формы BASE hRef не срабатывает, поэтому искусственно вычисляем полный путь запроса формы
    oForm.action := buildURL(sCurrentURL,oForm.action)

    writeLn("   Referer: " . sCurrentURL)
    writeLn("   form action: " . oForm.action)
    writeLn("   Body: " . sBody)

    oHttpRequest.open("POST", oForm.action, false)
    ; Указываем метод кодирования данных
    oHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    ; Выставляем Referer, дабы сайты не ругались, что мы себя плохо ведём.
    if sCurrentURL != "" 
        oHttpRequest.setRequestHeader("Referer", sCurrentURL)
    ; Отправляем данные формы
    oHttpRequest.send(sBody)
}

; Функция для построения полного пути из относительного для URL
buildURL(ByRef sBaseURL, ByRef sURL) {
    ; Создаём HTML документ с единственной ссылкой
    oDoc := documentFromHTML("<a href=""" . sURL . """>", sBaseURL)
    ; Берём href от этой ссылки.
    return oDoc.all.tags("a")[0].href
}

; Функция для вывода строки в консоль
writeLn(text){
    write(text . "`r")
}

; Функция для вывода текста в консоль
write(text){
    FileAppend, %text%, *
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

144 (изменено: john_dease, 2023-04-18 00:56:11)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Спасибо! Когда я использовал старый код, то при выполнении ниже относительно него, следующий отрывок в итоге содержал мои данные логина:

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", "https://vk.com/", true)
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
RTxt := HTTP.ResponseText

MsgBox, % Clipboard := HTTP.ResponseText

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

145

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Скорее всего проблема в том, что должен быть тот же самый WinHttp объект, с которого авторизовывались.

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

146

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

И так не сработало:

oHttpRequest.Open("GET", "https://vk.com/", true)
oHttpRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
oHttpRequest.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36")
oHttpRequest.SetRequestHeader("Pragma", "no-cache")
oHttpRequest.SetRequestHeader("Cache-Control", "no-cache, no-store")
oHttpRequest.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
oHttpRequest.Send()
oHttpRequest.WaitForResponse()
RTxt := oHttpRequest.ResponseText

MsgBox, % Clipboard := oHttpRequest.ResponseText

147

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

В основном серверы определяют тебя по юзер-агент.

148

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Оказалось, что тут вместо нуля единица была:

oHttpRequest.Open("GET", "https://vk.com/", 0)

Спасибо!

149

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

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

150

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

С апи как я понял, нижеследующий код не будет подхватывать логин, а по этому варианту наверно главное не логиниться слишком часто в минуту и т.п.

151

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Дело ваше.

152

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

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

153

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

А кроме того, это потребует токены и тп - что не удобно для распространяемой версий скрипта, которой будут пользоваться разные люди.

154

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Будет весело, если вашим пользователям придется восстанавливать свои аккаунты из-за подозрительной активности.

155 (изменено: john_dease, 2023-04-18 04:54:45)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

А этот код каким-то подозрительным методом логиниться? С прежним у меня ни разу капчу не запросили, хотя я иногда в минуту по нескольку раз заходил.

156

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Думаю, если бы метод был подозрительным, авторизоваться бы просто не удалось, так что не думаю, что с этим вариантом могут быть проблемы. А вот капчу, теоретически, могут прислать. Но у меня пока такого не случалось.

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

157

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Без понятия.
У меня через пару заходов с левого айпи попросил капчу.
Если есть апи, а в нем присутствуют нужные запросы, то используйте апи.
Недавно, например, сервис гугла забанил чистый айпишник после взлома чуть более 15000 их дебильной капчи.

158 (изменено: EV, 2023-04-18 15:11:22)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

curl.exe. Win 10 v1803+ часть системы.
Сохранение cookie на примере rutracker:

User_Agent = Mozilla/5.0 (Windows NT 6.1; Win64; x64)
cookiePath := A_ScriptDir . "\cookie_rutracker.txt"
If !FileExist(cookiePath)
RunWait %curl% -s -c "%A_ScriptDir%\cookie_rutracker.txt" -d "redirect=index.php&login_username=%LoginTracker%&login_password=%PasswordTracker%&&login=%C2%F5%EE%E4" "https://rutracker.org/forum/login.php",, Hide

Отправить:

RunWait %curl% "%LoadTorrent%" -A "%User_Agent%" -b "%A_ScriptDir%\cookie_rutracker.txt" -o "%A_ScriptDir%\%Trackertitle1%[rutracker].torrent",, Hide

159

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Вообще непонятно к чему вы привели этот код.
Кстати, в коде от Xameleon не отправляется User-Agent - что для некоторых серверов может определиться как бот.

160

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Да, я бы добавил User-Agent и отправку куков.

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

161

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Куки должны автоматом посылаться.
https://learn.microsoft.com/en-us/windo … dfrom=MSDN

162 (изменено: EV, 2023-04-18 17:00:00)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Malcev
Сохранить и отправить, в одну строку. Вместо

WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("POST", url)
WebRequest.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
WebRequest.Send(loginBody)

163

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Что отправить, что сохранить, при чём тут рутрекер?

164

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

AHK: Авторизация на сайтах с использованием WinHttpRequest?

165

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Тут вопрос обсуждается - логин к vk.com.
Ваш основной язык русский?

166

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

AHK: Авторизация на сайтах с использованием WinHttpRequest
тут вопрос обсуждается - логин к vk.com. обсуждайте

167 (изменено: Malcev, 2023-04-18 17:45:41)

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Так мы и обсуждаем, а вы только создаёте путанницу, так-как ваш пример в одну строчку не cможет залогиниться к vk.com.

168

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Malcev пишет:

Куки должны автоматом посылаться.

Да, но это, как я понимаю, в пределах использования одного объекта. Можно дополнительно сохранять их для отправки в новой сессии, тогда меньше логиниться придётся.

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

169

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Кстати, код из 134 поста не работает потому что:

RegexMatch(HTTP.ResponseText, "s)name=""ip_h"" value=""(.+?)"".+?name=""lg_h"" value=""(.+?)""", match)
PostData := "act=login&role=al_frame&expire=&recaptcha=&captcha_sid=&captcha_key=&_origin=https`%3A`%2F`%2Fvk.com&ip_h=" match1 "&lg_domain_h=" match2 "&email=" email "&pass=" password

170

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

То есть, с lg_h во втором случае должно работать? У меня не работает.

171

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Проверьте, что вам возвращает регулярка и всё поймёте.

172

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Возвращает буквенно-числовой код, но все равно не логинится. Пробовал прописывать в обоих случаях lg_h и lg_domain_h, так как не понял какой из них точно правильный. Указывал имейл или номер телефона и то же самое на втором аккаунте.

173

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

У меня всё работает.

174

Re: AHK: Авторизация на сайтах с использованием WinHttpRequest

Но надо еще referer отправлять.
Больше всего меня удивляет для чего они оставили эту возможность заходить.
Может быть для каких-нибудь внутренних дел...