gpt4 book ai didi

c# - 我如何登录、导航并从 protected 网站返回数据,到目前为止我所做的一切都不起作用

转载 作者:太空狗 更新时间:2023-10-29 23:26:31 26 4
gpt4 key购买 nike

虽然我找到了许多关于如何使用 HttpWebRequest 和 Response 进行 GET 和 POST 的文章和其他信息,但我发现自己很难让事情像我期望的那样工作。

我一直在尝试我发现的几个想法,但到目前为止,没有任何效果......我将发布我的代码:

private void start_post()
{
string username = txtUser.Text;
string password = txtPassword.Text;
string strResponce;
byte[] buffer = Encoding.ASCII.GetBytes("username="+username+"&password="+password);
HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(txtLink.Text);
WebReq.Method = "POST";
//WebReq.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
WebReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
WebReq.Headers.Add("Translate", "F");
WebReq.AllowAutoRedirect = true;
WebReq.CookieContainer = cookieJar;
WebReq.KeepAlive = true;
WebReq.ContentType = "application/x-www-form-urlencoded";
WebReq.ContentLength = buffer.Length;
Stream PostData = WebReq.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();

HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
//txtResult.Text = WebResp.StatusCode.ToString() + WebResp.Server.ToString();

Stream answer = WebResp.GetResponseStream();
StreamReader _answer = new StreamReader(answer);
strResponce = _answer.ReadToEnd();
//txtResult.Text = txtResult.Text + _answer.ReadToEnd();

answer.Close();
_answer.Close();

foreach (Cookie cookie in WebResp.Cookies)
{
cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain));
txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString();
}

if (strResponce.Contains("Log On Successful") || strResponce.Contains("already has a webseal session"))
{
MessageBox.Show("Login success");
foreach (Control cont in this.Controls)
{
cont.Visible = true;
}
}
else
{
MessageBox.Show("Login Failed.");
}


}

在代码中,我能够一直走到底部,但当我导航到 http://www.comicearth.com 时仍然登录失败。 (我自己的网站,php 和 apache)我创建了一个表单,然后从该表单中输入密码和用户名。当它这样做时,它说失败,这没关系。我也在使用 Fidder 来观察发生了什么。

因此,我知道我在下面的代码中做错了什么。

但是,当我导航到另一个 Web 应用程序时,我在该行收到以下错误:

HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();

“不能为不写入数据的操作设置内容长度或分块编码。”

我正在尝试找出问题所在,我所说的一切都是因为 302 重定向...

因此,在 Fiddler 中,我可以看到尝试发布数据和通过网页登录之间的巨大差异。所以我知道我做得还不够,但我不知道去哪里找。

我的目标是构建一个能够登录网站的应用程序,然后通过他们的搜索选项提取必要的数据,目前我们让用户手动完成这些数据,如果我可以自动化一些繁琐的工作,它会真正帮助大家。但是,我目前在登录、理解 cookie 等方面遇到了困难……此外,该网站使用框架,我不知道这是否会成为问题,但我想我会发布该信息,以防万一这是我还没有遇到的另一个障碍。

如果您需要我查看更多代码,请告诉我,目前我正在使用 httpwebrequest 和 httpwebresponse,并且我已经阅读了有关 Web 客户端的其他信息。

我已经下载并试用了 htmlagilitypack,但目前我不确定我是否 100% 了解它们的工作原理。

如果您知道任何好的文章或更深入地涵盖该主题的其他信息,或者有任何我可以尝试的信息,请告诉我。

非常感谢您的宝贵时间。

使用新代码更新,也请参阅下面我的评论:- 好的,我发现由于重定向,我收到一条错误消息:“Content-Length 或 Chunked Encoding etc...”,所以我转身allowAutoRedirect = false 现在我寻找“位置”标签,并重定向自己等,这摆脱了这条消息,但是,我仍然没有登录该网站,这令人失望,我无法弄清楚为什么现在。 :S

private void start_post2()
{
string username = txtUser.Text;
string password = txtPassword.Text;
Uri link = new Uri(txtLink.Text);
string postArgs = string.Format(@"userId={0}&password={1}", username, password);
byte[] buffer = Encoding.ASCII.GetBytes(postArgs);
HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(txtLink.Text);
WebReq.Method = "POST";
//WebReq.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
WebReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
//WebReq.ClientCertificates.Add("Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
WebReq.AllowAutoRedirect = false;
WebReq.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
WebReq.Accept = "*/*";
//WebReq.Headers.Add(HttpRequestHeader.Cookie, cookieJar);
WebReq.CookieContainer = cookieJar;
WebReq.KeepAlive = true;
WebReq.ContentType = "application/x-www-form-urlencoded";
WebReq.ContentLength = buffer.Length;
Stream PostData = WebReq.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();

HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
if (WebResp == null) throw new Exception("Response is null");

foreach (Cookie cookie in WebResp.Cookies)
{
cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain));
//txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString();
}

if (!string.IsNullOrEmpty(WebResp.Headers["Location"]))
{
string newLocation = WebResp.Headers["Location"];

//Request the new location
WebReq = (HttpWebRequest)WebRequest.Create(newLocation);
WebReq.Method = "GET";
WebReq.ContentType = "application/x-www-form-unlencoded";
WebReq.AllowAutoRedirect = false;
WebReq.CookieContainer = cookieJar;
WebReq.CookieContainer.Add(WebResp.Cookies);

buffer = Encoding.ASCII.GetBytes("userId=" + username + "&password=" + password);

WebReq.ContentLength = buffer.Length;
PostData = WebReq.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();

WebResp = (HttpWebResponse)WebReq.GetResponse();

foreach (Cookie cookie in WebResp.Cookies)
{
cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain));
//txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString();
}
}
else if (!string.IsNullOrEmpty(WebResp.Headers["Set-Cookie"]))
{
// thinking...
}

foreach (Cookie cookie in cookieJar.GetCookies(link))
{
MessageBox.Show(cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString());
}

StreamReader sr = new StreamReader(WebResp.GetResponseStream());
string responseHtml = sr.ReadToEnd().Trim();

SearchPatient(WebReq, username, password);

}

最佳答案

如果它是一个 winform 应用程序并且该应用程序只是一个屏幕抓取器而不是一个非常大的应用程序,您可以使用 Watin用于报废

这里是 link开始

关于c# - 我如何登录、导航并从 protected 网站返回数据,到目前为止我所做的一切都不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4926446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com