Python 爬虫:逆向解析 JS 加密技术

1. 获取有道翻译发送请求的 url

url=http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule请求方式是 post 请求。

2. 分析请求的参数

我们通过两次输入需要翻译的内容来比较参数的变化;第一次输入“China”,第二次输入“Wuhan”。

3. 解析加密规则

获取传递加密信息的JSON文件:

url=http://shared.ydstatic.com/fanyi/newweb/v1.0.24/scripts/newweb/fanyi.min.js

打开fanyi.min.js文件,找到加密信息:

解析加密参数 salt,sign,ts:

(1)salt=i;i=r + parseInt(10 * Math.random(), 10);r="" + (new Date).getTime();

解:r 是一个字符串,将“13位int型”的时间戳转换为字符串型;i 是一个字符串,是将“r”与“一个0到9以内的数”拼接。

(2)sign=n.md5("fanyideskweb" + e + i + "Nw(nmmbP%A-r6U3EUn]Aj");e 是输入的参数(翻译的内容);

解:sign 是组合的字符串由 md5 方式加密。

(3)ts=r。

4. 导包

import requests
import hashlib
import time,random

5. 定制请求头

需要加入cookies信息!

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36",
    "Referer": "http://fanyi.youdao.com/",
    "Cookie": "OUTFOX_SEARCH_USER_ID=1081060511@10.108.160.17; OUTFOX_SEARCH_USER_ID_NCOO=1068440291.006373; JSESSIONID=aaasTicdPWYGUedFIEWbx; ___rl__test__cookies=1582466646528"
    }

6. 定义参数

e = input("请输入要翻译的内容:")

ts = "" + str(int(time.time()*1000))
salt = ts + str(random.randint(0,9))
key = "fanyideskweb" + e + str(salt) + "Nw(nmmbP%A-r6U3EUn]Aj"

md = hashlib.md5()
md.update(key.encode("utf-8"))
sign = md.hexdigest()

keywords = {
    "i":e,
    "from":"AUTO",
    "to":"AUTO",
    "smartresult":"dict",
    "client":"fanyideskweb",
    "salt":salt,
    "sign":sign,
    "ts":ts,
    "bv":"5158ae48583349ec7168cd8d4689c03e",
    "doctype":"json",
    "version":"2.1",
    "keyfrom":"fanyi.web",
    "action":"FY_BY_REALTlME"
}

7. 发起请求并返回翻译结果

response = requests.post(url=url,data=form,headers=headers)
res = response.json()
print(res['translateResult'][0][0]['tgt'])

8. 附完整代码

import requests
import hashlib
import time,random,json

# print("输入“q”会退出!")
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
    "Referer": "http://fanyi.youdao.com/",
    "Cookie": "P_INFO=maergaiyun@163.com|1582607187|0|other|00&99|xij&1582607146&other#xij&650100#10#0#0|&0|urs&mail163|maergaiyun@163.com; OUTFOX_SEARCH_USER_ID=993199314@10.108.160.19; JSESSIONID=aaarZ13-IPaJE6wkb96bx; OUTFOX_SEARCH_USER_ID_NCOO=678232608.6743829; ___rl__test__cookies=1582622185412"
}



e = input("请输入要翻译的内容:")

ts = "" + str(int(time.time()*1000))
salt = ts + str(random.randint(0,9))
key = "fanyideskweb" + e + str(salt) + "Nw(nmmbP%A-r6U3EUn]Aj"

md = hashlib.md5()
md.update(key.encode("utf-8"))
sign = md.hexdigest()

keywords = {
    "i":e,
    "from":"AUTO",
    "to":"AUTO",
    "smartresult":"dict",
    "client":"fanyideskweb",
    "salt":salt,
    "sign":sign,
    "ts":ts,
    "bv":"5158ae48583349ec7168cd8d4689c03e",
    "doctype":"json",
    "version":"2.1",
    "keyfrom":"fanyi.web",
    "action":"FY_BY_REALTlME"
}

response = requests.post(url=url, data=keywords, headers=headers)
res = response.json()
print("翻译结果:" + res['translateResult'][0][0]['tgt'])

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值