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

11

В приведенном ниже коде я могу установить значение имени пользователя и пароля с помощью 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");
Теги:
login
html-agility-pack
login-script

3 ответа

5
Лучший ответ

В любом случае, чтобы это было сделано?

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

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

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

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

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

  • 0
    Спасибо за вашу помощь. Я посмотрел, но мне определенно нужно использовать HTMLAgilityPack из-за странной исходной кодировки веб-сайта, в который я захожу. Я сделал что-то, но потом я немного застрял: я вхожу в систему через webbrowser1 controla и затем извлекаю cookie для этого сеанса. Могу ли я применить этот файл cookie и открыть страницу, используя этот файл cookie, используя HTMLAgilityPack?
  • 1
    @user1842134 user1842134 - Нет, HAP не имеет и не может иметь дело с куки.
Показать ещё 1 комментарий
2

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

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

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

HttpClient по умолчанию отправляет куки, полученные из определенного домена, с каждым последовательным запросом в этот домен (до тех пор, пока вы не разместите этот экземпляр 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);
 }
0

Я не знаю, используете ли вы элемент управления WPF WebBrowser, но если это так, вы можете использовать что-то в строках

doc.GetElementById("submit_signin").Click();

То, что работает для меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню