摘要:模擬登陸知乎這個(gè)知乎的登陸也是坑滿滿,我也給踩了幾個(gè),這個(gè)就直接說(shuō)坑吧,其他的就不多說(shuō)了。
以下內(nèi)容僅交流學(xué)習(xí),請(qǐng)勿用于非法用途
如果你現(xiàn)在想模擬登陸知乎,會(huì)發(fā)現(xiàn) fromdata 是一串加密的字符串
看了之后是不是很痛苦?你是不是就想使用 selenium 來(lái)模擬登陸?不過(guò)好像知乎對(duì) selenium 也進(jìn)行了相應(yīng)的反爬處理,哈哈。但是我不也想用 selenium,效率太慢了,直接破解 js 才是我最喜歡挑戰(zhàn)的。好,我現(xiàn)在教你如何用 js 硬擼破解,廢話不多說(shuō),直接進(jìn)入正題。
1. 找出signature加密加密位置這個(gè)相對(duì)來(lái)說(shuō)是比較難找的,需要自己對(duì)那些混淆過(guò)的 js 進(jìn)行一遍又一遍的搜尋,有時(shí)候你看到頭皮發(fā)麻也不一定找得到,再加上這個(gè)加密參數(shù)是一堆字符串,連個(gè)鍵都沒(méi)有,搜索的條件都沒(méi)有。這怎么辦呢?我們可以去百度或者谷歌看看前人是怎么搞的。
你直接搜索知乎模擬登陸的話,會(huì)發(fā)現(xiàn)以前的知乎的 fromdata 是鍵值形式的,有以下鍵值對(duì)
順便也可以看看之前的破解思路,看到了上面的 signature 是通過(guò)加密來(lái)的,猜測(cè)知乎應(yīng)該也是對(duì)之前的鍵值加密的 fromdata 進(jìn)行加密的,在控制臺(tái)搜搜 signature 看看有沒(méi)有線索
提示:按下 ctrl + shift + f 可出現(xiàn)搜索框
一搜,果然有,看了看,signature 的加密過(guò)程和以前的還是一樣的,證明我的猜想正確了,說(shuō)明是通過(guò)之前的 fromdata 的鍵值對(duì)進(jìn)行加密成的一堆字符串,現(xiàn)在就看看 signature 是如何加密的。
如果你對(duì)加密有點(diǎn)了解的話,還容易知道通過(guò)上面代碼知道,很容易知道是通過(guò) hmac 加密,哈希算法是 sha1,密鑰為 d1b964811afb40118a12068ff74a12f4,加密數(shù)據(jù)有四個(gè),為 clientId、grantType、timestamp 和 source,這些值都可以在上面通過(guò)調(diào)試出來(lái)的,就不多說(shuō)了,如下
2. 找出fromdata的完整鍵值對(duì)在知道 signature 是如何加密的之后,我們還需要找出完整的 fromdata 先,不過(guò)在上面的調(diào)試中,你會(huì)發(fā)現(xiàn)也有幾個(gè) fromdata 值,但是不全。
這時(shí)候如果我們得繼續(xù)搜索 signature 的話,找了一整天你都會(huì)發(fā)現(xiàn)不到什么線索,這時(shí)候我們可以通過(guò)登陸的 url 進(jìn)行突破,看看 url 是哪個(gè)路徑,然后一段搜。
其登陸url是?https://www.zhihu.com/api/v3/...。那我們可以直接搜?sign_in?試試。搜了發(fā)現(xiàn)和上面的 signature 是在同一個(gè) js 文件上的,感覺(jué)應(yīng)該有戲。
這個(gè)和登陸地址完全匹配,應(yīng)該就是這個(gè)了,可以進(jìn)行調(diào)試一波
這不出來(lái)了,經(jīng)過(guò)多次調(diào)試,發(fā)現(xiàn)大多數(shù)值都是固定的,只有 signature 和 timestamp 不是,其他的就是賬號(hào)密碼之類的,還有個(gè)驗(yàn)證碼 captcha 以及它的類型 lang,signature 上面的已經(jīng)找出來(lái)了,timestamp 很明顯就是時(shí)間戳,其他的就不多說(shuō)了。
現(xiàn)在的 fromdata 已經(jīng)全部找出來(lái)了,我們離加密字符串又近了一步,如果你直接用這個(gè)表單進(jìn)行模擬登陸,會(huì)給你返回下面錯(cuò)誤
Missing argument grant_type
可見我們還得找出這個(gè) fromdata 的加密方法。
3. 找出 fromdata 加密位置如果你是第一次找這個(gè),估計(jì)你得不斷地翻 js,也不一定能找得到,或者你可以根據(jù)下面這個(gè)調(diào)用函數(shù)過(guò)程來(lái)找
會(huì)發(fā)現(xiàn)很多,不過(guò)你懂套路的話都知道加密一般都用到 encrypt 名字之類的,可以直接根據(jù)這個(gè)名字搜
一搜果然有這個(gè),通過(guò)查看你很容易就找到這個(gè)
這個(gè)一通過(guò)調(diào)試,你可以看到,我們的加密字符串出來(lái)了,是不是很激動(dòng),我當(dāng)時(shí)找到了這個(gè)的時(shí)候激動(dòng)不得了。
這個(gè)是加密的字符串
這個(gè)就是我們需要找的
歷盡千辛萬(wàn)苦,終于找出了廬山真面目,激動(dòng)不?先不要激動(dòng)先,這只是加密的位置,后面的才是最難的!
4. 找出 fromdata 加密的所有方法知道位置后,我們可以直接把這個(gè)加密的 js 方法都扣出來(lái),放在一個(gè) html 文件內(nèi)執(zhí)行就好。
在上面找出位置之后,很容易就可以看到這個(gè)完整的一個(gè)的加密方法
按這個(gè)半括號(hào)向上找,你就可以找到一個(gè)完整的加密方法,這個(gè)就是整個(gè) fromdata 的加密方法,挺容易找的,如果覺(jué)得不方便找的,可以先將這個(gè) js 文件里面的代碼復(fù)制下來(lái),然后到 Sublime Text 軟件上找,這個(gè)可以折疊,也比較容易找,找出來(lái)是這樣子
格式化之后有 400 多行,而且全是混淆,難看得一批。
為了看看這個(gè)正確不正確,我們可以把函數(shù)里面的內(nèi)容直接拿出來(lái),就是去掉最外層的函數(shù),然后調(diào)用下面的函數(shù) Q,把我們的 fromdata 傳進(jìn)去
最后將上面的 JavaScript 給弄成一個(gè) html 文件,放在 script 標(biāo)簽內(nèi)即可
格式就和上面一樣,然后直接用瀏覽器上打開這個(gè) html 文件,你會(huì)看到這個(gè)
這個(gè)就是我們一直努力在找的 fromdata 加密字符串。
弄完這個(gè)之后,我們繼續(xù)使用 python 來(lái)操作了,因?yàn)檫@個(gè) 加密的方法格式化之后有 400 多行,實(shí)在太多,也全都是混淆,如果想用 python 來(lái)實(shí)現(xiàn)的話也不是不可能,就是成本太大了,需要的時(shí)間太多了,我們還不如直接使用 python 的 execjs 來(lái)執(zhí)行 JavaScript 代碼直接獲得就可以了,這個(gè)簡(jiǎn)單方便。
(我們除了使用 execjs 來(lái)執(zhí)行,還可以使用 selenium 運(yùn)行這個(gè)html 文件也是可以的,但是我并不想用 selenium 這個(gè)工具,還是喜歡折騰,所以忽略了,想用的可以試試。)
但是這里又會(huì)有一個(gè)問(wèn)題,我們用瀏覽器打開的是為它提供了一個(gè)瀏覽器的運(yùn)行環(huán)境,我們?cè)?python 使用的 execjs 提供的是 node 環(huán)境,兩個(gè)環(huán)境的不一樣,就會(huì)產(chǎn)生不同的效果,下面我們可以選擇使用 webstorm 編輯器來(lái)提供 nodejs 環(huán)境來(lái)進(jìn)行嘗試以下。
5. 在 node 環(huán)境調(diào)試加密代碼你可以拿上面的 JavaScript 代碼在 webstorm 運(yùn)行,你就會(huì)看到
TypeError: __g._encrypt is not a function
所以我們需要調(diào)試,需要把那些在瀏覽器上只有的對(duì)象,比如?window、navigator?之類的對(duì)象給弄掉,從而在 node 上用不用的代碼代替相同的效果即可。
要調(diào)試我們先要找到代碼運(yùn)行的開端,可以很容易找到
可以看到,這里它會(huì)先去判斷有沒(méi)有 window 這個(gè)對(duì)象來(lái)判斷是不是在瀏覽器上面運(yùn)行的,所以我們可以直接把它修改成 true 或者其他表示成 true 的值都可以
再次運(yùn)行,可以看到這個(gè)錯(cuò)誤
ReferenceError: atob is not defined
這個(gè) atob 是將 base64 加密的字符串給解密,在 node 環(huán)境下是沒(méi)有這個(gè)方法的,我們需要使用 Buffer.toString()替代即可。
運(yùn)行之后,還是報(bào)這個(gè)錯(cuò)誤
TypeError: __g._encrypt is not a function
注意:這個(gè)是大坑,估計(jì)一般人每個(gè)一兩天還搞不定,這個(gè)是因?yàn)樯厦娴慕饷艿模巧厦娴牟⒉灰粯樱憧梢栽谏厦娴膬蓚€(gè)函數(shù)加斷點(diǎn),分別在瀏覽器和 node 環(huán)境下運(yùn)行,可以看到解密的數(shù)據(jù)是不一樣的,是因?yàn)樵跒g覽器上的 base64 加密的是 binary 編碼,解密之后也就同樣需要使用 binary 編碼,這個(gè)是我在知乎的資源文件上搜索 atob 這個(gè)方法,然后慢慢查找看到的,當(dāng)時(shí)也差不多心態(tài)崩了,還好堅(jiān)持下來(lái)了。而我在 node 環(huán)境下解密之后使用了默認(rèn)的編碼,所以解密的數(shù)據(jù)出錯(cuò)了。當(dāng)我們加上 binary 編碼之后,再運(yùn)行
這時(shí),錯(cuò)誤不再是上面那個(gè)了,變成了另一個(gè),證明解密正確了,再來(lái)看看下面這個(gè)錯(cuò)誤
execption at 11: ReferenceError: window is not defined
原來(lái)是 window 對(duì)象惹的禍,這個(gè)時(shí)候就需要我們偽造 window 對(duì)象了,至于怎樣偽造呢,我們可以調(diào)試出錯(cuò)的地方,看看它使用了什么方法,就直接使用適合 node 運(yùn)行的相同效果的代碼代替就可以了,經(jīng)過(guò)多次調(diào)試,需要我們偽造 window 和 navigator 這兩個(gè)對(duì)象,下面就是偽造之后的代碼
這個(gè)時(shí)候再運(yùn)行看看。
可以看到成功了,上面的紅色字是一個(gè)提示,關(guān)于 Buffer 的,這個(gè)我們忽略就行,接下來(lái)就可以使用 python 環(huán)境進(jìn)行測(cè)試了。
果然,都出來(lái)了,哈哈,注意需要先安裝 PyExecJS 庫(kù),自行安裝,然后在測(cè)試的時(shí)候記得導(dǎo)入 execjs 即可。現(xiàn)在這個(gè) fromdata 算是大功告成了,接下來(lái)就是登陸驗(yàn)證下我們搞得這個(gè)加密對(duì)不對(duì)了。
6. 模擬登陸知乎這個(gè)知乎的登陸也是坑滿滿,我也給踩了幾個(gè),這個(gè)就直接說(shuō)坑吧,其他的就不多說(shuō)了。
我只是用手機(jī)號(hào)來(lái)登陸的,也可以用郵箱登陸,過(guò)程都差不多的。
1. 請(qǐng)求登陸的網(wǎng)址的請(qǐng)求頭需要帶上這幾個(gè)不帶 content-type 的話,會(huì)給你返回這個(gè)錯(cuò)誤
Missing argument grant_type
不帶 x-zse-83 的話,會(huì)給你返回這個(gè)錯(cuò)誤
請(qǐng)求參數(shù)異常,請(qǐng)升級(jí)客戶端后重試
至于 agent-user 那就更不需要說(shuō)了。
2. 請(qǐng)求順序知乎這個(gè)登陸是首先請(qǐng)求驗(yàn)證碼地址,看需要不需要填寫驗(yàn)證碼,如果需要填就再請(qǐng)求一次,而且還需要再再請(qǐng)求一次查看是否輸入驗(yàn)證碼正確,不正確就重復(fù)上面步驟,當(dāng)不需要填寫驗(yàn)證碼的時(shí)候就可以直接請(qǐng)求登陸網(wǎng)址了。
還有上面的三次請(qǐng)求的驗(yàn)證碼地址的請(qǐng)求方法都是不一樣的,哪種方法自行調(diào)試即可。
3. 驗(yàn)證驗(yàn)證碼在驗(yàn)證驗(yàn)證碼的時(shí)候請(qǐng)求頭的 content-type 不要填寫 值為 multipart/form-data,如果填了請(qǐng)求驗(yàn)證碼的時(shí)候會(huì)給你返回這個(gè)錯(cuò)誤:
{"error":{"message":"Missing argument input_text","code":400}}
它的意思是說(shuō)沒(méi)有帶上驗(yàn)證碼驗(yàn)證,當(dāng)我們?nèi)サ舻倪@個(gè)字段的時(shí)候,就可以驗(yàn)證了。
驗(yàn)證驗(yàn)證碼的時(shí)候請(qǐng)求頭只需要有一個(gè)?user-agent?就可以了
4. 請(qǐng)求的所有階段帶上 cookie知乎這個(gè)有個(gè) cookie 值是驗(yàn)證碼票據(jù),是從第一次請(qǐng)求驗(yàn)證碼地址來(lái)的,就是下面這個(gè)
如果不帶 cookie請(qǐng)求或者請(qǐng)求順序不一樣都有可能給你返回這個(gè)錯(cuò)誤。
{"error":{"message":"缺少驗(yàn)證碼票據(jù)","code":120002,"name":"ERR_CAPSION_TICKET_NOT_FOUND"}}
5.你還想要?沒(méi)有了,坑暫時(shí)只有這么多,最后給你們看下登陸成功的結(jié)果
7. 寫在最后這個(gè)登陸折騰了差不多一周了,實(shí)際來(lái)說(shuō)可能是三周,因?yàn)閺膭傞_始看不懂 js 代碼,就跑去學(xué)了兩周 js,現(xiàn)在總得來(lái)說(shuō) js 也可以說(shuō)上手了,以后或許也會(huì)使用 nodejs 搞點(diǎn)爬蟲,挺好玩的。
至于代碼,暫時(shí)不公布了,如果你一步一步按照我方法來(lái)弄的話估計(jì)也可以,前提的有 js 基礎(chǔ)最好,以后會(huì)公布的,等我再完善先,因?yàn)檫€需要干別的東西。如果有問(wèn)題也可以找我,加我微信 june--98 拉你進(jìn)群討論即可。
折騰這個(gè),掉了不少頭發(fā),但聽說(shuō)分享點(diǎn)贊是生發(fā)之道,所以你們懂的!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/43240.html
摘要:模擬登陸知乎這個(gè)知乎的登陸也是坑滿滿,我也給踩了幾個(gè),這個(gè)就直接說(shuō)坑吧,其他的就不多說(shuō)了。 以下內(nèi)容僅交流學(xué)習(xí),請(qǐng)勿用于非法用途 如果你現(xiàn)在想模擬登陸知乎,會(huì)發(fā)現(xiàn) fromdata 是一串加密的字符串 showImg(https://segmentfault.com/img/remote/1460000018245629); 看了之后是不是很痛苦?你是不是就想使用 selenium 來(lái)...
摘要:可能有的老手覺(jué)得我寫得很啰嗦,但其實(shí)很多新手可能都不知道這些細(xì)節(jié),所以我把我在分析新浪微博模擬登陸的過(guò)程全寫了出來(lái)。 這篇文章于去年4月發(fā)布在我的簡(jiǎn)書,現(xiàn)在把它放到這里,主要是為了宣傳自己的分布式微博爬蟲。下面是主要內(nèi)容,希望能幫到有這個(gè)需求的朋友 最近由于需要一直在研究微博的爬蟲,第一步便是模擬登陸,從開始摸索到走通模擬登陸這條路其實(shí)還是挺艱難的,需要一定的經(jīng)驗(yàn),為了讓朋友們以后少...
摘要:原因?yàn)樯兑獙戇@一篇文章呢主要是群內(nèi)有人在模擬登陸知乎,一直不成功然后我抓包看了下,發(fā)現(xiàn)知乎登陸頁(yè)已經(jīng)改版了,而且難度大大提高了。 原因 為啥要寫這一篇文章呢? (主要是qq群內(nèi)有人在模擬登陸知乎,一直不成功)然后我抓包看了下,發(fā)現(xiàn)知乎登陸頁(yè)已經(jīng)改版了,而且難度大大提高了。 開始抓包 首先內(nèi),還是打開知乎首頁(yè),然后輸入賬號(hào)密碼,登陸(記得輸錯(cuò)密碼) 這樣我們就可以看到請(qǐng)求頭了(請(qǐng)求...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:微信知乎新浪等主流網(wǎng)站的模擬登陸爬取方法摘要微信知乎新浪等主流網(wǎng)站的模擬登陸爬取方法。先說(shuō)說(shuō)很難爬的知乎,假如我們想爬取知乎主頁(yè)的內(nèi)容,就必須要先登陸才能爬,不然看不到這個(gè)界面。圖片描述知乎需要手機(jī)號(hào)才能注冊(cè)登陸。 微信、知乎、新浪等主流網(wǎng)站的模擬登陸爬取方法摘要:微信、知乎、新浪等主流網(wǎng)站的模擬登陸爬取方法。 網(wǎng)絡(luò)上有形形色色的網(wǎng)站,不同類型的網(wǎng)站爬蟲策略不同,難易程度也不一樣。從是...
閱讀 1275·2023-04-25 23:22
閱讀 1675·2023-04-25 20:04
閱讀 2650·2021-11-22 15:24
閱讀 2811·2021-11-11 16:54
閱讀 1891·2019-08-30 14:03
閱讀 1490·2019-08-29 16:35
閱讀 1708·2019-08-26 10:29
閱讀 2670·2019-08-23 18:01