使用HTMLAgilityPack登录网站

c# html-agility-pack login login-script

在下面的代码中,我可以使用HTMLAgilitypack设置用户名和密码的值,但是我无法调用登录按钮的click事件(按钮的源代码中的id是“s1”)。

无论如何要做到这一点?我没有使用WebBrowser的原因是因为我需要HTMLAgilityPack来从页面中检索没有ID的数据。

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的类来发布帖子 - 我建议查看fiddler并使用它来查看请求应该是什么样子并相应地构建它,尽管这可能只是第一步。

您可能想要研究使用网络自动化工具,例如seleniumWatiN


热门答案

您需要通过fiddler观察POST请求并查看其结构。例如 :

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

通常,站点会通过在您的请求中接收cookie来识别您已登录。

默认情况下, HttpClient会将从每个顺序请求从特定域收到的cookie发送到该域(直到您处置该HttpClient实例)

1)创建一个cookie容器并将其分配给您的HttpClient实例。

2)使用HttpClient进行登录POST请求。

3)使用HttpClient进行数据GET请求。

4)从响应中读取html字符串。

5)使用HtmlAgilityPack HtmlDocument从html字符串加载文档而不是从Web加载文档(如大多数示例所示)。

 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
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因