最近寫(xiě)一個(gè)小爬蟲(chóng),需要拿到郵箱信息,發(fā)現(xiàn)拿不到,也不是ajax接口。最后查資料發(fā)現(xiàn)是被Cloudflare加密起來(lái)了,有加密肯定有解密。
參考大佬的原話搞起來(lái)就好:
檸之漠然:
這個(gè)解密方式就是從那段 js 代碼轉(zhuǎn)換過(guò)來(lái)的
其中最主要的一句話
for (e = ”, r = ‘0x' + a.substr(0, 2) | 0, n = 2; a.length – n; n += 2) e += ‘%' + (‘0' + (‘0x' + a.substr(n, 2) ^ r).toString(16)).slice( – 2);
前面的 2 位數(shù)字轉(zhuǎn)化成 16 進(jìn)制之后就是秘鑰, 接下來(lái)的每?jī)晌蛔址罔€異或操作之后轉(zhuǎn)成16進(jìn)制, 然后轉(zhuǎn)換成字符
最后將所有解出來(lái)的字符拼成一起, 就得到郵箱 abc@abc.com 了
js 這邊是用 urlencode 的方式
下面是復(fù)現(xiàn)的js解密代碼:
1
2
3
|
function jiemi(val) { for (e = '' , r = '0x' + val.substr(0, 2) | 0, n = 2; val.length - n; n += 2) e += '%' + ( '0' + ( '0x' + val.substr(n, 2) ^ r).toString(16)).slice(-2); return decodeURIComponent(e) } |
然后通過(guò)python調(diào)用js完美搞定:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import execjs def get_js(): # f = open("./../js/my.js", 'r', encoding='utf-8') # 打開(kāi)JS文件 f = open ( "./jiemi.js" , 'r' , encoding = 'utf-8' ) # 打開(kāi)JS文件 line = f.readline() htmlstr = '' while line: htmlstr = htmlstr + line line = f.readline() return htmlstr def get_des_psswd(e): js_str = get_js() ctx = execjs. compile (js_str) #加載JS文件 return (ctx.call( 'jiemi' , e)) #調(diào)用js方法 第一個(gè)參數(shù)是JS的方法名,后面的data和key是js方法的參數(shù) if __name__ = = '__main__' : print (get_des_psswd(e = '30515253705152531e535f5d' )) |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://www.cnblogs.com/zy-mousai/p/13172350.html