引言-啥是JS逆向?:
这个问题我在网上搜过,答案大多都似是而非😦,很多都是关于JS加密的释译😨.在这里解释一下,大概就是反JS做的反爬,也就是说,它属于反反爬的一种,但难度又略高于普通的反反爬
1,它JS加密在哪了2,人家加密了,这可咋整-思路3,开干4,源码
1,它加密在哪了
有句话叫你只有知道自己是咋凉的才知道自己要咋搞,那小编先带大家凉一次试试(当然这里的凉指的不是从入门到入土为安😝,而是总结经验痛定思痛),先看一下正常人的脑回路:
(1)导入库:import requests
(2)确定api:url='/translate_o?smartresult=dict&smartresult=rule'
(3)定制请求头:
headers={
'Cookie': 'OUTFOX_SEARCH_USER_ID=79467041@10.108.160.102; JSESSIONID=aaaYcfsIiH6Eq9tgeJY4x; OUTFOX_SEARCH_USER_ID_NCOO=1993965922.0769746; ___rl__test__cookies=1641525568356',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
"Referer": "/"
}
(3)post传参:#参数复制既可,此处略,将参数封装在data的容器里,
a=requests.post(url,headers=headers,params=params)
输出一下:print(a.text)
此时读者是不是感觉好像发现了什么又好像没发现什么.看看输出的是什么?{errorCode:50}
是的😁,人家设JS反爬了,我们并没有得到想要的翻译结果,它设的反爬有个优雅的名称叫JS混淆加密,说白了就是把参数加密一下,让参数一会一变😎,如果你的参数和正确参数对不上,那不好意思,服务器就会识别出你是爬虫,开始针对你,也就是说你复制过来的参数之前能用现在可能就不能用了,复制粘贴的方法变得不靠谱了,就问你现在气不气
2,那咋办呢-思路
针锋相对嘛.人家针对你你也可以针对人家嘛.找到人家变化的规律,那根据参数得到的结果不就能和人家服务器设置的参数对上了吗.我们可以先翻译几次看看,比较出来加密的参数(为了让读者上手实践,这里就不发图片了).果然,经过比较我们发现了几个比较鸡贼的参数,分别salt,sign,lts,知道了问题在哪那剩下的就只有干了呀😜
通过观察我们发现了:
its:当前豪秒单位的时间戳.
salt:当前时间戳加一个随机数
sign:"fanyideskweb" + str(content) + str(salt) + ""结合md5加密所生成的加密值
准备条件都凑齐了,那还等啥, 开干呗
3,开干
获取lts值:time_=str(int(time.time()*1000))
获取salt值:time_salt=time_+str(random.randint(0,10))
定义一个翻译侠为我们翻译:fanyi=input("帅哥美女,别光顾着改bug呀😄,把不会的单词写下来吧:")
获取sign值:a=fanyideskweb" + str(fanyi) + str(salt) + "]BjuETDhU)zqSxf-=B#7m"
sign=hashlib.md5(a.encode()).hexdigest()#进行md5加密生成sign值(在此之前需要先导入hashlib库)
接下来进行post传参:form_data = {
"i": fanyi, # 要被翻译的数据
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": time_salt, # 以毫秒为单位的时间戳 + 随机数字
"sign": sign, # 未知的js加密后的数据
"lts": time_, # 以毫秒为单位的时间戳
"bv": "4abf2733c66fbf953861095a23a839a8",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME",
}
re = requests.post(url,headers=headers,params=form_data)
接下来对请求来的信息的信息进行解析:repons=re.json()#需要先导入json库
res=jsonpath.jsonpath(repons,'$...tgt')[0]#需要先导入jsonpath库
print(res)
为了让代码可循环利用,我们可以将它封装在一个函数里,然后:
while True:
函数名()
4,源码
另外推荐一下小编的存储库,里面有许多优质项目,包括之前讲过的,读者也可参与那个项目的开发,还有就是小编之前讲的爬取小说小编解锁了新玩法哦,想了解的可以点进去看看
项目地址
如果觉得《不会JS逆向还说自己是爬虫人?从负(负基础)开是逆向JS有道翻译》对你有帮助,请点赞、收藏,并留下你的观点哦!