序言:
迴歸正題:前面講到的抓包分析的數據,是模擬登錄要獲得得必要信息(當然有些也不是必要的...我只是都列舉出來這樣有個對比)如果說,有哪個英文字母不知道什麼意思的,可以問一下度娘,有不少前輩都發過類似的博文上面都有解釋,我這軟件也是基於他們的幫助才得以實現。
好了,根據前面說的步驟,下面開始我們今天的內容--------①如何獲取百度的BAIDUID
獲取之前還要給大家普及一個注意事項:就是Get請求跟Post時的請求報文頭,Post必須註明request.ContentType = "application/x-www-form-urlencoded";
第一步理論邏輯:我們要向www.baidu.com提交一個Get請求,獲取這個BAIDUID(第一次請求的時候才能夠抓包到這個Cookies,所以找不到的童鞋請清除緩存)
第二步代碼實現:
#region 網頁請求HttpHelper類
HttpWebRequest request = null;
HttpWebResponse response = null;
CookieContainer cc = new CookieContainer();
/// <summary>
/// Get方式獲取頁面響應內容
/// </summary>
public string GetPageResponse_Get(string url,string referer,string request_Accept)
{
try
{
string content = "";
request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.Referer = referer;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0";
request.Headers["Accept-Language"] = "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3";
request.KeepAlive = true;
request.Accept = request_Accept;
request.Host = new Uri(url).Host;
request.AllowAutoRedirect = false;
request.CookieContainer = cc;
using (response = (HttpWebResponse)request.GetResponse())
{
//第一次從http:\\www.baidu.com中獲取BAIDUID時,發現該cookie會當場失效,此處修改保存期限
foreach (Cookie ck in response.Cookies)
{
ck.Expires = DateTime.MaxValue;
}
cc.Add(response.Cookies);
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
content = reader.ReadToEnd();
stream.Close();
reader.Close();
}
return content;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
return null;
}
/// <summary>
/// Post數據獲取響應
/// </summary>
public string GetPageResponse_Post(string url, string postData, string referer)
{
try
{
string content = "";
request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "Post";
request.Timeout = 20000;
request.Headers["Cache-control"] = "no-cache";
request.Headers["Accept-Language"] = "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3";
request.Headers["DNT"] = "1";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0";
request.Referer = referer;
request.ContentType = "application/x-www-form-urlencoded";
request.KeepAlive = true;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Host = new Uri(url).Host;
request.AllowAutoRedirect = false;
request.CookieContainer = cc;
///攜帶cookiesPost數據
byte[] dataByte = Encoding.UTF8.GetBytes(postData);
request.ContentLength = dataByte.Length;
using (Stream stream = request.GetRequestStream())
{
stream.Write(dataByte, 0, dataByte.Length);
}
using (response = request.GetResponse() as HttpWebResponse)
{
foreach (Cookie ck in response.Cookies)
{
ck.Expires = DateTime.MaxValue;
}
cc.Add(response.Cookies);
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
content = reader.ReadToEnd();
}
}
return content;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
return null;
}
#endregion
上面的類大家參考一下,寫的可能不是很好,大家要注意一個問題就是,目前我用的是VS2012版本,它在獲取BAIDUID的時候我發現這個值效期短,所以弄得每次反饋回來的信息都沒有這個值,搗鼓了很久才終於發現原來是Cookis過期。所以上面的代碼,我將每一次獲得的Cookies都設置成爲無限期。
下面是獲取代碼:
/// <summary>
/// 獲取BAIDUID等cookies
/// </summary>
public void GetBAIDUID()
{
string url_baidu = string.Format("https://www.baidu.com");
helper.GetPageResponse_Get(url_baidu,null, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
}
如無意外,你獲得的將會有4個Cookies,也就是前面提到的那幾個,但最重要的是BAIDUID,我們只要將這些Cookies儲存在CookieContainer中就可以不用管了,好了,今天就到這裏比較簡單,如果看了有不懂的或者無法實現的,歡迎評論交流