微博很火啊,開發了一個微博爬蟲應用

有的人 會說 新浪微博 不是API嗎,为什麼還要取單獨開發爬蟲系統呢

如果你用過新浪微博API,你就知道,有着諸多限制,功能少,信息少,信息不全,調用次數限制,重新授權等等 一系列的問題,最主要是返回的信息量少喝調用次數限制,

還有針對IP的.

我們設計這個爬蟲的初衷是新浪微博的所有信息,目前是70%,为什麼不是100%呢,說到底 還是資源問題了.

新浪微博號稱有3億多人,實際上我們發現存在的加上新注冊的大概在2億左右,其他的都是僵尸用戶。

這些後續 再說吧。

這個系統最重要的第一步就是模擬登錄了,如果登錄都不行,後續的都是扯淡.

這個模擬登錄早在2011年3月份就搞定了,到現在,登錄也改過好幾次,主要新浪那邊有變動.

新浪模擬登錄不算很复雜,最麻煩的就是驗證碼了.

要搞清楚這個登錄,必須有些工具 httpfox,httpwatch,Fidder等web抓包工具中的一個。

我這裏用的是httpFox,獲取瀏覽器

1346291888_6147  

weibo.com打開後,你需要找到對你登錄可能產生影響的請求,上面藍色的返回的参數都是我們需要的,貌似 現在我以前又有點不一样了,

sinaSSOController.preloginCallBack({"retcode":0,"servertime":1346291808,"pcid":"ec06b269ce680ef43ce669d56f9abbfd9d43","nonce":"28FKAG","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213"})

servertime nonce 都是登錄時候需要提交的,以及密碼加密,pubkey 是RSAJS 加密的公共密鑰 pcid rsakv post時候需要帶上去

這些返回值你都需要保存下來。

 

現在開始登錄

1346292249_1952  

 

分析提交的参數:

entry=weibo&gateway=1&from=&savestate=7&useticket=1&vsnf=1&ssosimplelogin=1&su=dGVzdCU0MHNpbmEuY29t&service=miniblog&servertime=1346292130&nonce=28FKAG&pwencode=rsa2&rsakv=1330428213&sp=29f86ffc66bbd9ed7d750777a918fdf776211ef8ce4c3d4266111df5e3ad3cd06e2c11c9811a945d245b19eaf51174e70c798735ba5c96bb97220531c4131a6dc5f7207abeb2072401901e3259912b8e2cda3b6e540049b232d72d0693d7bb8db4d8e5d03f2f2b16c0bf11e3c0137150c80d355197b84da510d8c4ca117bbc58&encoding=UTF-8&prelt=264&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&returntype=META

固定的我就不說了,

su账號base64加密 應改都會把

sp是密碼的加密是下面這個方法,至於說 怎麼知道這些加密的,其實也不是很复雜,你需要把這個頁面的JS 下載下來單獨分析,看哪個地方是最終post數據的,再逆向找加密的地方就知道了 SHAEncrypt 就是sha加密了

  protected static string SinaSHA(string pwd, string servertime, string nonce)
        {
            StringBuilder sbl = new StringBuilder();

            string tmppwd = SHAEncrypt(SHAEncrypt(pwd));

            sbl.Append(tmppwd);
            sbl.Append(servertime);
            sbl.Append(nonce);

            return SHAEncrypt(sbl.ToString());
        }


 

servertime,nonce,rsakv,pdid(主要是在需要驗證碼的時候獲取)獲取過的

 

参數都解决了,再看返回值


  <html>
  <head>
  <title>ÐÂÀËͨÐÐÖ¤</title>
  <meta http-equiv="refresh" content="0; url=&#39;http://go.rritw.com/weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3&#39;"/>
  <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
  </head>
  <body bgcolor="#ffffff" text="#000000" link="#0000cc" vlink="#551a8b" alink="#ff0000">
  <script type="text/javascript" language="javascript">
  location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3");
  </script>
  </body>
  </html>

只有當retcode=0的時候 才是登錄成功,其他的都是登錄失敗,

101密碼錯誤

5 也是密碼錯誤

4057 你的账號異常了,需要人工認證下,

4049,2070 是需要驗證碼哦。

這裏是登錄失敗了。如果是登錄成功

<html>
< head>
< title>Sina Member</title>
< meta http-equiv="Content-Type" content="text/html; charset=GBK" />

<script charset="utf-8" src="http://i.sso.sina.com.cn/js/ssologin.js"></script>
< /head>
< body>
Signing in ...
< script>
try{sinaSSOController.setCrossDomainUrlList({"retcode":0,"arrURL":["http:\/\/kandian.com\/logon\/do_crossdomain.php?action=login&savestate=1346897732","http:\/\/login.t.cn\/sinaurl\/sso.json?action=login&uid=你账號的UID"]});}catch(e){}try{sinaSSOController.crossDomainAction('login',function(){location.replace('http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&ssosavestate=1346897732&ticket=ST-MTk3NDEyNjk1NQ==-1346292932-xd-B6F5BF7A5E4438EA368D6116E6FD1622&retcode=0');});}catch(e){}
< /script>
< /body>
< /html>

這個retcode=0的就是登錄成功了.

接下來 就需要提取這裏面的3個URL了,分別請求一遍就OK了

值得注意的是,這一些列都要用同一個CookieContainer

 

到此,登錄就成功了,接下來看需要驗證碼的.

當你的IP,或者账號 對新浪來說有懷疑的時候,主要是訪問次數過多的問題的,或者你账號異常的情況,需要你輸入驗證碼

找了半天,账號都忘記了,一時找不到 登錄需要驗證碼的账號

如果是需要驗證碼:

 

post時候加個参數就可以了

door=驗證碼

當然你請求驗證碼的時候需要pcid就是上面的那個,同時需要同一個cooki了,

至於驗證碼怎麼解决,我在驗證碼識別中有記錄.

 

這样登錄就都搞定了。

 

 

 


From:CSDN        

 




創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()