C# 跨网页保存 cookie 和会话
C# keeping cookies and sessions across webpages
我在此处和 Google 中尝试了很多示例,但仍然无法保存我的登录信息。我已经调试并看到它发送了 302 重定向并且我的登录成功了。我相信。然后我将它发送到下一页,但保留从登录响应中获得的 cookie。但我仍然注销。除了 urls 和登录信息之外,这是我的代码。我已经验证了我的 POST 参数。我首先请求会话 cookie,然后登录,然后继续到重定向页面。非常感谢所有帮助,这是一个令人头疼的问题。
HttpWebRequest GetRequest(string Site, CookieContainer Cookies, string SendType)
{
HttpWebRequest request = WebRequest.Create(Site) as HttpWebRequest;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
request.CookieContainer = Cookies; // Assign it some cookies
request.ContentType = "application/x-www-form-urlencoded";
request.Method = SendType;
return request;
}
private string GetLoggedInPage(string username, string password, string loginPage, string redirectPage)
{
string formParams = string.Format("login={0}&password={1}", username, password);
// cookies to use for multiple requests
var cookies = new CookieContainer(); // Create cookies!
var request= GetRequest(loginPage, cookies, "POST");
//Send params off
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
using (Stream loginStream = request.GetRequestStream())
{
loginStream.Write(bytes, 0, bytes.Length);
}
request.GetResponse().Dispose(); // removed some code here, no need to read response manually
request= GetRequest(redirectPage, cookies, "GET");
using (WebResponse getResponse = request.GetResponse())
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
var result = sr.ReadToEnd();//Read logged in webpage
return Convert.ToString(result);
}
}
return "<Html></html>"; //Return blank page in case the using above didn't work correctly.
}
下面的代码已经过重构并且可以正常工作。我听从了下面 KoBE 的建议,但仍然没有用。问题原来是针对框架 4.5.2 我针对 4.0 和以下功能工作。只需向 GetLoggedInPage 发送您的用户名、密码和登录名 url 以及目标 url,它就会返回一个字符串。我要把它变成 class 并使用它。
记得保存你的饼干人!
void WriteParams(string Params, HttpWebRequest webrequestStream)
{
byte[] bytes = Encoding.ASCII.GetBytes(Params);
using (Stream requestStream = webrequestStream.GetRequestStream())
{
requestStream.Write(bytes, 0, bytes.Length);
}
}
HttpWebRequest GetRequest(string Site, ref CookieContainer Cookies, string SendType)
{
HttpWebRequest request = WebRequest.Create(Site) as HttpWebRequest;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
request.CookieContainer = Cookies; // Assign it some cookies
request.ContentType = "application/x-www-form-urlencoded";
request.Method = SendType;
return request;
}
private string GetLoggedInPage(string username, string password, string loginPage, string redirectPage)
{
string formParams = string.Format("login={0}&password={1}", username, password);
// cookies to use for multiple requests
var cookies = new CookieContainer(); // Create cookies!
HttpWebRequest request= GetRequest(loginPage, ref cookies, "POST");
//Send params off
WriteParams(formParams, request);
request.GetResponse();// .Dispose(); // removed some code here, no need to read response manually
request= GetRequest(redirectPage, ref cookies, "GET");
using (WebResponse getResponse = request.GetResponse())
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
var result = sr.ReadToEnd();//Read logged in webpage
return Convert.ToString(result);
}
}
return "<Html></html>"; //Return blank page in case the using above didn't work correctly.
}
编辑:我终于看了你的代码。看起来您只是缺少用户代理。请在底部查看您修改后的代码。
首先,我要更改的是:
var cookies = new CookieContainer(); // Create cookies!
TheRequest.CookieContainer = new CookieContainer();
为此:
var cookies = new CookieContainer(); // Create cookies!
TheRequest.CookieContainer = cookies;
这将使您不再需要:
foreach (Cookie c in TheResponse.Cookies)//Get response cookie
{
cookies.Add(c);
}
TheRequest.CookieContainer = cookies;
无需创建两个cookie容器,然后从一个容器复制到另一个,只需将原始版本设置为复制版本即可。
我不确定,但这可以解决您的问题,具体取决于 CookieContainer 在后台实际为 Uri 特定 cookie 做了多少工作,或者您有什么。
https://www.pucatrade.com/dashboard 是您使用的 url 吗?另外,您为什么要尝试多次登录?
修改代码
string username = "your-user";
string pass = "your-pass";
string loginPage = "https://pucatrade.com/login";
string redirectPage = "https://pucatrade.com/dashboard";
string formParams = string.Format("login={0}&password={1}", username, pass);
// cookies to use for multiple requests
var cookies = new CookieContainer(); // Create cookies!
var request = WebRequest.Create(loginPage) as HttpWebRequest;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
request.CookieContainer = cookies; // Assign it some cookies
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
request.ContentLength = bytes.Length;
using (Stream loginStream = request.GetRequestStream())
{
loginStream.Write(bytes, 0, bytes.Length);
}
request.GetResponse().Dispose(); // removed some code here, no need to read response manually
request = WebRequest.Create(redirectPage) as HttpWebRequest; //we know we get redirected too here, so just go there.
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
request.CookieContainer = cookies; // Assign it some cookies
request.Method = "GET";
using (WebResponse getResponse = request.GetResponse())
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
var result = sr.ReadToEnd();//Read logged in webpage
}
}
我在此处和 Google 中尝试了很多示例,但仍然无法保存我的登录信息。我已经调试并看到它发送了 302 重定向并且我的登录成功了。我相信。然后我将它发送到下一页,但保留从登录响应中获得的 cookie。但我仍然注销。除了 urls 和登录信息之外,这是我的代码。我已经验证了我的 POST 参数。我首先请求会话 cookie,然后登录,然后继续到重定向页面。非常感谢所有帮助,这是一个令人头疼的问题。
HttpWebRequest GetRequest(string Site, CookieContainer Cookies, string SendType)
{
HttpWebRequest request = WebRequest.Create(Site) as HttpWebRequest;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
request.CookieContainer = Cookies; // Assign it some cookies
request.ContentType = "application/x-www-form-urlencoded";
request.Method = SendType;
return request;
}
private string GetLoggedInPage(string username, string password, string loginPage, string redirectPage)
{
string formParams = string.Format("login={0}&password={1}", username, password);
// cookies to use for multiple requests
var cookies = new CookieContainer(); // Create cookies!
var request= GetRequest(loginPage, cookies, "POST");
//Send params off
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
using (Stream loginStream = request.GetRequestStream())
{
loginStream.Write(bytes, 0, bytes.Length);
}
request.GetResponse().Dispose(); // removed some code here, no need to read response manually
request= GetRequest(redirectPage, cookies, "GET");
using (WebResponse getResponse = request.GetResponse())
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
var result = sr.ReadToEnd();//Read logged in webpage
return Convert.ToString(result);
}
}
return "<Html></html>"; //Return blank page in case the using above didn't work correctly.
}
下面的代码已经过重构并且可以正常工作。我听从了下面 KoBE 的建议,但仍然没有用。问题原来是针对框架 4.5.2 我针对 4.0 和以下功能工作。只需向 GetLoggedInPage 发送您的用户名、密码和登录名 url 以及目标 url,它就会返回一个字符串。我要把它变成 class 并使用它。
记得保存你的饼干人!
void WriteParams(string Params, HttpWebRequest webrequestStream)
{
byte[] bytes = Encoding.ASCII.GetBytes(Params);
using (Stream requestStream = webrequestStream.GetRequestStream())
{
requestStream.Write(bytes, 0, bytes.Length);
}
}
HttpWebRequest GetRequest(string Site, ref CookieContainer Cookies, string SendType)
{
HttpWebRequest request = WebRequest.Create(Site) as HttpWebRequest;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
request.CookieContainer = Cookies; // Assign it some cookies
request.ContentType = "application/x-www-form-urlencoded";
request.Method = SendType;
return request;
}
private string GetLoggedInPage(string username, string password, string loginPage, string redirectPage)
{
string formParams = string.Format("login={0}&password={1}", username, password);
// cookies to use for multiple requests
var cookies = new CookieContainer(); // Create cookies!
HttpWebRequest request= GetRequest(loginPage, ref cookies, "POST");
//Send params off
WriteParams(formParams, request);
request.GetResponse();// .Dispose(); // removed some code here, no need to read response manually
request= GetRequest(redirectPage, ref cookies, "GET");
using (WebResponse getResponse = request.GetResponse())
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
var result = sr.ReadToEnd();//Read logged in webpage
return Convert.ToString(result);
}
}
return "<Html></html>"; //Return blank page in case the using above didn't work correctly.
}
编辑:我终于看了你的代码。看起来您只是缺少用户代理。请在底部查看您修改后的代码。
首先,我要更改的是:
var cookies = new CookieContainer(); // Create cookies!
TheRequest.CookieContainer = new CookieContainer();
为此:
var cookies = new CookieContainer(); // Create cookies!
TheRequest.CookieContainer = cookies;
这将使您不再需要:
foreach (Cookie c in TheResponse.Cookies)//Get response cookie
{
cookies.Add(c);
}
TheRequest.CookieContainer = cookies;
无需创建两个cookie容器,然后从一个容器复制到另一个,只需将原始版本设置为复制版本即可。
我不确定,但这可以解决您的问题,具体取决于 CookieContainer 在后台实际为 Uri 特定 cookie 做了多少工作,或者您有什么。
https://www.pucatrade.com/dashboard 是您使用的 url 吗?另外,您为什么要尝试多次登录?
修改代码
string username = "your-user";
string pass = "your-pass";
string loginPage = "https://pucatrade.com/login";
string redirectPage = "https://pucatrade.com/dashboard";
string formParams = string.Format("login={0}&password={1}", username, pass);
// cookies to use for multiple requests
var cookies = new CookieContainer(); // Create cookies!
var request = WebRequest.Create(loginPage) as HttpWebRequest;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
request.CookieContainer = cookies; // Assign it some cookies
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
request.ContentLength = bytes.Length;
using (Stream loginStream = request.GetRequestStream())
{
loginStream.Write(bytes, 0, bytes.Length);
}
request.GetResponse().Dispose(); // removed some code here, no need to read response manually
request = WebRequest.Create(redirectPage) as HttpWebRequest; //we know we get redirected too here, so just go there.
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
request.CookieContainer = cookies; // Assign it some cookies
request.Method = "GET";
using (WebResponse getResponse = request.GetResponse())
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
var result = sr.ReadToEnd();//Read logged in webpage
}
}