我创建了一个连接到我的phpBB论坛并登录的C#应用程序。我现在正在尝试使用webclient转到页面并将该页面作为字符串抓取。但是我一直在退出。如何在webclient中使用用于登录论坛的代码创建的cookie?
用于登录论坛并获取页面的代码:
public static CookieContainer login(string url, string username, string password, Form1 form)
{
if (url.Length == 0 || username.Length == 0 || password.Length == 0)
{
Console.WriteLine("Information missing");
return null;
}
CookieContainer myContainer = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = myContainer;
// Set type to POST
request.Method = "POST";
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
request.ContentType = "application/x-www-form-urlencoded";
// Build the new header, this isn't a multipart/form, so it's very simple
StringBuilder data = new StringBuilder();
data.Append("username=" + Uri.EscapeDataString(username));
data.Append("&password=" + Uri.EscapeDataString(password));
data.Append("&login=Login");
// Create a byte array of the data we want to send
byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString());
// Set the content length in the request headers
request.ContentLength = byteData.Length;
Stream postStream;
try
{
postStream = request.GetRequestStream();
}
catch (Exception e)
{
Console.WriteLine("Login - " + e.Message.ToString() + " (GRS)");
return null;
}
// Write data
postStream.Write(byteData, 0, byteData.Length);
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (Exception e)
{
Console.WriteLine("Login - " + e.Message.ToString() + " (GR)");
return null;
}
bool isLoggedIn = false;
// Store the cookies
foreach (Cookie c in response.Cookies)
{
if (c.Name.Contains("_u"))
{
if (Convert.ToInt32(c.Value) > 1)
{
isLoggedIn = true;
}
}
myContainer.Add(c);
}
if (isLoggedIn)
{
string _url = "http://www.dandrews.net/forum/custom.php";
string strResult = "";
HttpWebRequest _request = (HttpWebRequest)HttpWebRequest.Create(_url);
_request.CookieContainer = myContainer;
HttpWebResponse _response = (HttpWebResponse)_request.GetResponse();
using (StreamReader sr = new StreamReader(_response.GetResponseStream()))
{
strResult = sr.ReadToEnd();
// Close and clean up the StreamReader
sr.Close();
}
form.userbox.Text = strResult;
return myContainer;
}
else
{
return null;
}
}
答案 0 :(得分:1)
您使用的CookieContainer
与设计的不同。
CookieContainer myContainer = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = new CookieContainer();
应该是:
CookieContainer myContainer = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = myContainer;
然后,您可以完全删除逻辑以自行填充容器,因为框架将为您执行此操作。然后确保在第二个请求中使用myContainer实例,它应该可以工作。
<强>更新强>
如果您必须使用WebClient
课程来处理第二个请求,则可能需要查看this question以帮助您使用CookieContainer
WebClient
次请求。
<强>更新强>
根据您更新的代码:
public static CookieContainer login(string url, string username, string password)
{
if (url.Length == 0 || username.Length == 0 || password.Length == 0)
{
Console.WriteLine("Information missing");
return null;
}
CookieContainer myContainer = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = myContainer;
// Set type to POST
request.Method = "POST";
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
request.ContentType = "application/x-www-form-urlencoded";
// Build the new header, this isn't a multipart/form, so it's very simple
StringBuilder data = new StringBuilder();
data.Append("username=" + Uri.EscapeDataString(username));
data.Append("&password=" + Uri.EscapeDataString(password));
data.Append("&login=Login");
// Create a byte array of the data we want to send
byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString());
// Set the content length in the request headers
request.ContentLength = byteData.Length;
Stream postStream;
try
{
postStream = request.GetRequestStream();
}
catch (Exception e)
{
Console.WriteLine("Login - " + e.Message.ToString() + " (GRS)");
return null;
}
// Write data
postStream.Write(byteData, 0, byteData.Length);
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (Exception e)
{
Console.WriteLine("Login - " + e.Message.ToString() + " (GR)");
return null;
}
string _url = "http://www.dandrews.net/forum/custom.php";
// Store the cookies
if (myContainer.GetCookies(new Uri(url)).Cast<Cookie>().Any(c => c.Name.Contains("_u")))
{
string strResult = "";
HttpWebRequest _request = (HttpWebRequest)HttpWebRequest.Create(_url);
_request.CookieContainer = myContainer;
HttpWebResponse _response = (HttpWebResponse)_request.GetResponse();
using (StreamReader sr = new StreamReader(_response.GetResponseStream()))
{
strResult = sr.ReadToEnd();
// Close and clean up the StreamReader
sr.Close();
}
Console.WriteLine(strResult);
return myContainer;
}
else
{
return null;
}
}