简单方法 —调用开源api

这个比较简单四行代码就可以搞定,先放代码:

1 import requests
2 while True:
3 input_data = input('请输入你要翻译的数据:')
4 print(requests.get('http://fanyi.youdao.com/translate',params={'doctype':'json',"type":'AUTO','i':input_data}).json()['translateResult'][0][0]['tgt'])

复杂一丢丢的JS解析

打开有道翻译官网,输入翻译的数据,鼠标右键检查,点击network,再点击翻译,

点第一个数据包,然后点击preview 或者response都能看到翻译结果,证明这个就是我们需要解析的数据包


重新回到headers里,往下拉到form表单:

我们需要分析这些数据的变化及加密方式,
复制一份:

i: 历史
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16035204521008
sign: 7a1413f07087cacc38aed4fac47fd403
lts: 1603520452100
bv: 4abf2733c66fbf953861095a23a839a8
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_CLICKBUTTION

再如法翻译一个数据,复制form表单和上面的比较:

i: 文化
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16035228374568
sign: 62eeb0e657b2d71181d6c87be026bbac
lts: 1603522837456
bv: 4abf2733c66fbf953861095a23a839a8
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_CLICKBUTTION

比较得出,动态变化的数据只有四个:

1. i :即我们要翻译的数据
2. salt : 初步推测是以毫秒为单位的时间戳 + 一个随机数字
3. sign :未知的js加密后的数据
4. lts : 以毫秒为单位的时间戳

下面简单介绍一些常用的加密解密方法

常见的加密方法

MD5加密

MD5 是一种单向加密技术(不可逆向解密)。MD5加密算法简单高效且算出的值长度都是固定的, MD5值具有强抗碰撞,对原文件哪怕只修改一个字符,所计算出的MD5值也会发生很大变化。基于这些特性,MD5在数据校验上发挥有很大作用。

在python3中的使用:

1 import hashlib
2
3 a = 'hello!'
4 b = 'abc'
5 m1 = hashlib.md5(a.encode()).hexdigest()
6 m2 = hashlib.md5(b.encode()).hexdigest()
7 print(m1) #aed978dd6dffef14c3188d28cf0a272d
8 print(m2) #900150983cd24fb0d6963f7d28e17f72

base64加密

base64编码方法简单,但是却并不保险,别人很容易就能获取原始数据,通常是用来对文件进行一种格式化的操作,它是一种双向加密(可以逆向解密).

用法如下:

 1 import base64
2
3 a = '123'
4 b = '123456789'
5
6 # base64加密
7 base_a = base64.b64encode(a.encode()).decode()
8 base_b = base64.b64encode(b.encode()).decode()
9 print(base_a) # MTIz
10 print(base_b) # MTIzNDU2Nzg5
11
12 # base64解密
13 aa = base64.b64decode('MTIz'.encode()).decode()
14 bb = base64.b64decode('MTIzNDU2Nzg5'.encode()).decode()
15 print(aa) # 123
16 print(bb) # 123456789

HAMC 加密

hamc 同样是基于hash算法,与上面两个加密不同的是,hamc加密是以一个密钥和一个消息作为输入,生成一个消息摘要输出,主要用于身份验证。

用法:

1 import hmac,hashlib
2 h = hmac.new(key='key'.encode(),msg='hello'.encode())
3 h.update('world!'.encode())
4 ret = h.hexdigest()
5 print(ret) # 774bd7473ce15ec74c015338cbf2d421

回归正题,目前大概只有一个sign不确定和那个加盐操作是不是加的随机数,接下来我们就需要具体分析网页了:

是四个部分用来做加密的参数

1 . “fanyideskweb”
2 .e : 要被翻译的数据
3 .salt : 毫秒为单位的时间戳 + 随机数字一个
4 . “]BjuETDhU)zqSxf-=B#7m”

至此,所有的参数解密完毕,可以开始编写代码了,具体参考代码如下:

 1 import requests  # 发送网络请求
2 import time # 导入时间戳
3 import random # 需要产生随机数进行加盐
4 import hashlib # 需要用到md5加密
5 import jsonpath # 解析json格式数据
6
7 # 函数的封装>>> 调用函数就能够得到翻译过后的数据
8 def youdao():
9 while True:
10 # 确认目标的url
11 url_ = 'http://fanyi.youdao.com/translate_o'
12 # 设置form表单的参数
13 input_data = input('请输入你要翻译的数据:') # 要被翻译的数据
14
15 time_ = str(int(time.time() * 1000)) # 以毫秒为单位的时间戳
16
17 time_salt = time_ + str(random.randint(0, 10)) # salt加盐操作 以毫秒为单位的时间戳 + 随机数字
18
19 # 拼接字符串进行md5加密,生成sign值
20 a = "fanyideskweb" + input_data + time_salt + "Tbh5E8=q6U3EXe+&L[4c@"
21 sign = hashlib.md5(a.encode()).hexdigest()
22
23 # 设置请求头 用户代理, referer跳转, cookie
24 headers = {
25 'Proxy-Connection': 'keep-alive',
26 'Accept': 'application/json, text/javascript, */*; q=0.01',
27 'X-Requested-With': 'XMLHttpRequest',
28 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
29 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
30 'Origin': 'http://fanyi.youdao.com',
31 'Referer': 'http://fanyi.youdao.com/',
32 'Accept-Language': 'zh-CN,zh;q=0.9',
33 }
34 # cookie设置
35 cookies = {
36 'OUTFOX_SEARCH_USER_ID': '1994915372@10.108.160.100',
37 'OUTFOX_SEARCH_USER_ID_NCOO': '1497055759.2731764',
38 'JSESSIONID': 'aaa3M3QefQXLQe8TkbwEx',
39 '___rl__test__cookies': time_,
40 }
41
42 params = (
43 ('smartresult', ['dict', 'rule']),
44 )
45
46
47 # 发送post请求要携带的表单数据
48 form_data = {
49 "i": input_data, # 要被翻译的数据
50 "from": "AUTO",
51 "to": "AUTO",
52 "smartresult": "dict",
53 "client": "fanyideskweb",
54 "salt": time_salt, # 以毫秒为单位的时间戳 + 随机数字
55 "sign": sign, # 未知的js加密后的数据
56 "lts": time_, # 以毫秒为单位的时间戳
57 "bv": "4abf2733c66fbf953861095a23a839a8",
58 "doctype": "json",
59 "version": "2.1",
60 "keyfrom": "fanyi.web",
61 "action": "FY_BY_REALTlME",
62 }
63 try:
64 # 利用requests发送post请求,得到响应对象
65 response_ =requests.post(url=url_, headers=headers, params=params, cookies=cookies, data=form_data, verify=False)
66
67 # 得到响应对象,数据为json格式数据
68 py_data = response_.json() # 直接转成python数据类型
69
70 # 利用jsonpath解析,得到翻译数据
71 res_ = jsonpath.jsonpath(py_data,'$..tgt')[0]
72
73 print(res_)
74 except:
75 print('请出入正确格式的数据:')
76 continue
77 time.sleep(1) # 降低请求频率 避免被封禁IP
78
79 if __name__ == '__main__':
80 youdao()

有道翻译-JS逆向-api调用的更多相关文章

  1. python爬虫-有道翻译-js加密破解

    有道翻译-js加密破解 这是本地爬取的网址:http://fanyi.youdao.com/ 一.分析请求 我们在页面中输入:水果,翻译后的英文就是:fruit.请求携带的参数有很多,先将参数数据保存 ...

  2. 有道翻译js加密参数分析

    平时在渗透测试过程中,遇到传输的数据被js加密的比较多,这里我以有道翻译为例,来分析一下它的加密参数 前言 这是有道翻译的界面,我们随便输入一个,抓包分析 我们发现返回了一段json的字符串,内容就是 ...

  3. 解决爬虫中遇到的js加密问题之有道登录js逆向解析

    具体实现在github上面(有详细的步骤): https://github.com/WYL-BruceLong/Spider_JS_ReverseParsin

  4. Asp.NET调用有道翻译API

    调用有道API进行翻译,如图: HTML: <%@ Page Language="C#" AutoEventWireup="true" CodeFile= ...

  5. python调用有道翻译api实现翻译

    通过调用有道翻译的api,实现中译英.其他语言译中文 代码: # coding=utf-8 import urllib import urllib2 import json import time i ...

  6. C++调用有道翻译API实现在线翻译之发声篇

    大概半月前写了一篇博文:C++中使用Curl和JsonCpp调用有道翻译API实现在线翻译, 得到大家的热情捧场,有人看了文章说要是能发声不是更好,我觉得说的也是哈,能听到专家的标准发音,那该是多美的 ...

  7. C++中使用Curl和JsonCpp调用有道翻译API实现在线翻译

    使用C++开发一个在线翻译工具,这个想法在我大脑中过了好几遍了,所以就搜了下资料,得知网络上有很多翻译API,这里我选择我平时使用较多的有道翻译API进行在线翻译工具开发的练习.翻译API返回的结果常 ...

  8. tornado框架学习及借用有道翻译api做自动翻译页面

    趁着这几天有时间,就简单的学了一下tornado框架,简单做了个自动翻译的页面 仅为自己学习参考,不作其他用途 文件夹目录结构如下: . ├── server.py ├── static │   └─ ...

  9. 使用python在SAE上搭建一个微信应用,使用有道翻译的api进行在线翻译

    1. 准备,先在使用python一步一步搭建微信公众平台(一)中基本实现自动回复的功能后,接着在有道词典上申请一个key,http://fanyi.youdao.com/openapi?path=da ...

  10. [Python] 使用有道翻译API

    Python 使用youdao (有道翻译)API 想写一个给自己记录背单词状况的软件,需要获取英文单词的中文释义(基本功能).考虑使用有道翻译的API实现获取英文单词的中文释义的方法. 获取API_ ...

随机推荐

  1. Markdown箭头总汇

    Markdown箭头的汇总 普通箭头 \[\uparrow \] $$\uparrow$$ \[\Uparrow \] $$\Uparrow$$ \[\downarrow \] $$\downarro ...

  2. TypeScript 学习笔记 — 看官方文档

    TYPESCRITP OF GEEK NOTE 以后会更新这个完整度,和理解度,目前这个还不够 ts官方推荐使用let来替代 var ts 支持 js语法 声明变量 let temp:string = ...

  3. P1_Day1.学习目标

    目标 能够知道如何创建小程序项目 能够清楚小程序项目的基本组成结构 能够知道小程序页面由几个部分组成 能够知道小程序中常见的组件如何使用 能够知道小程序如何进行协同开发和发布 学习目录 小程序简介 第 ...

  4. Redis 源码解读之 expire 的时机

    Redis 源码解读之 expire 的时机 背景和问题 本文想解决的问题: redis 如何感知并触发 key 过期的? 如何防止大规模的 key 同时过期,导致 redis 主循环阻塞在清理过期 ...

  5. SPA路由实现的基本原理

    1. SPA路由实现的基本原理 前端单页应用实现路由的策略有两种,分别是 基于hash 和 基于 History API 基于hash 通过将一个 URL path 用 # Hash 符号拆分.- 浏 ...

  6. Cobaltstrike —— shellcode分析(一)

    前言 搞iot搞久了,换个方向看看,改改口味. windows 常见结构体 在分析Cobaltstrike-shellcode之前我们得先了解一下windows下一些常见的结构体. X86 Threa ...

  7. 袋鼠云出品!数栈UI 5.0全新体验升级,设计背后的故事

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 前言 数栈作为云原⽣⼀站式⼤数据开发平台,从2016年发布第⼀个版本 ...

  8. 看完这一篇,ShardingSphere-jdbc 实战再也不怕了

    谈到分库分表中间件时,我们自然而然的会想到 ShardingSphere-JDBC . 这篇文章,我们聊聊 ShardingSphere-JDBC 相关知识点,并实战演示一番. 1 ShardingS ...

  9. JAVA-GUI创作学校管理系统

    1.对于学校的管理系统,我们先做一个简单的一个需求分析,我们需要做学生信息管理,教师信息管理,课程的信息管理.我们要根据自己的需求进行数据库的编写. 简单的添加了几个 2.然后我们通过eclipse+ ...

  10. virtualenvwrapper使用命令

    virtualenvwrapper使用命令 创建虚拟环境:mkvirtualenv + test1 查看虚拟环境:lsvirtuslenv 删除虚拟环境:rmvirtualenv + test1 退出 ...