Feeds:
Записи
Комментарии

Archive for the ‘InternetExplorer’ Category

Рассмотрим 2 метода:

  1. Используя Com объект  InternetExplorer.Application
  2. Используя командлет Invoke-WebRequest (появился с версии 3.0)

 

Учетом успешного выполнения скрипта, будет вывод сообщения – “Ваш последний визит был: время”

1.  InternetExplorer.Application

Определим, какие поля нам требуется заполнить, достаточно просто.

В поля  “Имя Пользователя” и “Пароль” подставим значения  ,и посмотрим, какие  поля требуют заполнения.

ie

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 "Ваш последний визит"

 

2. Invoke-WebRequest

Определим, какие поля нам требуется заполнить у формы.

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 запрос

iw

 

Поле 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 "Ваш последний визит"

 

В конечном итоге получим вывод:

output

 

Реклама

Read Full Post »

Powershell должен быть запущен с параметром -STA.

Для примера воспользуемся сайтом — Enter.UniCredit.В исходном коде мы видим набор frames.

<FRAMESET ID="FT" ROWS="0,0,*,0" onHelp="if(help_js) Top.Help(''); return false;" FRAMEBORDER="no" BORDER=0 framespacing="0">

		<FRAME SRC="../null_russian.htm" ID="FB" NAME="F_TOOLBAR" FRAMEBORDER="no" SCROLLING="No" MARGINWIDTH="0" MARGINHEIGHT="0" NORESIZE framespacing="0">

		<FRAME SRC="../null_russian.htm" NAME="F_MAINW" MARGINWIDTH="0" MARGINHEIGHT="0" FRAMEBORDER="No" NORESIZE>

		<FRAME ID="FS" NAME="F_HLP" SRC="../check_for_browser.htm" FRAMESPACING="0" NORESIZE MARGINWIDTH="0" MARGINHEIGHT="0" FRAMEBORDER="no" SCROLLING="No" F="help_fr" T="3" IFC="1">

		<FRAME SRC="../null_russian.htm" ID="POST_FRAME" NAME="POST_FRAME" FRAMEBORDER="no" SCROLLING="No" MARGINWIDTH="0" MARGINHEIGHT="0" NORESIZE framespacing="0">

</FRAMESET>

Фреймы в HTML позволяют авторам представлять документы в нескольких разделах, которые могут быть независимыми или вложенными окнами. Это обеспечивает дизайнерам способ оставлять некоторую информацию видимой, в то время как другая информация прокручивается или заменяется. Например, в одном окне в одном фрейме может отображаться статический баннер, во втором навигационное меню, а в третьем — сам документ, который можно прокручивать или переходить к другому с помощью навигации во втором фрейме.
Ни у одного frame,нет каких-либо полей для заполнения.Основное меню реализовано,с помощью frame — F_HLP.Который и скрывает форму(MForm) для заполнения.

<form>
		<input name="T" type="HIDDEN" value="RT_2Auth.CL" />

		<input name="IMode" type="HIDDEN" value="demo" />

		<input name="L" type="HIDDEN" value="russian" />

<table onkeyup="if(event.keyCode==13)fnOnEnter(w);">
<colgroup><col style="width: 100px;"></col>
<col style="width: 120px;"></col>
</colgroup>
<tbody>
<tr>
<td>КЛИЕНТ/ЛОГИН</td>
<td><input maxlength="10" name="A" value="demo" /></td>
</tr>
<tr>
<td>ПАРОЛЬ</td>
<td><input maxlength="10" name="B" type="password" value="demo" /></td>
</tr>
<tr>
<td><img id="LIM3" src="../img/index/img1.gif" alt="" /></td>
<td>
<div class="indexbtn" onclick="SD();">Войти!</div></td>
</tr>
<tr>
<td colspan="2"><a href="../help/russian/enterabout.html#pass" target="_blank">Забыли пароль?</a></td>
</tr>
</tbody>
</table>

</form>

Основная проблема, как добраться до этой формы.Для этого мы подменяем параметр src. Здесь мы и видим, куда перенаправляется frame.

PS > $form  | %{$_.contentwindow.location}

hostname    : demo.enter.unicredit.ru
port        :
pathname    : /v1/cgi/bsi.dll
search      : ?t=RT_2Auth.login_frame&L=RUSSIAN&colorstyle=
hash        :
constructor :

$ie.Document.getElementsByName("F_HLP") | foreach {$_.src = "../cgi/bsi.dll?T=RT_2Auth.login_frame&L=RUSSIAN&colorstyle"}

После этого нам будет доступна MForm и уже не составляет труда пройти авторизацию.

#Логин
$login = "demo"
#Пароль
$pass = "demo"
#Создаем объект типа InternetExplorer.Application
$ie = New-Object -ComObject InternetExplorer.Application
#Страница для авторизации
$loginpage = "http://demo.enter.unicredit.ru/v1/cgi/bsi.dll?T=RT_2Auth.BF"
#Переходим к странице авторизации
$ie.Navigate($loginpage)
#Ждем загрузку страницы
While ($ie.Busy) { Start-Sleep -Milliseconds 400 }
#Отображать IE,можно удалить
$ie.Visible = $true
#Заполняем поле логин
$form = $ie.Document.getElementsByName("F_HLP") | foreach {$_.src = "../cgi/bsi.dll?T=RT_2Auth.login_frame&L=RUSSIAN&colorstyle";$_.contentwindow}
Start-Sleep -Seconds 1
$form.document.forms.namedItem("MForm").item("A").value = $login
#Заполняем поле пароль
$form.document.forms.namedItem("MForm").item("B").value = $pass
#Нажимаем Войти
$form.document.getElementsByTagName("DIV") | where {$_.innerHTML -eq "Войти!"} | foreach {$_.click()}
Start-Sleep -Seconds 5
$form = $ie.Document.getElementsByName("F_TOOLBAR") | foreach {$_.contentwindow}
if ($form.document.getElementsByTagName("DIV") | ? {$_.outertext -match "Выход"})
{
	#Нажать Выйти из системы.
	$form.document.getElementsByTagName("DIV") | ? {$_.outertext -match "Выход"} | foreach {$_.click()}
	Start-Sleep -Seconds 2
	Write-Host -ForegroundColor Yellow "Success"
}
else { Write-Host -ForegroundColor Red "Fail" }
$ie.Quit()

Выполняем скрипт и получаем ответ Success или Fail.

Read Full Post »

Для авторизации на форуме воспользуемся COM объектом InternetExplorer.Application.Для навигации используем метод Navigate.Для получения всех форм на странице,воспользуемся свойством Forms.

PS > $ie.Document.forms | ? {$_.name} | ft name
name
----
web
frmLogin

Как видим у нас две формы,форму frmLogin мы и будем заполнять.После заполнения полей и нажатия кнопки «Войти» ,мы переходим в заданную тему и создаем сообщение.

#Логин
$login = "login"
#Пароль
$pass = "pass"
#Тема
$theme = "http://www.guitarplayer.ru/forum/index.php?topic=175948.0"
#Страница для авторизации
$loginpage = "http://www.guitarplayer.ru/forum/index.php?action=login"
#Создаем объект типа InternetExplorer.Application
$ie = New-Object -ComObject InternetExplorer.Application
#Переходим к странице авторизации
$ie.Navigate($loginpage)
#Ждем загрузку страницы
While ($ie.Busy) { Start-Sleep -Milliseconds 400 }
#Выбираем форму авторизации
$forms = $ie.Document.forms.namedItem("frmLogin")
#Заполняем поле логин
$forms.item("user").value= $login
#Заполняем поле пароль
$forms.item("passwrd").value = $pass
#Нажимаем на кнопку - "Войти"
($forms | where {$_.value -eq "Войти"}).click()
#Переходим к теме
$ie.Navigate2($theme)
#Выбираем форму для сообщений
$mess = $ie.Document.forms.namedItem("postmodify")
#Заполняем сообщение
$mess.item("message").value = "up"
#Нажимаем отправить
$mess.item("post").click()
#Завершаем работу
$ie.Quit()

Read Full Post »