破解有道翻译js加密,纯小白练手

有道翻译js解析

第一次在csdn上发技术贴,以前都是在印象笔记,主要是最近闲的,太无聊了。
作为开始,想找一个超级简单的,然后循序渐进(比较有仪式感)。
想起来当初学爬虫的时候,看韦世东的《Python 3反爬虫原理与绕过实战》有提到过有道翻译这个案例,算最最初级的。记得当时自己还破了一下失败了,就放弃了!
现在想起来,真想喂自己吃最喜欢的耳巴子。
ok,开始:

目标url

http://fanyi.youdao.com/

查看网页

在这里插入图片描述当你输入的时候自动翻译,估计就是一个自动获取加异步请求。

抓包

打开开发者工具,过滤一下请求,可以很清楚的看到是这个post请求返回的数据,换一个词,重复请求几次,也是我们想要的。
ok,url确定了。

在这里插入图片描述

调试

这边比较重复发送的请求,可以发现只有表单数据不一致,且表单的i, salt,sign,lts数据有变化.
在这里插入图片描述
在这里插入图片描述
变动的数据中我们可以直接看出
i 是输入的字符
lts 是时间戳
salt 是lts后面加了一位数
sign 暂时未知

那既然 i 是输入的字符,那直接把这个字符改成需要的,重发就好了,试试看。
复制curl到postman上,修改i,重新请求,发现返回的不是想要的json,那说明其他三个变动的参数也需要改,不能沿用复制过来的。

在这里插入图片描述

我们就先从sign开始,需要找到他是怎么生成的。
全文查找一下,发现一个可疑的一处
在这里插入图片描述
点进去,在所在行打上断点。
在这里插入图片描述

刷新一下,发现已经断在我们需要的位置了,看到这里其实我就不想写下去了,感觉low了,但是想着写都写了,凑数量吧!(我当时学的时候为什么解析不出来?耳巴子奉上)

在这里可以看到生成代码,三个参数一目了然。
在这里插入图片描述
提出来就大概意思如下:

# lts: 当前的时间戳
lts ='' + (new Date).getTime() 

# salt: 当前的时间戳 加上 一个随机数
salt = r + parseInt(10 * Math.random(), 10) 

# sign: 输入的字符,加分析处理的salt,和另外两个字符通过md5加密生成的
sign = n.md5('fanyideskweb' + e + i + 'Tbh5E8=q6U3EXe+&L[4c@')

Python模拟请求

所有参数生成过程已知,解析完毕。
因为这个网站的加密比较简单,也不需要扣js运行,直接用Python生成就好

lts = str(int(round(time.time() * 1000)))
print(lts)

salt = lts + str(int(np.random.random() * 10))
print(salt)

client = payload.get("client") + payload.get("i") + salt + 'Tbh5E8=q6U3EXe+&L[4c@'
sign = hashlib.md5(client.encode(encoding='UTF-8')).hexdigest()
print(sign)

重新请求,发现成功获取到想要的数据了。
在这里插入图片描述
做爬虫时间也不短了,其他还好,但在js逆向这块感觉还是挺难的。
以后没事更新一篇逆向分析,js混淆相关的帖子,也算让给自己加加餐,免得天天躺尸。

本人比较懒,就直接postman生成了,全部代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import hashlib
import numpy as np
import time

t = time.time()

url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:86.0) Gecko/20100101 Firefox/86.0',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'X-Requested-With': 'XMLHttpRequest',
    'Origin': 'http://fanyi.youdao.com',
    'Connection': 'keep-alive',
    'Referer': 'http://fanyi.youdao.com/',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=1015613889@112.65.124.62; UM_distinctid=177d76febd41f0-06d8a2243cf94b8-445a68-13c680-177d76febd54f5; YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID_NCOO=716731006.2986639; SESSION_FROM_COOKIE=www.baidu.com; JSESSIONID=aaavWlNzyVXcxaa16BxFx; ___rl__test__cookies=1614246732786',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache'
}

payload = {"i": "想我了吗",
           "from": "AUTO",
           "to": "AUTO",
           "smartresult": "dict",
           "client": "fanyideskweb",
           "bv": "abf85f8020851128b561472c8a7b924d",
           "doctype": "json",
           "version": "2.1",
           "keyfrom": "fanyi.web",
           "action": "FY_BY_CLICKBUTTION"

           }

lts = str(int(round(time.time() * 1000)))
payload["lts"] = lts
print(lts)

salt = lts + str(int(np.random.random() * 10))
payload["salt"] = salt
print(salt)

client = payload.get("client") + payload.get("i") + salt + 'Tbh5E8=q6U3EXe+&L[4c@'
sign = hashlib.md5(client.encode(encoding='UTF-8')).hexdigest()
payload["sign"] = sign
print(sign)

response = requests.request("POST", url, headers=headers, data=payload)

print(response.json())
print(response.json().get("translateResult")[0][0].get("tgt"))

相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页