C#程序无法登录网页问题求助(附代码)
修复使用HtmlAgilityPack和HttpClient登录bryx911的问题
你的代码核心问题出在三个地方,按以下步骤修改就能解决:
1. 修正登录表单的字段名
你代码里写的"Email..."和"Password..."是占位符,实际需要从登录页面的HTML源码里获取正确的输入框name属性值:
- 打开https://app.bryx911.com/login,右键选择「查看页面源码」
- 找到用户名和密码对应的输入框,比如类似
<input name="Email" type="email">或<input name="Username" type="text">的标签 - 把代码里的
"Email..."替换成实际的name值(比如"Email"),"Password..."替换成密码框的name值(比如"Password")
2. 调整登录后的请求逻辑
登录成功后,服务器通常会跳转到主页,你现在登录后又请求登录页面,自然找不到目标关键词。应该:
- 登录请求发送后,直接请求登录后的目标页面(比如主页,地址可以看登录成功后浏览器的地址栏)
- 确保
HttpClientHandler开启自动跳转(默认是开启的,显式设置AllowAutoRedirect = true更稳妥)
3. 补充表单验证令牌(可选但关键)
很多ASP.NET类型的网站会要求提交__RequestVerificationToken才能通过表单验证,否则登录会被拒绝。需要先获取登录页面的这个令牌,再加入表单数据。
修改后的完整代码
using HtmlAgilityPack; using System; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { string loginUrl = "https://app.bryx911.com/login"; string homeUrl = "https://app.bryx911.com"; // 替换成登录后实际跳转的页面地址 string[] keywords = { "M02", "E56", "L25" }; string username = "**********"; string password = "*******"; using (var handler = new HttpClientHandler { CookieContainer = new CookieContainer(), UseCookies = true, AllowAutoRedirect = true }) { using (HttpClient client = new HttpClient(handler)) { // 先获取登录页面,提取验证令牌 var loginPageResponse = await client.GetAsync(loginUrl); var loginPageContent = await loginPageResponse.Content.ReadAsStringAsync(); HtmlDocument loginDoc = new HtmlDocument(); loginDoc.LoadHtml(loginPageContent); var tokenNode = loginDoc.DocumentNode.SelectSingleNode("//input[@name='__RequestVerificationToken']"); string verificationToken = tokenNode?.GetAttributeValue("value", ""); // 构造正确的表单数据 var formData = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("Email", username), // 替换成实际的用户名输入框name值 new KeyValuePair<string, string>("Password", password), // 替换成实际的密码输入框name值 }; if (!string.IsNullOrEmpty(verificationToken)) { formData.Add(new KeyValuePair<string, string>("__RequestVerificationToken", verificationToken)); } var loginContent = new FormUrlEncodedContent(formData); // 发送登录请求 var loginResult = await client.PostAsync(loginUrl, loginContent); if (loginResult.IsSuccessStatusCode) { // 请求登录后的主页 var homeResponse = await client.GetAsync(homeUrl); var responseContent = await homeResponse.Content.ReadAsStringAsync(); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(responseContent); foreach (string keyword in keywords) { if (doc.DocumentNode.InnerText.Contains(keyword)) { Console.WriteLine($"找到关键词 '{keyword}'"); } else { Console.WriteLine($"未找到关键词 '{keyword}'"); } } } else { Console.WriteLine($"登录失败,状态码:{(int)loginResult.StatusCode}"); } } } } }
额外说明
- 把代码里的
homeUrl替换成你登录后实际进入的页面地址 - 如果你的控制台版本不支持
async Main,可以改回同步调用,但建议用异步版本避免阻塞问题
内容的提问来源于stack exchange,提问作者ワッツアンドレ
相关产品推荐
相关产品推荐

