1 (изменено: sergeiplugatyr, 2014-03-17 20:32:36)

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

Всем доброго дня, походу никто не в силах помочь мне с "InternetExplorer" и я решил написать авторизацию на сайте через WinHTTP.
Не получается заполнить поля логин/пароль на сайте vk.com:

URL := "http://vk.com/"
Data2 := "pass= tyt password"
Data1 := "email=tyt mail"
WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WebRequest.Open("POST", URL, false)
WebRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
WebRequest.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.10)")
Data = %Data1%&%Data2%
WebRequest.Send(Data)
MsgBox, % WebRequest.StatusText
MsgBox, % WebRequest.getAllResponseHeaders()
FileAppend, % WebRequest.responseText, File.txt

А если поставить вместо POST запроса GET, то выдает такую ошибку "Request Entity Too Large"
Жду вашей помощи.

Windows 10 x64

2

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

Позвольте поинтересоваться - какая конечная цель после авторизации ? Объясню почему спрашиваю - я на VBS ( с помощью коллеги JSMan-а ) собрал авторизацию для API контакта. Дабы сделать сайт скачки музыки из VK. Но авторизация в API и на сайт контакта немного отличается. Поэтому интересуюсь конечной задачей. Да и на IE авторизацию вообще элементарно делать. Только ослик ещё и все картинки и скрипты за собой потянет. Так что не уверен, что это Вам нужно.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3

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

Да и на IE авторизацию вообще элементарно делать

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

Windows 10 x64

4

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

А зачем нужно компилировать старой версией?

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

5

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

serzh82saratov пишет:

А зачем нужно компилировать старой версией?

Просто это принципиально для меня, а вообще для защиты кода.

Windows 10 x64

6

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

mpress ведь тоже защищает код.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

7

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

serzh82saratov пишет:

mpress ведь тоже защищает код.

Mpress распаковать очень легко, а старый компилятор чем мне нравится что после упаковки скрипта файл показывает что упакован Microsoft Visual C++.

Windows 10 x64

8

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

sergeiplugatyr, так всё таки Вам нужно решение через WinHttpRequest или Internet Explorer ? Или без разницы ? И хотелось бы узнать адрес конечного сайта. Авторизация на разные сайты требует разных технологических решений.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

9

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

Я так понимаю, что IE требует comobjcreate, а её нет в старом анк.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

10

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

Xameleon
Кстати, не могли бы Вы привести ссылку на решение с помощью VBS.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

11

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

serzh82saratov пишет:

Я так понимаю, что IE требует comobjcreate, а её нет в старом анк.

В этом то и дело, посмотрите мою тему "Получение страницы через InternetExplorer" и всё поймёте .

Windows 10 x64

12

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

serzh82saratov пишет:

Xameleon
Кстати, не могли бы Вы привести ссылку на решение с помощью VBS.

Ещё не выкладывал. Собственно надобности пока не было. Код собран в ASP.

sergeiplugatyr, посмотрел тему. Решил на основании той страницы и наваять код.
Не понял зачем там querySelector, ведь все объекты страницы и так доступны.


Option Explicit

Dim oIE
Dim oForm
Set oIE = CreateObject("InternetExplorer.Application")

oIE.Visible = True

oIE.Navigate "http://notepad.cc/login/neeluzbo28"

'Ждём окончания загрузки
SyncNavigate()

'Получаем первую по счёту форму в документе (можно и по ID дёргать если он есть)
Set oForm = oIE.document.forms(0)

'Заполняем поле пароля
oForm("pad[password]").value = "123"

'Сабмитим форму
oForm.submit

'Ждём окончания загрузки
SyncNavigate()

MsgBox "Авторизация завершена"

Sub SyncNavigate()
    Do While oIE.Busy
        WScript.Sleep 100
    Loop
End Sub
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

13 (изменено: sergeiplugatyr, 2014-03-18 17:32:17)

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

Xameleon пишет:

sergeiplugatyr, так всё таки Вам нужно решение через WinHttpRequest или Internet Explorer ? Или без разницы ? И хотелось бы узнать адрес конечного сайта. Авторизация на разные сайты требует разных технологических решений.

Желательно через Internet Explorer, но писать код надо под библиотеку com.ahk чтобы его можно было компилировать старой версией компилятора. Конечный сайт - Ucoz.ru, есть некоторые наработки:

#Include COM.ahk
com := COM_CreateObject("InternetExplorer.Application")
Com_Invoke(com, "Visible", "True")
Com_Invoke(com, "Navigate", "http://tyt site.ucoz.ru/admin/") 
While, COM_Invoke(com, "ReadyState" ) <> 4
    continue
COM_Invoke(com, "document.all[password].value", "tyt pass")
Com_Invoke(com, "document.all[53].click") ; тут не кликает, порядковый номер элемента определен правильно.
While, COM_Invoke(com, "ReadyState" ) <> 4
    continue
COM_Release(com)
COM_Term()

А про WinHttpRequest я подумал потому что уже потерял надежду что мне кто нибудь сможет помочь.

Windows 10 x64

14

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

Старая версия компилятора позволяет извлекать код скрипта даже если при компиляции задан пароль. Задача не так тривиальна как "скачать unpacker", но решается легко.
Ерундой маешься, нужна защита - используй exepackerы, основная масса юзеров не осилит распаковать mpress.

15 (изменено: alexii, 2014-03-19 01:09:55)

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

Защита, основанная на незнании, порочна по определению.

16

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

sergeiplugatyr

1) Авторизация на Юкоз получилась с минимумом изменений. Код представил ниже.

2) Полностью согласен с bWRmeA. Ковыряться со старым AHK только из-за особенностей компиляции скрипта, когда уже вышли новые версии, простите - бредово.

Полным полно утилит ASPack / ASProtect и т.п.

Я бы вообще на VBS-е собрал и не парился. VBS / JS тоже компилится в EXE. Но я бы так поступил только из-за того что мне VBS привычен. Если Вам AHK привычнее, то можно и на нём скомпилить, но уже в актуальной версии. В которой зачастую внесены исправления старых ошибок. А "защищать" теми же утилитами. Но кроме этого возникает другой вопрос - Что же такое секретное вы хотите запрятать в EXE, чтобы никому это не досталось ? Защитить пароль авторизации ? Это отпадает - любой сниффер покажет, что отправляет EXE модуль. Если вы собираетесь делать приложение для массового использования, то я бы вообще побрезговал непонятными утилитами неизвестного автора в пользу скрипта с открытым кодом. Вообще идею открытого кода уважаю в корне. Не в обиду.

P.S Если Вам в аккаунт нужно файлы какие-то заливать, то проще по FTP протоколу, сайт это позволяет, как я понимаю.


Option Explicit

Dim oIE
Dim oForm
Set oIE = CreateObject("InternetExplorer.Application")

oIE.Visible = True

oIE.Navigate "http://ucoz-tester.ucoz.ru/admin/"

SyncNavigate()

Set oForm = oIE.document.forms(0)

oForm("password").value = "pAsSwOrD"

oForm.submit()

SyncNavigate()

MsgBox "Авторизация завершена"

Sub SyncNavigate()
    Do While oIE.Busy
        WScript.Sleep 100
    Loop
End Sub
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

17

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

а старый компилятор чем мне нравится что после упаковки скрипта файл показывает что упакован Microsoft Visual C++.

alexii Вы про это?

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

18

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

Если Вам в аккаунт нужно файлы какие-то заливать, то проще по FTP протоколу, сайт это позволяет, как я понимаю.

Вот кстати, тоже интересно на фоне полного не знания FTP. Например, как залить/скачать файл с mail.ru ящика, наиболее просто?

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

19

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

Вообщем, не хочу конечно раздувать из мухи слона, поэтому только один вопрос:

Com_Invoke(com, "document.all[53].click") ; тут не кликает, порядковый номер элемента определен правильно.

Xameleon, вы извините меня но мне легче на AHK писать, для меня VBS не совсем понятен .

Windows 10 x64

20

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

serzh82saratov пишет:

Если Вам в аккаунт нужно файлы какие-то заливать, то проще по FTP протоколу, сайт это позволяет, как я понимаю.

Вот кстати, тоже интересно на фоне полного не знания FTP. Например, как залить/скачать файл с mail.ru ящика, наиболее просто?

serzh82saratov, хм. Возможно это будет новостью, но для mail.ru и подобных почтовых серверов самый удобный способ это работа по SMTP и MAPI протоколам.


sergeiplugatyr пишет:

Вообщем, не хочу конечно раздувать из мухи слона, поэтому только один вопрос:

Com_Invoke(com, "document.all[53].click") ; тут не кликает, порядковый номер элемента определен правильно.

Xameleon, вы извините меня но мне легче на AHK писать, для меня VBS не совсем понятен .

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

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

21

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

Изначально была идея написать авторизацию на сайте через библиотеку com.ahk и вот столкнулся с такой проблемой как клик по кнопке. Еще есть вопрос: как сделать авторизацию на какой либо сайт(можно Ucoz) через WinHttpRequest(это чисто для познания, не обязательно ).

Windows 10 x64

22

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

serzh82saratov, хм. Возможно это будет новостью, но для mail.ru и подобных почтовых серверов самый удобный способ это работа по SMTP и MAPI протоколам.

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

23

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

sergeiplugatyr пишет:

Еще есть вопрос: как сделать авторизацию на какой либо сайт(можно Ucoz) через WinHttpRequest(это чисто для познания, не обязательно ).

На AHK ломает писать. Так что вот Вам пример на JS.


// Создаём объект для запросов по HTTP протоколу
var oHttpRequest = new ActiveXObject("WinHttp.WinHttpRequest.5.1");

// Загружаем основную страницу входа
var oDoc = documentFromURL("http://ucoz-tester.ucoz.ru/admin/")

// Получаем первую по счёту форму
var oForm = oDoc.forms(0)

// Заполняем поле формы
oForm("password").value = "pAsSwOrD"

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

// Загружаем полученный документ из данных HttpRequest-а
oDoc = documentFromHTML(oHttpRequest.responseText, oHttpRequest.Option(1))

// Сохраняем страничку с результатами авторизации
saveTextFile("ucoz.htm", oDoc.documentElement.outerHTML);

WScript.Echo("Страница сайта после авторизации сохранена")

/* Функция загрузки и построения документа с указанного URL */
function documentFromURL(sURL) {
    with (oHttpRequest) {
        open("GET", sURL, false);
        send();
        return documentFromHTML(responseText, sURL)
    }
}

/* Функция построения HTML документа на основании HTML кода 
sBaseURL задаётся для того чтобы ссылки внутри документа ссылались на нужный нам URL. Иначе будет подставляться "about:") */
function documentFromHTML(sHTMLCode, sBaseURL) {
    var oDoc = new ActiveXObject("htmlfile");
    oDoc.open();
    oDoc.write("<base href='" + sBaseURL + "'>")
    oDoc.close();
    oDoc.body.innerHTML = sHTMLCode
    return oDoc
}

/* Функция эмулятор отправки формы */
function submitForm(oForm){
    var oField
    var sBody = ""
    var i
    var sAction
    var sBaseHref

    /* Сборка строки запроса формы */
    for (i=0; i < oForm.elements.length; i++) {
        oField = oForm.elements[i];
        /* Берём только те поля у которых задано имя */
        if (oField.name != '') {
            sBody = sBody + encodeURIComponent(oField.name) + "=" + encodeURIComponent(oField.value) + "&"
        }
    }
    /* Отрезаем на хвосте последний амперсанд */
    sBody = sBody.substring(0, sBody.length - 1);

    /* Т.к сайт потребовал указания Referer, то пришлось вставить вот такую "затычку" */
    try {
        sBaseHref = oForm.document.all.tags("base")[0].href
    } catch (e) {}

    /* Преобразуем путь если он относительный */
    sAction = buildURL(sBaseHref, oForm.action)
    
    with (oHttpRequest) {
        open("POST", sAction, false);
        setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        if (sBaseHref != '') setRequestHeader("Referer", sBaseHref);
        send(sBody);
    }
}

/* Функция для построения полного пути из относительного для URL */
function buildURL(sBaseURL, sURL) {
    /* Для расчёта пути я решил использовать двигло самого HTML документа. */
    var oDoc = documentFromHTML("<a href='" + sURL + "'>", sBaseURL);
    return oDoc.all.tags("a")[0].href
}

/* Функция сохранения данных в текстовый файл 
Вставлена чисто для отладки */
function saveTextFile(sFileName, sText, lMode) {
    if (typeof lMode == 'undefined') lMode = 2;
    new ActiveXObject("Scripting.FileSystemObject").OpenTextFile(sFileName, lMode, true, -1).write(sText);
}
serzh82saratov пишет:

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

Конечно можно ) Кто ж Вам запретит. Учимся пользоваться фантастическим поиском гугла. http://lmgtfy.com/?q=AHK+smtp

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

24

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

alexii Вы про это?

alexii пропустил букву, так что смысл вышел прямо противоположный. Конечно же не «прочна», а «порочна». Поправил.

25

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

sergeiplugatyr,  Так как вопрос был про пример на AHK, то совесть мучала, что я Вам код на VBS и JS скинул. В итоге посидел, изучил синтаксис, сваял Вам чудо на этом "фантастическом" языке. Даже с комментами расстарался. Надеюсь это прояснит ситуацию с авторизацией.


; Создаём объект для запросов по HTTP протоколу
global oHttpRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")

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

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

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

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

;Создаём HTML документ из полученных данных от HttpRequest-а
oHtmlDoc := documentFromHTML(oHttpRequest.responseText, oHttpRequest.Option(1))

;Получаем текст страницы
MsgBox % oHtmlDoc.body.outerText

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

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

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

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

    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
}

Готовый скрипт в аттаче.

Post's attachments

test.ahk 2.92 kb, 15 downloads since 2014-03-20 

You don't have the permssions to download the attachments of this post.
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !