Как использовать веб-клиент на защищенном сайте?
-
09-06-2019 - |
Вопрос
Мне нужно автоматизировать процесс, связанный с веб-сайтом, использующим форму входа.Мне нужно записать некоторые данные на страницах, следующих за страницей входа в систему.
Я знаю, как проверять обычные страницы, но не те, которые находятся на защищенном сайте.
- Можно ли это сделать с помощью класса .NET WebClient?
- Как мне автоматически войти в систему?
- Как мне сохранить вход на другие страницы?
Решение
Одним из способов является автоматизация браузера: вы упомянули WebClient, поэтому я предполагаю, что вы, возможно, имеете в виду WebClient в .NET.
Два основных момента:
- В https нет ничего особенного, связанного с WebClient — он просто работает.
- Файлы cookie обычно используются для аутентификации — вам необходимо их захватить и воспроизвести.
Вот шаги, которым я бы следовал:
- ПОЛУЧИТЕ форму входа, запишите файл cookie в ответ.
- Используя Xpath и HtmlAgilityPack, найдите имена и значения полей «тип ввода = скрытый».
- POST для действия формы входа в систему с именем пользователя, паролем и значениями скрытых полей в теле запроса.Включите файл cookie в заголовки запросов.Опять же, запишите файл cookie в ответ.
- ПОЛУЧИТЕ нужные страницы, используя файл cookie в заголовках запроса.
На шаге 2 я упоминаю несколько сложный метод автоматизации входа в систему.Обычно вы можете публиковать сообщения с именем пользователя и паролем непосредственно в известном действии формы входа, не получая исходную форму и не передавая скрытые поля.На некоторых сайтах в формах предусмотрена проверка формы (отличная от проверки полей), из-за чего этот метод не работает.
HtmlAgilityPack — это библиотека .NET, которая позволяет преобразовывать некорректный HTML-код в XmlDocument, чтобы можно было использовать XPath для его обработки.Весьма полезно.
Наконец, вы можете столкнуться с ситуацией, когда форма использует клиентский скрипт для изменения значений формы перед отправкой.Возможно, вам придется смоделировать это поведение.
Использование инструмента для просмотра http-трафика для такого типа работы чрезвычайно полезно — рекомендую ieHttpHeaders, Скрипач, или FireBug (вкладка «Сеть»).
Другие советы
Вы можете легко имитировать пользовательский ввод.Вы можете отправить форму на веб-странице из своей программы, отправив запрос post\get на веб-сайт.
Типичная форма входа выглядит так:
<form name="loginForm" method="post" Action="target_page.html">
<input type="Text" name="Username">
<input type="Password" name="Password">
</form>
Вы можете отправить запрос на публикацию на веб-сайт, указав значения для полей имени пользователя и пароля.Что произойдет после отправки запроса, во многом зависит от веб-сайта: обычно вы будете перенаправлены на какую-то страницу.Информация для авторизации будет храниться в файле session\cookie.Поэтому, если ваш парсинг-клиент может поддерживать веб-сессию\понимает файлы cookie, вы сможете получить доступ к защищенным страницам.
Из вашего вопроса неясно, какой язык\фреймворк вы собираетесь использовать.Например, существует платформа для очистки экрана (включая функцию входа в систему), написанная на Perl - WWW::Механизировать
Обратите внимание, что вы можете столкнуться с некоторыми проблемами, если сайт, на который вы пытаетесь войти, использует Java-скрипты или какой-либо CAPTCHA.
Можете ли вы уточнить?Является ли класс WebClient, о котором вы говорите, тем же, что и в HTTPUnit/Java?
В этом случае ваша сессия должна быть сохранена автоматически.
Из вашего вопроса неясно, какой класс (или язык) WebClient вы имеете в виду.
Если у вас есть среда выполнения Java, вы можете использовать класс Apache HttpClient;вот пример, который я написал с использованием Groovy, который обращается к восхитительному API через SSL:
def client = new HttpClient()
def credentials = new UsernamePasswordCredentials( "username", "password" )
def authScope = new AuthScope("api.del.icio.us", 443, AuthScope.ANY_REALM)
client.getState().setCredentials( authScope, credentials )
def url = "https://api.del.icio.us/v1/posts/get"
def method = new PostMethod( url )
method.addParameter( "tag", tag )
client.executeMethod( method )