猿人学题库十四题——js_fuck核心代码加密
1. 首先 进入 浏览器的开发者工具,
查看 网页Network的请求,多点击几次,查看请求的参数变化,可以看到 就俩个参数
-
page: 页数
-
uc: 加密的参数 (每次请求都是不一样的)
POST 请求,返回数据是对应的上的
2. 解析请求参数
想找到请求的JS函数,可以在 请求的Initator栏目里面的找到 js 方法行数
点击跳转进去后,可以看到 [][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![] 这些乱七八糟的 【】 的骚操作,肯定看不懂
把看不懂的【】 东西,复制到 复制到控制台打印,把最后一个 () 去掉就好(这里()结尾是一个 JS的自执行函数),看到的就是 函数本体了
这里可以看到 js 做了什么操作,执行了 window.a 方法,有赋值给了 window.a
这里我们看到 上面的 window.a 函数里面是个 加密的操作 CryptoJS.AES,ECB 模式,
1. 可以用python实现,
2. 也可以直接搬就好了 (JS 调试工具),或 手动扣 JS
AES 加密的参数 是 window.t + '|' + window.num ,window.t 是 上面的时间戳,好实现,
在上面的请求发送的地方,我们可以看到 window.a 就是 请求的 uc 参数,这样就可以模拟实现 us 参数了,
点击下一页可以看到 num为2, window.num 也是等于 num 的,call 函数的参数,后面可以看到 就是当前页面的 页数
到这里就可以知道 俩个参数的由来,可以模拟实现请求的过程了。
3. 撸代码
通过 JS调试工具 直接复制出 加密的 JS 方法,用python调用
1. 扣 JS 代码
下面 我打开 JS 调试工具 演示如下:
# 这里 key 加密的密钥 改成自己的就好
var k = 'wdf2ff*TG@*(F4)*YH)g430HWR(*)' + 'wse';
var key = CryptoJS.enc.Utf8.parse(k);
2. python 代码
# -*- encoding=utf-8 -*-
import requests
import execjs
import time
cookies = {
'__jsl_clearance': '1608261821.430^|0^|clD4VpfqhdaLBWywKWy^%^2FZyfi6d_ec7ca97682d99d81fce6db1bdab965553D',
'Hm_lvt_337e99a01a907a08d00bed4a1a52e35d': '1608000796,1608016679,1608255922,1608624452',
'sessionid': 'cxmtcjx4lmxe707wp40qdi0n9pvc0v51',
'Hm_lpvt_337e99a01a907a08d00bed4a1a52e35d': '1608624789',
}
headers = {
'Proxy-Connection': 'keep-alive',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'http://www.python-spider.com',
'Referer': 'http://www.python-spider.com/challenge/14',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
with open('./JS/AES.js') as f:
Str_code= f.read()
js=execjs.compile(Str_code)
t = int(time.time())
word = str(t)+'|'+'1'
result=js.call('AES_Encrypt',word)
word2=js.call('AES_Decrypt',result)
Count = 0
for i in range(1,101):
t = int(time.time())
word = str(t) + '|' + str(i)
result = js.call('AES_Encrypt', word)
data = {
'page': str(i),
'uc': result
}
response = requests.post('http://www.python-spider.com/api/challenge14', headers=headers,data=data, verify=False)
res = response.json()
print(res)
for data in res['data']:
Count +=int(data['value'])
print('Count -->>',Count)
# 答案 5175137
总结 :
通过 参数加密的方式来进去反爬虫,而我们需要找出网站加密参数的方式和逻辑,然后生成参数携带请求获取正确的数据,这里可能要了解一下加密的知识可以补充一些,多活用根据吧