101

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

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

102

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

103

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

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

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

104

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). 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
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

107

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

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

108

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). 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
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). 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
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). 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
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

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

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). 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
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). 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
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). 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
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). 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
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). 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
Спасибо огромное!  Теперь всё ок