Я уже публиковал это на форумах AHK, но думаю, что эта информация достаточно полезна, чтобы ее можно было заархивировать и на Stackoverflow. :)
Инструменты и начало работы
Прежде всего, если вы хотите делать такие вещи, как вход в систему, вам, вероятно, следует немного изучить HTML и основы протокола HTTP. Fiddler и SetProxy(2,"localhost:8888") ОЧЕНЬ поможет вам в отладке и обратном проектировании. Я также рекомендую использовать надстройку для вашего браузера, чтобы быстро очистить файлы cookie.
Пример 1 (форумы IP Board)
Хорошо, теперь давайте посмотрим на несколько примеров. Как будет выглядеть вход на форум autohotkey.com?
Чтобы перепроектировать вход на этот сайт, я просто проанализировал HTTP-запросы браузера на autohotkey.com (используйте для этого Fiddler или F12 в браузере) и с помощью некоторого эксперимента и ошибку я смог свести к минимуму. Нам нужно ровно два запроса и для логина нужен один заголовок запроса, а также 3 параметра данных POST.
Вот что мы в основном собираемся делать:
- Сделайте простой запрос GET на http://www.autohotkey.com/board/index.php?app=core&module=global§ion=login
- Извлеките параметр auth_key из формы входа в тело ответа (ResponseText)
- Создайте строку данных POST, содержащую параметр auth_key, а также имя пользователя, пароль и параметр RememberMe для входа в систему.
- Установить заголовок Content-Type для следующего запроса
- Отправьте строку данных POST на http://www.autohotkey.com/board/index.php?app=core&module=global§ion=login&do=process
- Проанализируйте тело ответа и проверьте, начинается ли заголовок 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§ion=login"
loginURL := "http://www.autohotkey.com/board/index.php?app=core&module=global§ion=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 (это будет намного проще).
- Создайте данные POST, содержащие имя пользователя, пароль и параметр автологина.
- Установите заголовок Content-Type
- Отправьте данные POST на http://ahkscript.org/boards/ucp.php?mode=login
- Проанализируйте тело ответа и проверьте, начинается ли заголовок 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