解析新浪微博的登錄過程


如果要想獲取微博中的數據,最重要的第一步就是模擬登錄了,如果登錄都不行,后續的都是扯淡。這里主要分析微博的登陸過程,新浪微博的認證流程:

1、這里在火狐下使用HttpFox工具抓取登陸的數據交互,打開HttpFox,用戶進入weibo.com/login.php登陸頁面,抓取得到數據如下:

image

我們用瀏覽器登陸weibo.com/login.php網頁時,服務器在不斷地跳轉,從不同的位置給客戶端返回所需的資源及稍后登陸所需的數據。我們需要找到對我們登陸所需要的信息,重要的交互記錄如下:

image

選中的部分,從http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.11)&_=1387782049912站點位置GET得到的內容會在Content窗口顯示,格式為Text/html,即:

sinaSSOController.preloginCallBack({"retcode":0,"servertime":1387782050,"pcid":"xd-62049b61eeb94c62c92e4c4d10db7dcb4c7d","nonce":"DF8VR6","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","exectime":0})

servertime、nonce 都是登錄時候需要使用的,用於POST信息的加密。

2、輸入用戶名后,當用戶名輸入框焦點失去的時候,頁面將再次訪問http://login.sina.com.cn/sso/prelogin.php,得到上步中類似的消息:

image

這樣便得到了新的servertime、nonce 等值,稍后用戶登錄時使用的是這些數的最新值。

3、輸入密碼,點擊登陸,頁面POST請求如下:

image

分析向http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)提交的參數POST Data:

entry    weibo
gateway    1
from    
savestate    7
useticket    1
pagerefer    
vsnf    1
su    aG91YW5kbGlob21lJTQwZ21haWwuY29t
service    miniblog
servertime    1387784432
nonce    PH653N
pwencode    rsa2
rsakv    1330428213
sp    04b4568a21646afc2418e86c99958ec09d3cf45c624404a96dd63a4f13a09384148af1b727d046ff17727f307460ff0b90db2a4d6c9d3ad1e1809b4756a002cf93129dcb0480b349dba2439db7874d0f32a7c0770d0f80360f6fa139d4e3f09bb2b50099b329cb2de5d59fdafc199dc7b3b2d731b43c5dd0948149fc6df4d624
encoding    UTF-8
prelt    101
url    http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack
returntype    META

su表示POST的賬號,username經過了BASE64加密;password 經過了三次SHA1 加密, 且其中加入了 servertime 和 nonce 的值來干擾(兩次SHA1加密后, 將結果加上 servertime 和 nonce 的值, 再SHA1算一次),sp為加密后的密碼。

再看服務器的返回值,Type=text/html (NS_BINDING_ABORTED)而Result=(Aborted),Content窗口為:Error loading content (NS_ERROR_DOCUMENT_NOT_CACHED),因為網頁發生了重定向跳轉,原網頁中止,HttpFox沒有捕獲到返回值。通過Python程序可以得到返回值,如下:

<html>
<head>
<title>新浪通行證</title>
<meta http-equiv="refresh" content="0; url=&#39;http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&ssosavestate=1390380654&ticket=ST-MzQ4NzQ5NTYyMA==-1387788654-xd-FED0CAF6BC574B4DE353DF875F9DB6AF&retcode=0&#39;"/>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
</head>
<body bgcolor="#ffffff" text="#000000" link="#0000cc" vlink="#551a8b" alink="#ff0000">
<script>
    function pluginLoaded(wbplugin) {
        try {
            wbplugin && wbplugin.webSigned();
        }catch(e){}
    }
</script>
<object type="application/x-signassist" width="0" height="0">
<param name="onload" value="pluginLoaded(this)" />
</object>
<script type="text/javascript" language="javascript">
location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&ssosavestate=1390380654&ticket=ST-MzQ4NzQ5NTYyMA==-1387788654-xd-FED0CAF6BC574B4DE353DF875F9DB6AF&retcode=0");
 </script>
</body>
</html>

我們關心的返回結果是script部分:

location.replace(http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&ssosavestate=1390380654&ticket=ST-MzQ4NzQ5NTYyMA==-1387788654-xd-FED0CAF6BC574B4DE353DF875F9DB6AF&retcode=0);      

因為,HttpFox檢測到隨后兩步的跳轉網址為:

image

藍色:http://weibo.com/sso/login.php?ssosavestate=1390381500&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%2
6sudaref%3Dweibo.com&ticket=ST-MzQ4NzQ5NTYyMA==-1387789500-xd-710FAD84CC8AF2EE75FE5D197CD76234&retcode=0
這一步上傳url的值即為script部分(這里由於不是同一次登錄,值不同但結構相同),retcode=0表示登陸成功,然后打開url跳轉到下一步。

第二步:http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&sudaref=weibo.com

用戶登陸成功,返回weibo.com的信息到客戶端cookie中,記錄了用戶登陸信息。

4、接下來就是新浪的SSO(Single Sign-on)登陸了,就是在同一個頂級域名下,通過載入頂級域名的Cookie,來實現統一登陸。服務器會自動再次訪問weibo.com(上圖第四行),因為cookie已經寫入,登陸成功服務器返回302,重定向到用戶主頁面。此后再訪問微博中其他人的主頁或使用微博的其他應用,服務器便可以通過cookie來檢測用戶的狀態了。

當然,新浪的登陸方式未來可能發生改動,目前(2013-12-23)大致就是這個過程。

下一篇使用Python實現微博的模擬登陸。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM