使用HTMLAgilityPack登录网站

tou*_*ets 11 c# login login-script html-agility-pack

在下面的代码中,我可以使用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");
Run Code Online (Sandbox Code Playgroud)

Ode*_*ded 6

无论如何要做到这一点?

不是HTML Agility Pack(HAP)库提供的 - 而不是直接.

HAP非常适合获取单个页面并对其进行解析,但它不适用于持续的交互.缺少的是cookie管理,JavaScript交互等等.

为了登录,您可能需要向服务器发送HTTP POST,包括您想要的数据 - HAP无法帮助您.

您将需要使用类似WebRequest的帖子 - 我建议查看fiddler并使用它来查看请求应该是什么样子并相应地构建它,尽管这可能只是第一步.

您可能希望研究使用Web自动化工具,例如seleniumWatiN.


era*_*zap 6

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

    {"userName":"you","password":"pwd"}
Run Code Online (Sandbox Code Playgroud)

通常,网站会通过在您的请求中接收 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);
 }
Run Code Online (Sandbox Code Playgroud)