超詳細的Python實現新浪微博模擬登錄(小白都能懂)

這篇文章於去年4月發佈在個人簡書,如今把它放到這裏,主要是爲了宣傳本身的分佈式微博爬蟲。下面是主要內容,但願能幫到有這個需求的朋友javascript


最近因爲須要一直在研究微博的爬蟲,第一步即是模擬登錄,從開始摸索到走通模擬登錄這條路其實仍是挺艱難的,須要必定的經驗,爲了讓朋友們之後少走點彎路,這裏我把個人分析過程和代碼都附上來。php

首先,咱們先用正常的帳號登錄,具體看會有些什麼請求。這裏我用的是Http Analyzer抓包(Filders也是一個不錯的選擇)。下面是正常登錄流程的截圖:java

圖一
接下來我會詳細說明各個過程。node

第一步:預登錄。python

如今微博、空間等大型網站在輸入用戶名後基本都會作編碼或者加密處理,這裏在用戶名輸入框輸入個人帳號,經過抓包工具能夠看到服務器會返回一段字符串:git

圖二

這一步就是預登錄過程,同窗們能夠本身試試。登錄的時候咱們須要用到其中的servertime、nonce、pubkey等字段。固然這個不是我本身猜測的,後面的步驟會作說明。github

還有一點,就是預登錄的url:web

http://login.sina.com.cn/sso/...ajax

這裏su的值是本身用戶名通過base64編碼的值。但可能大家會問我是如何知道的呢,待會兒我會講到。通過實測,若是咱們這裏不給su傳參數,其實也是能夠的。爲了最真實的模擬用戶登陸,咱們最好仍是帶上它的值。算法

請看圖一的第一條js請求http://i.sso.sina.com.cn/js/ssologin.js,同窗們能夠點進去看,這個就是前面提到的加密用戶名和密碼等一系列的加密文件了,若是有同窗非要問我是怎麼找到這個加密文件的,我也只有說:反覆抓包,從在瀏覽器輸入weibo.com事後就找js文件請求路徑,而後再用代碼格式化工具打開,挨着一個一個看,在代碼中搜關鍵字,好比這裏咱們能夠搜"nonce"、「servertime」等,就能找到加密文件了。

打開加密文件咱們能夠看到加密用戶名的代碼,在加密js文件中搜索'username',能夠看到有一行代碼爲:

username = sinaSSOEncoder.base64.encode(urlencode(username))

如今咱們能夠直接查找encode方法(代碼太多就不貼上來了),便可查找到對應方法了,爲了驗證咱們的猜測,咱們能夠在webstorm中copy這個encode函數帶上本身的用戶名運行,返回的結果就是su的值,這個值在以後進行post提交的時候也會用到。若是對加密有必定經驗的同窗可能一眼就會看出這個是base64編碼,python中有個base64模塊能夠幹這個事情。咱們再回到圖一,http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)這個地址就是進行post提交數據的地址,下面是我本身提交的數據:

圖三

這裏咱們須要本身構造su(加密後的用戶名),sp(加密後的密碼),servertime,nonce,rsakv等數據,其它數據都不用變。有同窗問我爲哈其它數據不用變?你本身能夠多登錄幾回,看變化的值,那麼那些值就是須要構造的值,其它值就直接拿過來用就好了。這裏的su,servertime,nonce,rsakv都已經拿到了,因此當前須要的就只是sp的值了。咱們仍是按照原來的方法在js文件中查找「sp」,能夠找到requests.sp=password這段代碼,因此咱們就只須要看password怎麼構造的了。經過查找能夠看到關鍵加密代碼:

password = RSAKey.encrypt([me.servertime,me.nonce].join("t") +"n"+ password)

這一段代碼即是加密密碼的代碼,有經驗的同窗一看就知道是用的RSA加密,python中也有相應的rsa加密庫可用。可是咱們假設你們都沒看出來或者不知道python中有rsa這個第三方庫。這時候就要給你們介紹一些個人經驗了,我如今已經知道的有三種模擬登錄方案:

a)最簡單暴力,效率也是最高的,直接把js源碼轉化爲相應的python代碼,模擬加密流程進行加密

b)使用selenium+phantomjs/firefox的方案直接模擬人的操做填寫表單提交數據進行模擬登錄,這種方式最爲簡單,效率稍微低一些。若是有同窗對這種簡單暴力的方式感興趣,能夠到個人github上查看一下源碼

c)比較折中的方案,經過pyv8/pyexecjs等渲染js代碼進行執行,本文主要就是講的這種方式。第一種方式若是是遇到微博調整了登錄加密算法,就必須改加密代碼,第二種方式和第三種方式不存在這個問題。

因爲我用的是Python3,並不支持PyV8,因此我選了和它相似的PyexecJS,這個也能夠直接執行js代碼。我也不是很熟悉Javascript代碼,因此我直接定義了一個函數處理加密密碼,並沒對其加密源代碼修改太多:

function    get_pass(mypass,nonce,servertime,rsakey){

        varRSAKey = newsinaSSOEncoder.RSAKey();

        RSAKey.setPublic(rsakey,"10001");

        password= RSAKey.encrypt([servertime,nonce].join("\t") +"\n"+ mypass)

        return    password

}

這個函數中的東西其實就是copy的加密文件的加密過程代碼。爲了試驗,我直接使用以前本身登錄抓到的nonce、servertime、rsakey等數據,在webstorm中調用這個函數,可是報錯了,提示"navigator is undefined",webstorm 使用的nodejs的運行時環境,而navigator爲瀏覽器的某個屬性,因此運行會出問題。因而我就是用phantomjs來做爲運行時環境.考慮到有同窗不知道phantomjs怎麼使用,這裏我簡要說一下吧。使用windows的同窗先要去phantomjs官網下載它的可執行文件,而後設置環境變量。在命令行輸入"phantomjs some.js"便可執行some.js文件,其實就和在命令行執行python或者java文件同樣,若是不清楚的能夠百度執行命令行執行python的方法,仿照着來就能夠了,再不清楚就問我。使用ubuntu的同窗能夠直接用sudo apt-get install phantomjs,就能夠安裝使用了。我直接把加密的js文件使用phantomjs運行,果真好着呢。緣由是由於phantomjs其實就是一款無ui的瀏覽器,天然支持navigator、window等屬性。而pyexecjs支持使用phantomjs做爲運行時環境,具體用法pyexecjs的git主頁有,我也在代碼中有所體現。

with open('G:/javascript/sinajs.js','r') as f:

        source = f.read()

        phantom = execjs.get('PhantomJS')

        getpass = phantom.compile(source)

        mypass = getpass.call('get_pass',my_pass,nonce,servertime,pubkey)

這段代碼就能夠獲得加密事後的密碼了。

以後,即可以進行post提交,提交地址能夠從抓包工具看到:http://login.sina.com.cn/sso/...

根據經驗,到這裏過程基本就完了。可是微博有點坑啊,這裏還須要有一步,就是圖一所示的相似

http://passport.weibo.com/wbs...

這一步會將請求重定向,返回當前帳號的登錄信息,以下圖:

圖三

那麼問題來了,怎麼獲取上面的請求地址呢。分析上面地址,有ticket字段,這個應該是讓你登錄的憑據,因此這個地址應該是服務端返回的,若是不是,起碼ticket是服務端返回的,因而咱們又使用抓包工具查看在請求這段url以前返回的信息,發現有和上述url吻合的信息:

這段代碼是使用post後回覆的內容,因此能夠直接從中提取出咱們須要的url。而後再使用get方式請求上述的url,它會經歷一次重定向,直接返回登錄信息。這個時候,就表明成功登錄了。

PS:授人以魚不如授人以漁,這是我一直秉承的信念。可能有的老手以爲我寫得很囉嗦,但其實不少新手可能都不知道這些細節,因此我把我在分析新浪微博模擬登錄的過程全寫了出來。另外,除了這種方式,本文提到的另外兩種方式也有實現。最暴力的方式須要使用rsa這個第三方庫,具體我在代碼上有詳細註釋,還有一種是使用selenium+phantomjs這種方式,我也在代碼中關鍵地方有註釋,若是想看看具體過程,能夠點擊這裏(個人我的博客)查看分析過程。

Talk is cheap,show me the code!

最後奉上本文的全部方式的模擬登錄代碼(若是以爲喜歡或者看了對你有幫助,不妨在github上給個star,也歡迎fork)

代碼連接:smart_login,歡迎fork和star

看了本文還沒看夠?那麼推薦你查看超詳細的Python實現百度雲盤模擬登錄,該文會從另一個角度來談模擬登錄

此外,打一個廣告,若是對如何構建分佈式爬蟲或者大規模微博數據採集感興趣的話,能夠專一一下個人開源分佈式微博爬蟲項目,目前還在快速迭代,單從功能角度來說,抓取部分基本上快實現和測試完了。

相關文章
相關標籤/搜索