使用 WebRequest 登录网站时出现远程服务器错误



所以我目前正在尝试使用WebRequest登录我的帐户。 我一直在阅读它,以至于我觉得我想用一个例子来通过反复试验来学习。

这是我正在使用的示例 通过 C# 登录网站

因此,当我尝试执行我的代码时,它会返回一个未处理的异常及其这个异常

System.Net.WebException:"远程服务器返回错误:(404( 未找到。

我尝试逐步执行代码,我认为可能是它试图在无法发布的地方发布。 我想在确认它已成功登录之前解决此问题。 为了这个问题,我将用户名和密码更改为虚拟文本。

我在这里做错了什么,解决此问题的最合乎逻辑的方法是什么? 提前谢谢。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string formUrl = "https://secure.runescape.com/m=weblogin/login.ws"; // NOTE: This is the URL the form POSTs to, not the URL of the form (you can find this in the "action" attribute of the HTML's form tag
string formParams = string.Format("login-username={0}&login-password={1}", "myUsername", "password");
string cookieHeader;
WebRequest req = WebRequest.Create(formUrl);
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
req.ContentLength = bytes.Length;
using (Stream os = req.GetRequestStream())
{
os.Write(bytes, 0, bytes.Length);
}
WebResponse resp = req.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];

当你抓取一个网站时,你必须确保你模仿发生的一切。这包括在表单发布之前发送的任何客户端状态 (Cookie(。由于大多数网站不喜欢被机器人抓取或引导,因此它们通常对有效载荷非常挑剔。您尝试控制的网站也是如此。

您错过了三件重要的事情:

  • 您不是从初始 GET 开始的,因此您在 CookieContainer 中拥有所需的 cookie。
  • 在帖子中,您错过了表单中的标题(引荐来源网址(和三个隐藏字段。
  • 表单字段名为用户名和密码(如输入标签的 name 属性所示(。您已使用该 ID 的。

修复这些遗漏将生成以下代码:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36";
// capture cookies, this is important!
var cookies = new CookieContainer();
// do a GET first, so you have the initial cookies neeeded
string loginUrl = "https://secure.runescape.com/m=weblogin/loginform.ws?mod=www&ssl=0&dest=community";
// HttpWebRequest
var reqLogin = (HttpWebRequest) WebRequest.Create(loginUrl);
// minimal needed settings
reqLogin.UserAgent = useragent;
reqLogin.CookieContainer = cookies;
reqLogin.Method = "GET";
var loginResp = reqLogin.GetResponse();
//loginResp.Dump(); // LinqPad testing
string formUrl = "https://secure.runescape.com/m=weblogin/login.ws"; // NOTE: This is the URL the form POSTs to, not the URL of the form (you can find this in the "action" attribute of the HTML's form tag
// in ther html the form has 3 more hidden fields, those are needed as well
string formParams = string.Format("username={0}&password={1}&mod=www&ssl=0&dest=community", "myUsername", "password");
string cookieHeader;
// notice the cast to HttpWebRequest
var req = (HttpWebRequest) WebRequest.Create(formUrl);
// put the earlier cookies back on the request
req.CookieContainer = cookies;
// the Referrer is mandatory, without it a timeout is raised
req.Headers["Referrer"] = "https://secure.runescape.com/m=weblogin/loginform.ws?mod=www&ssl=0&dest=community";
req.UserAgent = useragent;
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
req.ContentLength = bytes.Length;
using (Stream os = req.GetRequestStream())
{
os.Write(bytes, 0, bytes.Length);
}
WebResponse resp = req.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];

这为我带来了成功。由您解析生成的 HTML 来规划后续步骤。

相关内容

  • 没有找到相关文章

最新更新