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)
您需要通过 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)