Войти на сайт, используя HTMLAgilityPack

c# html-agility-pack login login-script

Вопрос

В приведенном ниже коде я могу установить значение имени пользователя и пароля с помощью HTMLAgilitypack, но я не могу вызывать событие нажатия кнопки входа (идентификатор в исходном коде кнопки «s1»).

Так или иначе, чтобы это было сделано? Причина, по которой я не использую WebBrowser заключается в том, что мне понадобится HTMLAgilityPack для извлечения данных со страницы без идентификаторов в исходном коде.

var doc = new HtmlWeb().Load("http://MYURL.com");
doc.DocumentNode.SelectSingleNode("name").SetAttributeValue("value", "MyUsername");
doc.DocumentNode.SelectSingleNode("password").SetAttributeValue("value", "MyPassword");

Принятый ответ

Так или иначе, чтобы это было сделано?

Не с тем, что предоставляет библиотека HTML Agility Pack (HAP), а не напрямую.

HAP отлично подходит для получения одной страницы и анализа ее, но она не предназначена для продолжения взаимодействия. Вещи, которые отсутствуют, - это управление файлами cookie, взаимодействие с JavaScript и многое другое.

Для входа в систему вам, вероятно, нужно отправить HTTP-сообщение POST на сервер, включая нужные вам данные - HAP не может с этим поделать.

Вам нужно будет использовать такой класс, как WebRequest чтобы сделать пост - я предлагаю посмотреть на скрипача и использовать его, чтобы посмотреть, как должен выглядеть запрос и построить его, хотя это может быть только первым шагом.

Возможно, вам захочется исследовать использование инструментов веб-автоматизации, таких как селен или WatiN .


Популярные ответы

Вы должны наблюдать запрос POST через скрипач и посмотреть, как он структурирован. например :

    {"userName":"you","password":"pwd"}

Обычно сайт признает, что вы вошли в систему, получив их cookie в своих запросах.

HttpClient по умолчанию отправляет файлы cookie, полученные из определенного домена, с каждым последовательным запросом в этот домен (до тех пор, пока вы не разместите этот экземпляр HttpClient)

1) Создайте контейнер cookie и назначьте его в свой экземпляр HttpClient.

2) Используйте HttpClient, чтобы выполнить запрос POST для входа.

3) Используйте HttpClient для выполнения запроса GET данных.

4) Прочитайте строку html из ответа.

5) Используйте HtmlAgilityPack HtmlDocument для загрузки документа из строки html, а не из Интернета (как показывает большинство примеров).

 string baseUrl = "https://www.yourwebsite.com";
 string loginUrl = "/Account/LogOn"; 
 string sessionUrl = "/Data";

 var uri = new Uri(baseUrl);

 CookieContainer cookies = new CookieContainer();
 HttpClientHandler handler = new HttpClientHandler();
 handler.CookieContainer = cookies;

 using (var client = new HttpClient(handler))
 {
       client.BaseAddress = uri;

       var request = new { userName = "you", password = "pwd" };
       var resLogin = client.PostAsJsonAsync(loginUrl,request).Result;
       if (resLogin.StatusCode != HttpStatusCode.OK)
            Console.WriteLine("Could not login -> StatusCode = " + resLogin.StatusCode);

       // see what cookies are returned   
      IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();
      foreach (Cookie cookie in responseCookies)
            Console.WriteLine(cookie.Name + ": " + cookie.Value);

      var resData = client.GetAsync(dataUrl).Result;
      if(resSession.StatusCode != HttpStatusCode.OK)
            Console.WriteLine("Could not get data html -> StatusCode = " + resSession.StatusCode);

       var html = resSession.Content.ReadAsStringAsync().Result;

       var doc = new HtmlDocument();
       doc.LoadHtml(html);
 }


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему