前言
為什么要拿新浪開刀呢?它是我在做模擬登錄過程中非常難啃的骨頭,相信各位也碰到了這樣問題。所以今天就跟各位一起分析一下這個硬骨頭。
以前的很多關於新浪登錄的大半都是python語言的,這兒,我來個C#的。不知道各位是否給面兒啊。
進入分析過程
1、首先使用http協議的分析工具,查看瀏覽器跟服務器之間的交互是怎么樣的?這里推薦用httpwatch,fiddler2等工具。然后就使用瀏覽器登陸吧,經過查看,這個登錄過程基本有4、5次請求,這樣頻繁的請求,用於在登陸過程上,可算是用心良苦啊。其中黃色的就是請求的關鍵點。
2、這里我們鍵盤ctrl+F,尋找交互過程中輸入的用戶名,密碼等參數,就不難發現
http://login.sina.com.cn/sso/prelogin.php?entry=boke&callback=sinaSSOController.preloginCallBack&su=bm9uZ2NodWFuZzA1NTIwMSU0MHNpbmEuY24%3D&rsakt=mod&client=ssologin.js(v1.4.11)&_=1377775419738
這條請求,點擊Raw之后,發現了他post出去的各種參數。
具體的可以切換到webforms標簽。看看這家伙到點在用什么加密方式。哦,天啊,su,sp,第一眼,我就知道下面的2個不是好東西(經過加密處理)。想法辦法解密吧。
解密su,sp參數,實現POST成功提交
1、解密su,這個參數是經過Base64加密的,如果不知道是什么加密的出來的,還是非常難猜的,這里就提供了一下解密方法。
Encoding.Default.GetString(Convert.FromBase64String("bm9uZ2NodWFuZzA1NTIwMSU0MHNpbmEuY24="))
運行上述代碼,就會獲取到您的郵箱地址,格式如:"nongchuang055201%40sina.cn"
其中的@,被替換為了%40所以您用@傳入,得到的總不是它的真正的值。
2、注意看這個過程,如果遇到返回4049,那么說明需要輸入驗證碼。
4049,2070分別是需要驗證碼,驗證碼輸入錯誤的意思。
3、解密sp,這個參數的解密是相當的有難度啊,查了不少文檔,大致都是老版本的,貌似在幾月份新浪更新了一次sp參數的加密過程,你看他這么用心良苦,我們也要以牙還牙哦。數一數這個sp的位數。
答案是256位的。此處消耗我1分鍾。眼睛要瞎掉了。
各種查資料,基本無答案,沒辦法了,無解了。只有自己寫了。此處消耗5個小時,根據之前同志們的勞動成果,我這里就公開一個webservice吧。免費提供給大家這個sp參數的獲取方法。
要想獲取這個sp,就引用我的webservice吧。但是,還要傳入幾個參數,pwd-您的密碼,還有后面的三個參數,讓我們慢慢道來。
獲取關鍵性的3個參數
1、仔細看看我們之前分析獲得到的這個圖片,第一個黃色關鍵請求。
2、鼠標點擊到它上面,然后看看response里面的是什么東東。有你需要的哦。
3、這些參數都收集全了,那么就可以組合提交服務器了。至於正則的寫法,根據大家的心情,我是這樣寫的。
4、這里需要注意一點,這處的請求,用到了我們之前說到的su參數。
string username = you login name; byte[] b = System.Text.Encoding.Default.GetBytes(username); string su = Convert.ToBase64String(b);
總結一下
su是加密過的,需要處理一下。
2、post http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)
替換其中的postdata的各種參數即可。
返回retcode :0,就代表成功了。