Авторизация на сайте через Powershell
В качестве дополнительного интернета пользуюсь услугами PEOPLEnet (есть такой оператор 3G интернета в Украине). Для того, чтобы узнать состояние счёта нужно отправить sms на определённый номер, либо зайти в систему самообслуживания. Как первое, так и второе делать всегда лень, а за состоянием счёта следить нужно. В очередной раз пополняя счёт подумал, а нельзя-ли упростить процедуру определения состояния счёта, тем более, что ни номера, на который нужно слать sms, ни своего номера/пароля от системы самообслуживания я не помню, а браузерам хранить пароли я не доверяю. Так появилась идея написать скрипт, который сам будет заходить на сайт, коннектиться, проверять счёт, а мне будет только выводить результат.
Поискав немного в интернете понял, что я далеко не первый, кому лень вводить логины / пароли кто захотел сделать подобный скрипт.
Немного повозившись родилось решение. Попробую описать ход мыслей.
Для того, чтобы войти в систему самообслуживания нужно заполнить следующую форму:
Исследуя код страницы можно увидеть, что форма для авторизации называется LoginForm, а поля для ввода номера и пароля X_Username и X_Password соответственно.
Этого достаточно, чтобы начать писать скрипт.
Для начала вводим номер, пароль и адрес страницы:
$login = "number" $password = "password" $url = "http://my.people.net.ua"
Создаём объект InternetExplorer, загружаем страницу и ждём окончания загрузки:
$IE = New-Object -ComObject InternetExplorer.Application $IE.Navigate($url) While ($IE.Busy) { Start-Sleep -Milliseconds 100 }
Можно убедиться, что форма одна, и называется она LoginForm:
$IE.Document.forms | Select-Object name
Заполняем форму, нажимаем кнопку входа, и ждём пока загрузится:
$form = $IE.Document.forms.namedItem("LoginForm") $form.item("X_Username").value = $login $form.item("X_Password").value = $password ($form | Where-Object {$_.value -eq "Вхід"}).click() While ($IE.Busy) { Start-Sleep -Milliseconds 100 }
После того, как страница загрузится нужно только посмотреть на её содержимое. Из всей страницы, нас интересует только одна строка, которая в обычном виде выглядит следующим образом:
Как мне показалось достать эту строку из всего текста проще всего с помощью свойства innerText, содержащего весь текст страницы, и выбрав только интересующую информацию с помощью регулярного выражения:
$text = $IE.Document.documentElement.innerText # Закрываем IE $IE.Quit() # .+ - один, или несколько любых символов $regex = [regex]'Стан рахунку:.+грн.' $regex.Match($text) | Select-Object -ExpandProperty value
Результат:
Что и требовалось.
Подскажите пожалуйста а как осуществить поиск вот в таком документе(Необходимо совершить туже операцию но без извлечения данных — просто залогинится): И пожалуйста посоветуйте какую то литературу пожалуйста
Давайте по порядку…
Я чего-то не понял…
В каком??
Теги не работают
У меня вот нет форм например если другие возможности извлекать информацию и автоматизирования работы на сайте.
Мне например нужно автоматизировать работу с сайтом что бы скрип логинился и настраивал веб сервис по наблюдению за камерами наблюдения (извините за тафто логию) Вот например $IE.Document.forms | Select-Object name не работает у меня ну понятно в документе том форм нету Опишите пожалуйста еще возможность оперироваться елементами хтмл по их ID например
То, что описано в статье делалось, когда была актуальна версия Powershell 2.0. Если у Вас Powershell 3.0 и выше, то попробуйте использовать специальный командлет Invoke-WebRequest: http://technet.microsoft.com/en-us/library/hh849901.aspx. Просмотрите до конца — внизу есть примеры.
А что, для наблюдения за камерами нет ничего более подходящего, чем Powershell и веб? (Я просто не в теме :))
$IE.Document.forms | Select-Object name не работает также например на яндексе
Скрипт необходим для того что бы запускать камеры в случае отключения компа наблюдателя, а сторожей учить тому что делает скрип труд не посильный.)) Может и есть там что то я не знаю я получил задачу через вторые руки