Как использовать веб-клиента на защищенном сайте? - PullRequest
7 голосов
/ 07 сентября 2008

Мне нужно автоматизировать процесс, включающий веб-сайт, использующий форму входа. Мне нужно захватить некоторые данные на страницах, следующих за страницей входа.

Я знаю, как отсканировать обычные страницы, но не те, что находятся на защищенном сайте.

  1. Можно ли это сделать с помощью класса .NET WebClient?
    • Как мне автоматически войти?
    • Как бы я продолжал входить для других страниц?

Ответы [ 4 ]

9 голосов
/ 07 сентября 2008

Одним из способов было бы автоматизировать браузер - вы упомянули WebClient, так что я предполагаю, что вы можете ссылаться на WebClient в .NET.

Два основных момента:

  • В https нет ничего особенного связанный с WebClient - он просто работает
  • Cookie-файлы обычно используются для проведения аутентификации - вам нужно захватывать и воспроизводить их

Вот следующие шаги:

  1. ПОЛУЧИТЕ форму входа в систему, захватите cookie в ответе.
  2. Используя Xpath и HtmlAgilityPack, найдите поле «input type = hidden» имена и значения.
  3. POST для входа в действие формы с именем пользователя, паролем и скрытыми значениями полей в теле запроса. Включите cookie в заголовки запроса. Снова захватите cookie в ответе.
  4. ПОЛУЧИТЕ нужные страницы, опять же, с cookie в заголовках запроса.

На шаге 2 я упоминаю несколько сложный способ автоматизации входа в систему. Обычно вы можете публиковать имя пользователя и пароль непосредственно в известном действии формы входа в систему, не получая первоначальную форму и не передавая скрытые поля. Некоторые сайты имеют проверку форм (в отличие от проверки полей) на своих формах, что делает этот метод неработоспособным.

HtmlAgilityPack - это библиотека .NET, которая позволяет вам превращать плохо сформированный HTML в XmlDocument, чтобы может XPath над этим. Весьма полезно.

Наконец, вы можете столкнуться с ситуацией, когда форма использует клиентский скрипт для изменения значений формы перед отправкой. Возможно, вам придется смоделировать это поведение.

Использование инструмента для просмотра http-трафика для этого типа работы чрезвычайно полезно - я рекомендую ieHttpHeaders , Fiddler или FireBug (вкладка net).

1 голос
/ 07 сентября 2008

Вы можете легко смоделировать пользовательский ввод. Вы можете отправить форму на веб-странице из вашей программы, отправив сообщение \ запрос на веб-сайт.
Типичная форма входа выглядит так:

<form name="loginForm" method="post" Action="target_page.html">
   <input type="Text" name="Username">
   <input type="Password" name="Password">
</form>

Вы можете отправить запрос на публикацию на веб-сайте, указав значения полей «Имя пользователя» и «Пароль». Что происходит после того, как вы отправите запрос, во многом зависит от веб-сайта, обычно вы будете перенаправлены на какую-то страницу. Ваша авторизационная информация будет храниться в сессиях \ cookie. Таким образом, если вы очистите клиент от необходимости поддерживать веб-сеанс \ понимать файлы cookie, вы сможете получить доступ к защищенным страницам.

Из вашего вопроса не ясно, какой язык \ рамки вы собираетесь использовать. Например, существует структура для очистки экрана (включая функции входа в систему), написанная на perl - WWW :: Mechanize

Обратите внимание, что вы можете столкнуться с некоторыми проблемами, если сайт, на который вы пытаетесь войти, использует java-скрипты или какую-то CAPTCHA.

0 голосов
/ 07 сентября 2008

Из вашего вопроса не ясно, на какой класс (или язык) WebClient вы ссылаетесь.

Если у вас есть Java Runtime, вы можете использовать класс 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 )
0 голосов
/ 07 сентября 2008

Не могли бы вы уточнить? Класс WebClient, о котором вы говорите, относится к классу HTTPUnit / Java?

Если это так, ваша сессия должна быть сохранена автоматически.

...