本次開發環境與工具如下:
IE9.0瀏覽器 + IE抓包插件HttpWatch +WIN7 64位系統 + VS2005 IDE + .NET 2.0框架
測試時注意事項:
必須取消淘寶帳號登錄保護http://110.taobao.com/protect/protect_web.htm
做這個程序關鍵是分析數據,只有數據分析出來了,才能動手寫代碼。
下面來幾張截圖說明分析數據步驟:
第一步:在淘寶聯盟www.alimama.com上面使用淘寶賬號登錄,輸入賬號密碼點擊登錄後,截到如下數據
現在我們知道了要POST的URL,即"https://login.taobao.com/member/login.jhtml",以及要POST的數據,還有服務器將會回覆的內容,那麼請看如下代碼:
private void Login()
{
HttpItem item = new HttpItem();
item.URL = https://login.taobao.com/member/login.jhtml;
item.Method = "post";
item.Postdata = string.Format("ua=056u5Ob……&TPL_username={0}&TPL_password={1}&...……", HttpUtility.UrlEncode(txtLoginId.Text.Trim()), HttpUtility.UrlEncode(txtPwd.Text.Trim()));
item.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
item.Allowautoredirect = true;
HttpResult result = m_Http.GetHtml(item);
string html = result.Html;//服務器回覆的內容,它是json格式,包括message,token等字段,message爲空爲登錄成功,否則不爲空
string cookie = result.Cookie;//保存cookie便於後面還要使用
Match m = Regex.Match(html, "(?<=,\"message\":\").*?(?=\",)");
if (string.IsNullOrEmpty(m.Value)) //登錄成功賬號密碼正確的情況下
{
Match token = Regex.Match(html, "(?<=\"token\":\").*?(?=\")");//捕獲token的值,後面提交的網址中將要使用它
if (!string.IsNullOrEmpty(token.Value))
{
……
}
}
}
如上代碼所示,當訪問請求提交後,服務器返回的json內容在變量html裏面,其中message字段表示是否有錯誤,如:賬號密碼不正確,如果賬號密碼正確message字段值將爲"",所以我們利用正則表達式捕獲message的值。另外token字段我們也要獲取下來,因爲下一個訪問的網址要用到它。
第二步:根據捕獲的token值拼裝網址並繼續訪問,如下圖
從上面得到的token值,經過拼裝字符串得到下次訪問的URL,即"https://passport.alipay.com/mini_apply_st.js?site=0&token={0}&callback=vstCallback62"。這次訪問後服務器會返回一段js代碼,其中包含一個"st"的值(看上圖的紅色框部分),同樣,這次我們也像上次一樣用正則表達式捕獲"st”的值並且保存,因爲後面要使用到它。
(小結:其實我一直在做一件事情,即:把這次訪問的結果作爲參數拼裝一下將得到下次要訪問的網址)
private void Login(){
……
Match token = Regex.Match(html, "(?<=\"token\":\").*?(?=\")");//獲取token值
if (!string.IsNullOrEmpty(token.Value))
{
item = new HttpItem();
item.Method = "get";
item.URL = string.Format("https://passport.alipay.com/mini_apply_st.js?site=0&token={0}&callback=vstCallback62", token.Value);
item.Accept = "application/javascript, */*;q=0.8";
result = m_Http.GetHtml(item);
html = result.Html;
cookie += result.Cookie;
Match st = Regex.Match(html, "(?<=\"st\":\").*?(?=\")");//捕獲st的值,後面還要使用它
……
}
}
第三步:根據捕獲的st值,繼續訪問,如下圖
通過將上面得到的st值再次拼裝下網址得到URL即https://login.taobao.com/member/vst.htm?st={0}&……TPL_username%3D{1}……&callback=jsonp75
,{0}處填寫上一步的st,{1}處填寫淘寶賬號,這次服務器同樣會返回下一次要訪問的網址,我們將他捕獲出來它就是url字段(上圖中紅框標記)
第四步:我們繼續訪問這個url,服務器將會進行重定向三次,每次重定向的網址從HttpResult.Header中Location字段中得到再賦值給item.URL進行訪問。如下圖
至此登錄就完成了,接下來就是下載xls文件了。對於下載xls文件較簡單,直接get方式提交網址,得到byte[]字節數組並利用FileStream類寫到文件中。大家根據以上分析的思路學會分析纔是最重要的,所以下載這部分就留給大家自已分析了。提示:下載觀看我的源碼+觀察HttpWatch截獲的數據2種方式相結合去分析,對於觀察HttpWatch截獲的數據主要觀看他是POST還是GET方式,以及訪問的地址和提交的COOKIE以及服務器返回的COOKIE,還有服務器的回覆流這幾個方面着手分析。
上面我在講解的過程中分了4個步驟,是從第1步至第4步講解的,其實我們在分析數據的時候應該首先從第4步開始一直回溯cookie就得到了第1步,因爲第4步中服務器發來的cookie纔是最重要的,有了它才能訪問淘寶聯盟的首頁(這個結論當然是通過幾次試驗得出的),但如果不進行第123步的話第4步的訪問地址t和cookie無法得出,所以第4步是分析數據的切入點,至關重要。