Как использовать веб-клиент на защищенном сайте?

StackOverflow https://stackoverflow.com/questions/48224

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Решение

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

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

  • В https нет ничего особенного, связанного с WebClient — он просто работает.
  • Файлы cookie обычно используются для аутентификации — вам необходимо их захватить и воспроизвести.

Вот шаги, которым я бы следовал:

  1. ПОЛУЧИТЕ форму входа, запишите файл cookie в ответ.
  2. Используя Xpath и HtmlAgilityPack, найдите имена и значения полей «тип ввода = скрытый».
  3. POST для действия формы входа в систему с именем пользователя, паролем и значениями скрытых полей в теле запроса.Включите файл cookie в заголовки запросов.Опять же, запишите файл cookie в ответ.
  4. ПОЛУЧИТЕ нужные страницы, используя файл 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 )
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top