1 (изменено: Stephan, 2017-05-18 14:49:21)

Тема: AHK: Привязка команд WinHTTP к скрипту

Здравствуйте. Мне нужен способ авторизации в https://vk.com/login через ahk. Я читал похожие топики на сайте но так и не смог найти точного ответа. Идея скрипта заключается в том, что есть два поля edit, в которые пользователь  вписывает логин/пароль от вк и его логинит на сайт, не выводя при этом все эти действия на экран. ВАЖНОЕ ПРИМЕЧАНИЕ: браузер желательно научить запускаться в скрытом режиме, лучше в виде фонового процесса.

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

Пример исходника лаунчера на gui ahk


Gui, Font, S14 CDefault, Tahoma
Gui, Add, Edit, x202 y166 w310 h30 , 

Gui, Font, S14 CDefault, Tahoma
Gui, Add, Edit, x202 y223 w310 h30 vpassword password, 
Gui, Add, Button, x222 y279 w230 h30 , Войти
Gui, Add, Button, x29922 y99279 w99230 h9930 , Close
Gui, Add, Text, x82 y169 w100 h30 , Log
Gui, Add, Text, x82 y229 w100 h30 , Pass

Gui, Show, x314 y188 h353 w643, Vk
Return

GuiClose:
ButtonClose:
ExitApp

Сзади будет картинка, код нужен для примера связи gui и WinHTTP

2 (изменено: stealzy, 2017-05-17 19:48:37)

Re: AHK: Привязка команд WinHTTP к скрипту

Исправьте заголовок темы на более осмысленный (вы очевидно не браузер писать собрались) и добавьте префикс.
И вообще, тут наверху есть ссылка Поиск. Попробуйте, очень удобно. Вот например.

3 (изменено: Stephan, 2017-05-17 20:30:38)

Re: AHK: Привязка команд WinHTTP к скрипту

stealzyСпасибо, переделал всю тему. Если ты разбираешься, прошу тебя помочь)

4 (изменено: stealzy, 2017-05-17 23:54:42)

Re: AHK: Привязка команд WinHTTP к скрипту

Не могу ответить, пока не исправишь заголовок в соответствии с правилами форума, а посты - с правилами русского языка.

5

Re: AHK: Привязка команд WinHTTP к скрипту

stealzy Есть сер! Все что мог -- исправил, правила форума распечатал и поставил в рамку вместо иконы. Теперь очень прошу мне помочь)

6 (изменено: stealzy, 2017-05-18 17:02:28)

Re: AHK: Привязка команд WinHTTP к скрипту

А точки в конце предложений кто будет ставить? «Привязка команд к скрипту» - что это такое? «Авторизация на vk.com» было гораздо лучше.

Авторизация и чтение основной информации профиля на vk.com (на основе поста Xameleon'a):

login := "+79876543210", pass := "p@ssword", vkid := "id123456789"

; Константы, используемые в WinHttpRequest
global WinHttpRequestOption_EnableRedirects := 6, WinHttpRequestOption_MaxAutomaticRedirects := 14, 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("Загружаем основную страницу сайта")
; Загружаем основную страницу входа
oHtmlDoc1 := documentFromURL("https://vk.com/")
writeLn("Получаем первую форму")
; Получаем первую по счёту форму
oForm := oHtmlDoc1.forms[0]
; Заполняем в форме поле email и пароль
oForm["email"].value := login
oForm["pass"].value := pass
; Эмулируем отправку формы
submitForm(oForm)
; Проверяем - есть ли в тексте сообщение о том, что авторизация прошла успешно
if (InStr(oHttpRequest.ResponseText, "LoginDone") <= 0) {
	MsgBox % "Авторизация не удалась ! Проверьте логин и пароль"
	Exit
}
; Загружаем страницу профиля
oHtmlDoc2 := documentFromURL("https://vk.com/" vkid)
; Получаем ссылку на наш основной профиль и "переходим по ней"
; oHtmlDoc := documentFromURL(oHtmlDoc2.GetElementByID("l_pr").left_row)
; Выводим текст из блока с именем и фамилией
MsgBox % oHtmlDoc2.GetElementByID("page_info_wrap").innerText
Return

; Функция загрузки и построения документа с указанного URL
documentFromURL(sURL) {
	writeLn("documentFromURL")
	writeLn("   URL: " . sURL)
	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){
	FileAppend % text "`n", *
}

Также у сайта есть API, попробуйте спросить sememix, как работать через него.