摘要:可能有的老手覺得我寫得很啰嗦,但其實很多新手可能都不知道這些細節,所以我把我在分析新浪微博模擬登陸的過程全寫了出來。
這篇文章于去年4月發布在我的簡書,現在把它放到這里,主要是為了宣傳自己的分布式微博爬蟲。下面是主要內容,希望能幫到有這個需求的朋友
最近由于需要一直在研究微博的爬蟲,第一步便是模擬登陸,從開始摸索到走通模擬登陸這條路其實還是挺艱難的,需要一定的經驗,為了讓朋友們以后少走點彎路,這里我把我的分析過程和代碼都附上來。
首先,我們先用正常的賬號登陸,具體看會有些什么請求。這里我用的是Http Analyzer抓包(Filders也是一個不錯的選擇)。下面是正常登陸流程的截圖:
接下來我會詳細說明各個過程。
第一步:預登陸。
現在微博、空間等大型網站在輸入用戶名后基本都會做編碼或者加密處理,這里在用戶名輸入框輸入我的賬號,通過抓包工具可以看到服務器會返回一段字符串:
這一步就是預登陸過程,同學們可以自己試試。登陸的時候我們需要用到其中的servertime、nonce、pubkey等字段。當然這個不是我自己猜想的,后面的步驟會做說明。
還有一點,就是預登陸的url:
http://login.sina.com.cn/sso/...
這里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(" ") +" "+ 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:授人以魚不如授人以漁,這是我一直秉承的信念??赡苡械睦鲜钟X得我寫得很啰嗦,但其實很多新手可能都不知道這些細節,所以我把我在分析新浪微博模擬登陸的過程全寫了出來。另外,除了這種方式,本文提到的另外兩種方式也有實現。最暴力的方式需要使用rsa這個第三方庫,具體我在代碼上有詳細注釋,還有一種是使用selenium+phantomjs這種方式,我也在代碼中關鍵地方有注釋,如果想看看具體過程,可以點擊這里(我的個人博客)查看分析過程。
Talk is cheap,show me the code!
最后奉上本文的所有方式的模擬登陸代碼(如果覺得喜歡或者看了對你有幫助,不妨在github上給個star,也歡迎fork)
代碼鏈接:smart_login,歡迎fork和star
看了本文還沒看夠?那么推薦你查看超詳細的Python實現百度云盤模擬登陸,該文會從另外一個角度來談模擬登陸
此外,打一個廣告,如果對如何構建分布式爬蟲或者大規模微博數據采集感興趣的話,可以專注一下我的開源分布式微博爬蟲項目,目前還在快速迭代,單從功能角度來講,抓取部分基本上快實現和測試完了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44363.html
摘要:方法不僅適用于百度云,別的一些比較難以模擬登陸的網站都可以按照這種方式分析。本文要求讀者具有模擬登陸主要是抓包和閱讀代碼和密碼學的基本知識。和模擬登陸微博的分析流程一樣,我們首先要做的是以正常人的流程完整的登錄一遍百度網盤。 這是第二篇從簡書搬運過來的文章(大家別誤會,是我原創的)。因為前一篇文章,我看反響還挺好的,所以把這篇也搬運過來了,其實目的還是為宣傳自己的分布式微博爬蟲(該項目...
摘要:模擬登陸知乎這個知乎的登陸也是坑滿滿,我也給踩了幾個,這個就直接說坑吧,其他的就不多說了。 以下內容僅交流學習,請勿用于非法用途 如果你現在想模擬登陸知乎,會發現 fromdata 是一串加密的字符串 showImg(https://segmentfault.com/img/remote/1460000018245629); 看了之后是不是很痛苦?你是不是就想使用 selenium 來...
摘要:模擬登陸知乎這個知乎的登陸也是坑滿滿,我也給踩了幾個,這個就直接說坑吧,其他的就不多說了。 以下內容僅交流學習,請勿用于非法用途 如果你現在想模擬登陸知乎,會發現 fromdata 是一串加密的字符串 showImg(https://segmentfault.com/img/remote/1460000018245629); 看了之后是不是很痛苦?你是不是就想使用 selenium 來...
摘要:本人長期出售超大量微博數據旅游網站評論數據,并提供各種指定數據爬取服務,。如果用戶傳入偽造的,則新浪微博會返回一個錯誤。 PS:(本人長期出售超大量微博數據、旅游網站評論數據,并提供各種指定數據爬取服務,Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個代碼已經不能用來爬數據了。如果只是為了收集數據可以咨詢我的郵箱,如果是為了學習爬蟲,...
閱讀 1518·2021-11-23 09:51
閱讀 3638·2021-09-26 09:46
閱讀 2124·2021-09-22 10:02
閱讀 1818·2019-08-30 15:56
閱讀 3318·2019-08-30 12:51
閱讀 2224·2019-08-30 11:12
閱讀 2059·2019-08-29 13:23
閱讀 2323·2019-08-29 13:16