многобанофф, именно так. )
Чуток допилил. Вот пример авторизации на сайте вконтакта. С логином и паролем как Вы хотели.
P.S Подробности о HTML DOM Document можно посмотреть тут: ссылка
Люблю эту фразу - "На самом деле сложного в коде ничего нет."
Есть несколько "макро" функций для упрощения обработки HTML содержимого.
documentFromHTML - строит HTML DOM Document на основании переданного текстового содержимого.
documentFromURL - функция надстройка над documentFromHTML. Позволяет сразу загрузить документ с URL
submitForm - функция которая эмулирует отправку формы. На вход принимает объект формы.
Остальной функционал ( выборка тэгов, получение элементов по ID ) уже реализован внутри объектов, которые возвращают эти функции.
Так что всё сводится к простым этапам
1) Запрашиваем данные через documentFromURL.
2) Проверяем результаты загрузки через HttpRequest.Status ( Я это в коде вставлять не стал. Дабы упростить пример до минимума. )
3) Обрабатываем элементы документа через document.all / document.getElementByID и т.п
В итоге параллельно имеем HTTP статусы, HTTP заголовки и т.п ( то чего нам не хватало в IE ) и HTML DOM Document для удобного парсинга страницы.
Будут вопросы - задавайте.
;Константы используемые в 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("Загружаем основную страницу сайта")
; Загружаем основную страницу входа
oHtmlDoc := documentFromURL("http://vk.com")
writeLn("Получаем первую форму")
; Получаем первую по счёту форму
oForm := oHtmlDoc.forms[0]
; Заполняем в форме поле email
oForm["email"].value := "user@gmail.com"
; Заполняем в форме поле пароль
oForm["pass"].value := "pass"
; Эмулируем отправку формы
submitForm(oForm)
; Проверяем - есть ли в тексте сообщение о том, что авторизация прошла успешно
if InStr(oHttpRequest.ResponseText,"LoginDone") <= 0 {
MsgBox % "Авторизация не удалась ! Проверьте логин и пароль"
Exit
}
; Загружаем ленту новостей контакта
oHtmlDoc := documentFromURL("http://vk.com/")
; Получаем ссылку на наш основной профиль и "переходим по ней"
oHtmlDoc := documentFromURL(oHtmlDoc.GetElementByID("myprofile").href)
; Выводим текст из блока с именем и фамилией
MsgBox % oHtmlDoc.GetElementByID("title").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
{
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)
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%, *
}
OFFTOP: Вы как хотите, а я в Warface рубиться пошёл. ) Скрипты надоели !
Post's attachmentsvk_auth.ahk 4.41 kb, 22 downloads since 2014-03-21
You don't have the permssions to download the attachments of this post.
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !