某道词典最新JS解密(一)(2020年8月)

7 篇文章 0 订阅
2 篇文章 0 订阅

 

絮叨一下

前个爬了boss直聘,感觉这些大网站的反爬总是有办法安排的,不要望而生畏,又想到即将面临毕业,论文是个大问题,便想到一招进行翻译,然后实现将重的功能,于是今个就安排了有道翻译一波。

分析

有道主页

在这里插入图片描述
打开F12进行抓包就会发现

http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule

这个才是真正的请求地址

既然是post请求看一下发送了什么数据
在这里插入图片描述
在这里插入图片描述
然后刷新,输入新的内容对比一下

发现这四个值是变化的,那就需要我们去分析一下js代码,看一下他们是怎么生成的

'salt': ,
'sign': ,
'ts':,
'bv': ,
  • 1
  • 2
  • 3
  • 4

这样在封装进data中发送过去不就ok了吗

开撸

1.查找js

点击:Initiator可以看见请求的js文件有那些
在这里插入图片描述
然后点击@fanyi.min.js:1

进去看一下

在这里插入图片描述

格式化一下

添加断点,也就是找到XHR/fetch Breakpoints 你可以针对某一个请求或者请求的关键字设置断点:
在这里插入图片描述
点一下‘+’输入url即可

然后去点击翻译
在这里插入图片描述
在这里插入图片描述
哦可以可以

在这里插入图片描述
可以点击这里t.translate 然后发现

'salt': ,
'sign': ,
'ts':,
'bv': ,
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
看一下8948行的断点处,发现是由generateSaltSign这个函数生成的

把鼠标放在上面提示这个函数在8368行,点击一下

在这里插入图片描述

没错就是这里了

2.分析js

var 是js 的变量 t,r,i 分别赋值给了ts,bv,salt 几个值 ,sign 是一个字符串加翻译内容加salt

然后分别来看一下他们是怎么生成的

ts:很明显是一个时间戳

bv:鼠标放在navigator.appVersion上发现 bv是ua 的md5 加密值

salt:是在时间戳的基础上加一位随机数

sign:是一个字符串加翻译内容加salt 在加一个字符串

OK 全部分析完毕就可以撸代码了

3. 写代码

import time
time = str(int(time.time()*1000))
# 时间戳 ts
  • 1
  • 2
  • 3
import random
salt = str(time + str(int(random.random()*10)))
# 获取时间戳+随机数 salt
  • 1
  • 2
  • 3
import hashlib
ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'
hashlib_bv = hashlib.md5()
# 获取一个MD5加密的对象
hashlib_bv.update(ua.encode('utf-8'))
# 指定加密的字符串
bv = hashlib_bv.hexdigest()
# 获取加密后的16进制字符串 bv的值
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
import hashlib
sign_data = 'fanyideskweb'+ translation_data + salt + 'mmbP%A-r6U3Nw(n]BjuEU'
# 进行字符串的拼接

hashlib_sign = hashlib.md5()
hashlib_sign.update(sign_data.encode('utf-8'))
sign = hashlib_sign.hexdigest()
# sign 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

有了这些我们伪装一下ua 然后去访问

import requests
import json

translation_data = input("请输入要翻译的内容:")
ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
headers = {
    'User-Agent':ua
}

data = {
    'i': translation_data,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': str(salt),
    'sign': str(sign),
    'ts': str(time),
    'bv': str(bv),
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_CLICKBUTTION'
}

response = requests.post(url,headers=headers,data=data).content.decode()
translation = json.loads(response)

print(translation)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

突然看见

在这里插入图片描述
额 请求失败了

4.封装请求头

再看看headers 加入 Cookie 以及 Referer

于是

headers = {
    'User-Agent':ua,
    'Cookie':'OUTFOX_SEARCH_USER_ID=1120454603@10.108.160.101; JSESSIONID=aaa43DnyRwVqd5dr3eglx; OUTFOX_SEARCH_USER_ID_NCOO=1050084892.1281917; ___rl__test__cookies=1592466058098',
    'Referer': 'http://fanyi.youdao.com/'
}
  • 1
  • 2
  • 3
  • 4
  • 5

然后在请求一下:

在这里插入图片描述

okok 完全可以

5.提取数据

然后进行提取就可以了

print("翻译后:" + translation['translateResult'][0][0]['tgt'])
  • 1

然后在运行一下

在这里插入图片描述完全可以

整合一下代码

6.整合

import requests
import time
import hashlib
import random
import json


translation_data = input("请输入要翻译的内容:")
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'

headers = {
    'User-Agent':ua,
    'Cookie':'OUTFOX_SEARCH_USER_ID=1120454603@10.108.160.101; JSESSIONID=aaa43DnyRwVqd5dr3eglx; OUTFOX_SEARCH_USER_ID_NCOO=1050084892.1281917; ___rl__test__cookies=1592466058098',
    'Referer': 'http://fanyi.youdao.com/'

}

time = str(int(time.time()*1000))
# 获取时间戳

salt = str(time + str(int(random.random()*10)))
# 获取时间戳+随机数

hashlib_bv = hashlib.md5()
# 获取一个MD5加密的对象
hashlib_bv.update(ua.encode('utf-8'))
# 指定加密的字符串
bv = hashlib_bv.hexdigest()
# 获取加密后的16进制字符串

sign_data = 'fanyideskweb'+ translation_data + salt + 'mmbP%A-r6U3Nw(n]BjuEU'
# 进行字符串的拼接

hashlib_sign = hashlib.md5()
hashlib_sign.update(sign_data.encode('utf-8'))
sign = hashlib_sign.hexdigest()

data = {
    'i': translation_data,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': str(salt),
    'sign': str(sign),
    'ts': str(time),
    'bv': str(bv),
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_CLICKBUTTION'
}

response = requests.post(url,headers=headers,data=data).content.decode()
"""
{"translateResult":[[{"tgt":"apple","src":"苹果"}]],"errorCode":0,"type":"zh-CHS2en","smartResult":{"entries":["","[园艺] apple\r\n"],"type":1}}
"""

translation = json.loads(response)

print("翻译后:" + translation['translateResult'][0][0]['tgt'])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值