Как выполнить вход с помощью WinHttpRequest COM?

Вы можете увидеть множество людей, автоматизирующих работу веб-сайтов с помощью имитации щелчка мыши и нажатия клавиш в окнах браузера или с помощью IE COM, но для некоторых приложений вы не хотите, чтобы ваше приложение занимало сотни мегабайт ОЗУ и использовало массу ресурсов ЦП для рендеринга. веб-сайт и т. д.

Итак, вопрос:
Как выполнять вход на веб-сайты / веб-сервисы с помощью AutoHotkey без браузера, но с помощью WinHttpRequest COM?


person Forivin    schedule 05.04.2015    source источник


Ответы (1)


Я уже публиковал это на форумах AHK, но думаю, что эта информация достаточно полезна, чтобы ее можно было заархивировать и на Stackoverflow. :)

Инструменты и начало работы

Прежде всего, если вы хотите делать такие вещи, как вход в систему, вам, вероятно, следует немного изучить HTML и основы протокола HTTP. Fiddler и SetProxy(2,"localhost:8888") ОЧЕНЬ поможет вам в отладке и обратном проектировании. Я также рекомендую использовать надстройку для вашего браузера, чтобы быстро очистить файлы cookie.

Пример 1 (форумы IP Board)

Хорошо, теперь давайте посмотрим на несколько примеров. Как будет выглядеть вход на форум autohotkey.com?
Чтобы перепроектировать вход на этот сайт, я просто проанализировал HTTP-запросы браузера на autohotkey.com (используйте для этого Fiddler или F12 в браузере) и с помощью некоторого эксперимента и ошибку я смог свести к минимуму. Нам нужно ровно два запроса и для логина нужен один заголовок запроса, а также 3 параметра данных POST.

Вот что мы в основном собираемся делать:

  1. Сделайте простой запрос GET на http://www.autohotkey.com/board/index.php?app=core&module=global§ion=login
  2. Извлеките параметр auth_key из формы входа в тело ответа (ResponseText)
  3. Создайте строку данных POST, содержащую параметр auth_key, а также имя пользователя, пароль и параметр RememberMe для входа в систему.
  4. Установить заголовок Content-Type для следующего запроса
  5. Отправьте строку данных POST на http://www.autohotkey.com/board/index.php?app=core&module=global§ion=login&do=process
  6. Проанализируйте тело ответа и проверьте, начинается ли заголовок HTML-документа со слов «Войти». Если это так, то вы, очевидно, не вошли в систему (не удалось войти в систему/неверные данные для входа). Если название отличается, значит вход прошел успешно.

Пример 1 кода

;Prepare our WinHttpRequest object
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;HttpObj.SetProxy(2,"localhost:8888") ;Send data through Fiddler
HttpObj.SetTimeouts(6000,6000,6000,6000) ;Set timeouts to 6 seconds
;HttpObj.Option(6) := False ;disable location-header rediects

;Set our URLs
loginSiteURL := "http://www.autohotkey.com/board/index.php?app=core&module=global&section=login"
loginURL := "http://www.autohotkey.com/board/index.php?app=core&module=global&section=login&do=process"

;Set our login data
username := "Brutosozialprodukt"
password := "xxxxxxxxxxxxxx"
rememberMe := "1"

;Step 1
HttpObj.Open("GET",loginSiteURL)
HttpObj.Send()

;Step 2
RegExMatch(HttpObj.ResponseText,"<input\stype='hidden'\sname='auth_key'\svalue='(\w+)'\s/>",match)
auth_key := match1

;Step 3
loginBody := "auth_key=" auth_key "&ips_username=" username "&ips_password=" password "&rememberMe=" rememberMe

;Step 4/5
HttpObj.Open("POST",loginURL)
HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
HttpObj.Send(loginBody)

;Step 6
If (InStr(HttpObj.ResponseText,"<title>Sign In"))
    MsgBox, The login failed!
Else
    MsgBox, Login was successfull!

Это, вероятно, будет работать для большинства форумов IPB, если правильно изменить URL-адреса.

Пример 2 (форумы phpbb)

Давайте еще раз войдем на новый/другой форум AHK (это будет намного проще).

  1. Создайте данные POST, содержащие имя пользователя, пароль и параметр автологина.
  2. Установите заголовок Content-Type
  3. Отправьте данные POST на http://ahkscript.org/boards/ucp.php?mode=login
  4. Проанализируйте тело ответа и проверьте, начинается ли заголовок HTML-документа со слова «Логин». Если это так, то вы, очевидно, еще не вошли в систему (неудачный вход/неверные данные для входа). Если название отличается, значит вход прошел успешно.

Пример 2 кода

;Prepare our WinHttpRequest object
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;HttpObj.SetProxy(2,"localhost:8888") ;Send data through Fiddler
HttpObj.SetTimeouts(6000,6000,6000,6000) ;Set timeouts to 6 seconds
;HttpObj.Option(6) := False ;disable location-header rediects

;Set our URLs
loginURL := "http://ahkscript.org/boards/ucp.php?mode=login"

;Set our login data
username := "Brutosozialprodukt"
password := "xxxxxxxxxxxxxx"
autologin := "on"

;Step 1
loginBody := "username=" username "&password=" password "&autologin=" autologin "&login=Login"

;Step 2/3
HttpObj.Open("POST",loginURL)
HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
HttpObj.Send(loginBody)

;Step 4
If (InStr(HttpObj.ResponseText,"<title>Login"))
    MsgBox, The login failed!
Else
    MsgBox, Login was successfull!

Это, вероятно, будет работать для большинства форумов phpbb, если правильно изменить URL-адреса.

person Forivin    schedule 05.04.2015
comment
это НЕ связано с вопросом, но не могли бы вы привести очень короткий пример того, как загрузить страницу / файл с заданным httpObj? Я не могу использовать urldownloadtofile, потому что моей странице нужен кеш, чтобы разрешить доступ к файлу. /сорри за оффтоп - person phil294; 05.04.2015
comment
@Blauhirn Взгляните на это: stackoverflow.com/questions/29459477/ - person Forivin; 05.04.2015
comment
@Blauhirn Я думаю, это именно то, что вам нужно: stackoverflow.com/questions/ 29460945/ - person Forivin; 05.04.2015