玩轉SmartQQ之登陸

SmartQQ是騰訊新出的一個WebQQ,登陸地址是:http://w.qq.com/,目前以前的WebQQ能夠繼續使用,登陸地址:http://web2.qq.com/webqq.html,SmartQQ相比以前的WebQQ要簡單清爽不少,並且手機端能夠直接訪問,應該是騰訊爲了在移動端作的一個調整,今天我把SmartQQ的登陸過程給你們分析下。
對於Http協議,若是你們還不熟悉的,能夠去找相關資料學習下,如今咱們直奔主題。
對於Http數據包的抓取和分析,我用的是firebug自帶的,固然其餘的相似工具(fiddler,httpwatch,http analyzer)等均可以,看本身的喜愛了。
首先截個完整的登陸成功的http協議的圖:
 
 
經過觀察分析,整個登陸過程大體以下:
1.當用戶在下圖中的用戶名中輸入QQ號或者郵箱地址的時候,會觸發一個異步請求:https://ssl.ptlogin2.qq.com/check?uin=34310374&appid=501004106&js_ver=10046&js_type=0
 
這個請求的意思是檢測當前輸入的帳號是否須要用驗證碼來登陸,其中u這個參數是用戶名,上面連接中的34310374是個人qq號碼,login_sig是登陸要用到的簽名,每次登陸的簽名都不同的,這個值稍候會說到如何提取到,這些參數是必要的動態參數,其他的參數目前發現是不變的,固然那些參數也能夠提取到,爲了防止這些參數之後會變,我都是經過動態提取的,作到萬無一失。
檢測是否須要驗證碼的參數提取
先看看載入http://w.qq.com的時候會作哪些事情,查看源代碼,裏面最有用的一句是:
 
 
iframe的src是具體的登陸地址,經過iframe的src,咱們能夠獲取到appid(騰訊的每一個web產品都有惟一的appid),login_state是登陸狀態,10表示在線,默認是在線。
繼續看看src地址的源代碼,發如今源代碼裏面有一段這樣的腳本:
 
//參數只能爲數字的
var g_version=encodeURIComponent("201309220930");
var g_pt_version=encodeURIComponent("10047");//發佈版本號
var g_qtarget=encodeURIComponent("-1");
var isLoadVC = false;
var g_appid =encodeURIComponent("501004106");
var g_uin = 0;
var g_domain = encodeURIComponent("qq.com");
var g_target = encodeURIComponent("_self");
var g_https = true;
var g_low_login=encodeURIComponent("0");
var g_login_sig=encodeURIComponent("2mK7RUAmDy6JI3tSvPOs3PkLas*mM6g2bqffMx6dIvs11MiWf8mMDkPhm0UW3htZ"); //安全參數
var g_daid=encodeURIComponent("164");//業務隔離id
var g_regmaster=encodeURIComponent("");//雙登陸態
var g_forget="http://ptlogin2.qq.com/ptui_forgetpwd";

 咱們能夠經過var g_login_sig的值獲得login_sig。css

這裏咱們用到了HttpWebRequest來進行http的模擬請求。(具體這個怎麼用就很少說了,我本身封裝了一個HttpHelper的請求類,在文章的最後我會把這些代碼附上)
請求的結果以下:
ptui_checkVC('0','!XLF','\x00\x00\x00\x00\x02\x0b\x88\xe6');
返回的值有三個,第一個0表示不須要驗證碼,1表示須要驗證碼。當第一個爲0的時候,第二個參數爲驗證碼,第三個參數爲uin,能夠理解爲驗證碼標識吧。
若是須要驗證碼,請求返回的是:
ptui_checkVC('1','dbec74e5b7b14c2479b675c7a1b76f5b8fd594067e8fd183','\x00\x00\x00\x00\x00\x34\x3f\xdf');
這時候,第二個值就沒什麼用了,驗證碼是須要本身輸入的。
 
若是須要驗證碼的時候,咱們要提取驗證碼圖片:
 一樣用到的參數有appid和qq號碼。
 第一次登錄
 
 QQ的登錄有兩步,先看下一次登錄的請求地址:
 
參數解析:
u表示qq號碼或者郵箱地址,p是加密後的密碼,verifycode表示驗證碼,若是前面檢測到須要驗證碼,這個值就是你輸入的驗證碼,不然就是檢測結果的第二個值。login_sig前面咱們之前提取到了。
繼續模擬http請求,若是登錄成功,結果以下:
ptuiCB('0','0','http://ptlogin4.web2.qq.com/check_sig?pttype=1&uin=34310374&service=login&nodirect=0&ptsig=DhJ8N-3qER1eSKmIoHFix*0LcUQN1IqG7XASHP1RzxE_&s_url=
http%3A%2F%2Fw.qq.com%2Fproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&f_url=&ptlang=2052&ptredirect=100&aid=501004106&daid=164&j_later=0&low_login_hour=0&regmaster=0',
'0','登陸成功!', '飛無痕落無聲');
返回的結果的第三個值,是須要繼續302的一個地址
繼續請求這個地址,這個地址主要的做用是賦值cookie和跳轉。
請求完畢後,接着進行第二次登錄。
 
第二次登錄
第二次登錄是一個post請求,請求的參數以下
r= {"ptwebqq":"667ca0404f9256dba6fe58dc9440733cbabcdb813dd5b2b13703b684240447bb","clientid":53999199,"psessionid":"","status":"online"} 
其中ptwebqq是從cookie裏面提取到的,clientid是本身構造的一個8位隨機9位數字
post的請求的結果以下:
{"retcode":0,"result":{"uin":34310374,"cip":2084660302,"index":1075,"port":47529,"status":"online","vfwebqq":"1571c0e077478cad6b3a36c159a1845f391ce90909f155be3022f1
c8742b60f526354e2513105467",
"psessionid":"8368046764001d636f6e6e7365727665725f77656271714031302e3133332e34312e383400003d8800001e
a00162020b88e66d0000000a406771476958665165796d000000281571c0e077478cad6b3a36c159a1845f391ce90909f155be3022f1c8742b60f526354e2513105467",
"user_state":0,"f":0}}
retcode爲0表是登陸成功了,後面的psessionid等參數再後面獲取qq聯繫人和發消息會用到,下篇文章會講到。
至此,SmartQQ登陸完畢,這裏面要主要的到時用HttpWebRequest的時候遇到cookie跨域的時候,某些cookie會訪問不到,必須手動修改cookie的域,這個問題折騰了很多時間,騰訊的cookie是好幾個子域的。
點擊下載代碼,歡迎你們交流和期待下面的文章,that'all。
相關文章
相關標籤/搜索