Рассмотрим 2 метода:
- Используя Com объект InternetExplorer.Application
- Используя командлет Invoke-WebRequest (появился с версии 3.0)
Учетом успешного выполнения скрипта, будет вывод сообщения – “Ваш последний визит был: время”
1. InternetExplorer.Application
Определим, какие поля нам требуется заполнить, достаточно просто.
В поля “Имя Пользователя” и “Пароль” подставим значения ,и посмотрим, какие поля требуют заполнения.
PS > $ie.Document.forms.Item(1) | Format-Table Name,Value -Auto name value ---- ----- vb_login_username abc cookieuser 1 vb_login_password abc Войти s do login vb_login_md5password vb_login_md5password_utf
Как видно выше для заполнения нужны поля vb_login_username и vb_login_password.
# Имя пользователя $login = "MyUser" # Пароль $pass = "Password" # Адрес страницы $url = "http://forum.oszone.net" # Создание Com-объекта $ie = New-Object -ComObject InternetExplorer.Application # Переход к заданному адресу $ie.Navigate($url) # Ждем загрузки страницы while($ie.Busy) { Start-Sleep -Milliseconds 100 } # Объект страницы $doc = $ie.Document # Заполняем поле - Имя пользователя $doc.getElementsByName("vb_login_username") | % {$_.Value = $login} # Заполняем поле - Пароль $doc.getElementsByName("vb_login_password") | % {$_.Value = $pass} # Снимаем галочку - Сохранить $doc.getElementsByName("cookieuser") | % {$_.Value = 0} # Находим кнопку войти - нажимаем ее $doc.getElementsByTagName("input") | ? {$_.Value -eq "Войти"} | % {$_.Click()} while($ie.Busy) { Start-Sleep -Milliseconds 100 } # После авторизации, получаем данные $doc.Body.OuterText.Split("`r`n") -match "Ваш последний визит"
Определим, какие поля нам требуется заполнить у формы.
PS > $r.Forms[1].Fields | Format-Table -Auto Key Value --- ----- navbar_username Имя пользователя cb_cookieuser_navbar 1 vb_login_password s 7f2a40e2749a7bf18b1b371 do login vb_login_md5password vb_login_md5password_utf
Требуется нам заполнить все поля или достаточно определенных. В этом нам поможет Fiddler.
- Запускаем Fiddler
- Запускаем любой браузер ( логирование командлета Invoke-WebRequest тоже поддерживается)
- Переходим на сайт
- Заполняем поля , нажимаем “Войти”
- Смотрим Post запрос
Поле vb_login_password – пустое, но вычисляется md5 hash пароля.
$md5 = [Security.Cryptography.MD5]::Create() $bstr = [Text.Encoding]::ASCII.GetBytes("abc") $hash = (-join ($md5.ComputeHash($bstr) | %{ "{0:X2}" -f $_})).ToLower() $hash 900150983cd24fb0d6963f7d28e17f72
Для ASCII символов, если пароль в Unicode, данный метод не подойдет. Какой алгоритм преобразования
пароля содержащего Unicode символы — http://forum.oszone.net/clientscript/vbulletin_md5.js?v=364
Вычислим поле vb_login_md5password для Unicode , на примере – Привет:
$str = -join([char[]]"Привет" | % {"&#"+ ([int][char]$_) +";"}) (-join ($md5.ComputeHash([Text.Encoding]::ASCII.GetBytes($str))| %{ "{0:X2}" -f $_})).ToLower()
«&#»+ [int][char]П –> 1055 + “;” = “П”
Вычислим поле vb_login_md5password_utf для Unicode , на примере – Привет:
$str = [int[]][char[]]"Привет" | % {$_ -band 255} (-join ($md5.ComputeHash($str) | %{ "{0:X2}" -f $_})).ToLower()
При использовании полей vb_login_md5password и vb_login_md5password_utf, поле vb_login_password – не заполняем.
Но можно не утруждать себя данными алгоритмами, а просто заполнить поля vb_login_username и vb_login_password.
$login = "MyUser" $pass = "Password" $url = "http://forum.oszone.net" $r = Invoke-WebRequest $url -SessionVariable oz $form = $r.Forms[1] $form.Fields["vb_login_username"] = $login $form.Fields["vb_login_password"] = $pass $r = Invoke-WebRequest -Uri ("$url/" + $form.Action)` -WebSession $oz -Method POST -Body $form.Fields $r = Invoke-WebRequest -Uri $url -WebSession $oz $r.ParsedHtml.Body.OuterText.Split("`r`n") -match "Ваш последний визит"
В конечном итоге получим вывод: