開心網協助工具輔助,可以自動進行操作。
準備工具:WSockExpert(用於抓包)
原理:分析出開心網的所有操作串連,通過程式類比請求進行大量操作!
以開心網登陸做例子,並用程式進行類比登陸。
選擇好監聽頁面後從瀏覽器進行登陸操作。
點擊登陸按鈕後,抓包程式就會有變化了,因為剛才我們進行了與開心網伺服器互動動作,需要向外發送資料,所以通過抓包資料得到了如下結果:
POST /login/login.php HTTP/1.1
Accept: application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://www.kaixin001.com/
Accept-Language: zh-CN
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; CIBA)
Host: http://www.kaixin001.com/
Content-Length: 48
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: _uid=2121099; SERVERID=_srv134-110_
mailto:url=%2F&email=dirain**@yahoo.cn&password=19920226
/login/login.php,就是登陸的請求地址,全部串連應該是:http://www.kaixin001.com/login/login.php。
最底部的mailto:url=%2F&email=dirain**@yahoo.cn&password=19920226 應該就是傳遞的參數,我們可以看到,只提交了帳號和密碼為參數,請求類型為POST。
得到了這些資訊,就可以通過C#的WebRequest去類比一個請求,實現登陸操作,代碼也很簡單。
類比請求的方法
代碼
/// <summary>
/// 發送Post類型請求
/// </summary>
/// <param name="url">請求地址</param>
/// <param name="postData">參數</param>
/// <returns></returns>
public WebResponse doPost(string url,string postData)
{
try
{
System.GC.Collect();
Thread.Sleep(this.defer);
byte[] paramByte = Encoding.UTF8.GetBytes(postData); // 轉化
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.Referer = "http://www.kaixin001.com/app/app.php?aid=1040";
webRequest.Accept = "application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*";
webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; CIBA)";
webRequest.ContentLength = paramByte.Length;
webRequest.CookieContainer = this.cookies;
//webRequest.Timeout = 5000;
Stream newStream = webRequest.GetRequestStream();
newStream.Write(paramByte, 0, paramByte.Length); //寫入參數
newStream.Close();
return webRequest.GetResponse();
}
catch (Exception ce)
{
throw ce;
}
}
在類比請求中需要注意的是同步Cookie,否則沒有辦法維持session。
webRequest.CookieContainer = this.cookies;
這句話就是維持session的關鍵代碼,this.cookies是一個非局部變數,這樣保證每次調用的時候都可以使用上次操作時的cookie。
/// <summary>
/// 與請求相關的cookie(用於保持session)
/// </summary>
protected CookieContainer cookies = new CookieContainer();
只要每次請求的時候把Webrequest對象的CookieContainer 屬性賦值為已經聲明好的 CookieContainer對象,而不是重新執行個體化。
登陸開心網
代碼
/// <summary>
/// 登陸開心網
/// </summary>
/// <param name="account">使用者名稱</param>
/// <param name="password">密碼</param>
/// <returns>使用者個人資訊</returns>
public virtual UserInfoEntity Login(string account,string password)
{
try
{
//拼湊登陸參數
string param = "url=/home/&invisible_mode=0&email=" + account + "&password=" + password;
WebResponse response = this.doPost("http://www.kaixin001.com/login/login.php",param);
StreamReader streamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
//如果返回地址為home頁,則說明登陸成功
if (response.ResponseUri.ToString() == "http://www.kaixin001.com/home/")
{
//讀取返回的流
string body = streamReader.ReadToEnd();
//如果存在如下資訊則登陸失敗
if (body.IndexOf("帳號或密碼不太對吧! 重試一次?") != -1)
{
return null;
}
else
{
//登陸成功後執行
//
}
}
else
{
response.Close();
streamReader.Close();
}
}
catch
{
}
}
這是個簡單的類比請求登陸代碼,其實做WEB程式的協助工具輔助,重要的就是分析資料,這個例子中最重要的步驟還是用抓包工具去抓取開心網的提交方式以及傳遞參數。如果你不用抓包工具去抓取你也可以通過分析html表單來擷取傳遞方式,但這樣會很麻煩。
//post時,自動跳轉與否??
request.AllowAutoRedirect = true;