我的第一篇文章,写的很详细,这里方便刚接触爬虫帅哥们理解,大家一起加油
前两步为js的逆向分析过程,了解过程的请跳到第三步(源码),最后打包成exe文件
有道翻译网址:在线翻译_有道
第一步:找到有道翻译发送请求的Url地址
老规矩进去界面F12打开浏览器的抓包工具,输入测试值
查看界面源代码发现找不到翻译内容,可以判断请求是aj二次请求或者封装在js文件里。
点击调试工具中点network(网络)选择XHR可以查考到有哪些二次请求,点击Preview能查看到相应的内容。
发现这里面相应的就是我们翻译的内容,然后找到Header,复制好请求的地址
Url请求地址:
url = "https://fanyi.youdao/translate_o?smartresult=dict&smartresult=rule" #有道翻译的请求头
发现是POSt请求,拉到最下面找到需要的参数
虽然有很多,可是我们通过多次输入内容发送请求,通过对比发现以上参数发生变化的只有salt,sign,lts这三个
只要找到salt,sign,lts加密过程再用post方式发送请求就好了。
第二步:找以上参数的加密过程
有道翻译为post请求 且有salt,sign,lts三个随机变量 其他data中的为固定值,所以找到这三个变量的加密过程即可
这里是:找三个变量的生成途径
打开搜索,搜索salt,打上断点
可以在8389行发现salt是进行md5加密过后的字段
打上断点运行后:
发现e为输入内容,i为js时间戳加上一个0-9的随机整数,变量sign分析完毕
sign=fanyideskweb" + 输入的内容(e) + i(时间戳) + "Tbh5E8=q6U3EXe+&L[4c@ 再后用md5加密
lts:时间戳 通过前面多次输入发生请求内容时,发现its就是时间戳
salt:时间戳加0-随机整数
以上三个变量都解析完毕,md5加密可以在有道翻译的js文件里面保存加密过程,再通过python的第三方execjs库去执行js文件 ,也可以直接调用hashlib 进行md5加密
搜索md5即可找到加密过程在8209行,通过发条调试js,找到所缺的函数内容后,直接写入js文件,再用execjs读取即可
第三步:用python语言改写调用接口
附代码:我这里是直接调用第三方库加密,以下代码复制粘贴可直接运行,缺失的库直接添加即可
import requests #获取url请求
# import execjs #node模板 用来执行js文件
import random #随机数
import time #用来生成python模式的时间戳
import hashlib #md5加密模板可以直接对"fanyideskweb" + 输入的内容 + i + "Tbh5E8=q6U3EXe+&L[4c@" 加密得到salt
'''有道翻译为post请求 且有salt,sign,lts三个随机变量 其他data中的为固定值,所以找到这三个变量的加密过程即可
lts:时间戳
sign:fanyideskweb" + 输入的内容(e) + i(时间戳) + "Tbh5E8=q6U3EXe+&L[4c@ 再后用md5加密
salt:时间戳加0-随机整数
以上三个都为字符类型
'''
if __name__ == '__main__':
while True:
print('-------------------有道翻译-------------------')
e = input('请输入需要翻译的文字:').strip()
if len(e) and e!="" :
rsum = str(int(random.random()*10)) #生成(0,9)的随机整数并转换成字符型
r = str(int(time.time() * 1000)) #生成python模式下的时间戳
i = r+rsum #构造data中的salt变量 !!!!完成了salt变量的加密:时间py时间戳乘1000即js时间加上0-9的随机整数
# node = execjs.get()
# ctx = nodepile(open('./youdao.js',encoding='utf-8').read())
# funcName = "getSign('{0}','{1}')".format(e,i) #调用有道翻译的加密语法得到sign
# sign = ctx.eval(funcName) #fanyideskweb" + 输入的内容就是e + i + "Tbh5E8=q6U3EXe+&L[4c@" 加密得到sign
url = "https://fanyi.youdao/translate_o?smartresult=dict&smartresult=rule" #有道翻译的请求头
Header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36',
'Referer':'https://fanyi.youdao/',
'Cookie':'OUTFOX_SEARCH_USER_ID_NCOO=1328394085.0392962; OUTFOX_SEARCH_USER_ID="1796778757@10.108.160.18"; JSESSIONID=aaaEK20l8ctLw9SDeioDx; ___rl__test__cookies=1611923654835'
}
start_sign = "fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@"
sign_ = hashlib.md5(start_sign.encode()).hexdigest()
Data = {
'i' : e ,
'from' : 'AUTO',
'to' : 'AUTO',
'smartresult' : 'dict',
'client' : 'fanyideskweb',
'salt' : i, #时间戳加(0,9)随机整数
'sign' : sign_, # "fanyideskweb" + 输入的内容 + i + "Tbh5E8=q6U3EXe+&L[4c@" 在youdaojs文件中进行md5加密;也可以直接用sign_(直接用hashlib模板的md5加密方法)
'lts' : r, #时间戳
'bv' : 'c795a332c678d5063a1ee5eb15253848',
'doctype' : 'json',
'version' : '2.1',
'keyfrom' : 'fanyi.web',
'action' : 'FY_BY_REALTlME'
}
try:#对requests异常处理
# 发送请求,获取响应
rsp = requests.post(url, headers=Header, data=Data)
# print(rsp) #检查接口
except:
print('接口错误,请退出程序!!')
else:
# 打印数据
if len(rsp.json())>1:
# print(Data['i'])
result = rsp.json()
# print(result)
for items in rsp.json()['translateResult']:
for item in items:
print("翻译后:",item['tgt'])
# print("src长度为:", len(item['src']))
else:
print("输入错误请重新输入!!!")
else :
print("输入错误请重新输入!!!")
del e
'''
src为当前语句翻译前的字符串
tgt为翻译后的内容
BUG:
最多只能翻译src的长度为50个字符的内容
Bug:
1.输入多个英文字符事翻译内容显示不完全,而输入多个中文字符翻译内容正确
问题分析:
2 导致的原因src字符长度限制问题被网站辨识爬虫 在请求返回时候限制了翻译字数 src
解决方案:
进aj文件查看src,tgt怎么得出
将input的英文长度>50就 .分割 依次请求后拼接翻译内容(应该没啥用,只能小规模减小错误)
'''
运行结果:
js解析小技巧:搜索可以直接搜索关键字如md5,hash,AES,DES,RSA等加密关键字
大部分网站都运用到时间戳进行加密,看到13位数字的参数值大概率就是时间戳,还有些网站在js加密过程中中进行了as值转换根本搜不到上传的参数,不用慌找加密关键字或者根据调用的函数打断点一个个找(如蜂窝网)
里面各注释也写的很详细了,还有存在的bug也标明,有道翻译爬取到此结束~
第四步:文件打包
转载:python3项目打包成exe可执行程序 - 测试一枝花 - 博客园
打包那一步直接在pycharm的Trminal输入命令:
pyinstaller -F xxx.py(xxx.py,打包的文件名称)
打包成功后到py文件目录里,找到新增的dist文件夹打开就有exe文件了,可以发给其他小伙伴运行
更多推荐
最新Python爬虫有道翻译JS逆向解析详细介绍版,附源码
发布评论