【Python爬虫】有道翻译新旧API接口

🌈据说,看我文章时 关注、点赞、收藏帅哥美女们 心情都会不自觉的好起来。

前言:
🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~
✨个人主页:点我直达,在这里肯定能找到你想要的~
👍专栏介绍:Python爬虫 ,一个专注于分享爬虫技巧与案例的专栏~

想看往期历史文章,可以浏览此博文: 历史文章目录,后续所有文章发布都会同步更新此博文~

人生苦短,我用python

有道翻译新旧API接口

  • 前言
  • 旧API接口
  • 新API接口
  • 新API接口调用的两段JavaScript
  • JavaScript解密函数转Python函数
  • 完整代码(纯Python实现)

前言

自从谷歌翻译用不了之后,一直都在探索其他可用翻译,今天就轮到了我们的 有道翻译。首先来总起评价这个网页的爬虫难度:简单(自从刷了猿人学,这种在我眼中只能被归类为简单了)。

旧API接口

在此之前我也是爬过 有道翻译 的,不过以前是压根没有加密,直接请求就能得到数据,在此放出来:

import requestsdef translate_old(text):url = 'http://fanyi.youdao.com/translate'params = {'i': text,'doctype': 'json'}return requests.get(url, params=params).json()print(translate_old('翻译'))

就拿这个例子执行一下,他返回了:
{'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 1, 'translateResult': [[{'src': '翻译', 'tgt': 'translation'}]]}
,现在来对比一下新的API接口的返回:
{'code': 0, 'dictResult': {'ce': {'word': {'trs': [{'voice': 'translate&type=2', '#text': 'translate', '#tran': '译,翻译;(使)转变,(使)变化;意同,相当于,(把……)解释为;(以易于理解的方式)解释,说明;导致,造成;改编,改写;转换(计算机程序或语言所含的信息);(生)转译(信使RNA中的一组核苷酸);转移,调动,转变;<正式>调换(主教,苏格兰牧师)的教区;<正式>移葬(圣徒遗骸);<文>送(人,尤指活人)进天堂;(物理)平移(主干部分);(数)平移(几何图形);'}, {'voice': 'interpret&type=2', '#text': 'interpret', '#tran': '解释,说明;口译;把……理解为;演绎;'}], 'phone': 'fān yì', 'return-phrase': '翻译'}}}, 'translateResult': [[{'tgt': 'translation', 'src': '翻译', 'srcPronounce': 'fānyì'}]], 'type': 'zh-CHS2en'}
,可见新API的返回相当给力,不管用不用的上,都给你了。
看到别人用着这个,一下子就激发了我征服它的欲望,于是我们开始来爬新API接口吧~

新API接口

打开网页和开发者选项,映入眼帘的是仅仅两个需要攻克的加密部分:
在这里插入图片描述
对比了一下,这个 mysticTime 是请求的时间戳,同步变化的是 sign ,如果此时你 hook 时间:
在这里插入图片描述
然后随便找两个例子翻译一下:
在这里插入图片描述
在这里插入图片描述
你会发现 sign 的值纹丝不动!所以这个 sign 是由时间戳生成无疑了,当然代码也很好找:
在这里插入图片描述
有点多,没事,加个冒号:
在这里插入图片描述
瞬间少了一堆,我们一个个点进去,发现运气真好,第一个就是:
在这里插入图片描述
右击来源中打开,找到这个 sign 打个断点,随便翻译一个就进来了:
在这里插入图片描述
甚至发现他调用的函数就在上方,这是不是太简单了,看不起我呢?
看了一眼 r.a ,默默的获取了它的值:
在这里插入图片描述
这不真巧,用的方法就是 Node 模块 crypto 中的函数:
在这里插入图片描述
同一个 sign 值!简简单单So easy!
然后来看看他的返回值:
在这里插入图片描述
发现他是一长串的加密值,本以为要花一番功夫,然后我瞟了一眼控制台:
在这里插入图片描述
直接把解密入口打印在了控制台!这是得多猖狂才能干的出来,仿佛在跟我说:你过来啊~
都这样了我们怎么也得盘一下它,从控制台点进去:
在这里插入图片描述
打上断点重新给翻译然后点进函数:
在这里插入图片描述
原来仅仅是一段 AES 加密啊,看看他的明文密钥是不是动态的。
刷新几次后,发现他的明文和密文都是固定写死的,也不管他以后会不会变,现在只想 CV 下来。
Node 执行一下:
在这里插入图片描述
成功解密,很好,整个翻译API的解密流程就完毕了,对于整个过程,我几乎只有一个动作:CV (手动滑稽~)
之前在处理 execjs 出现 gbk 编码异常时候看到了,每次请求都会新建一个 os.Popen ,而这个是子进程,会比较耗时,所以我们最终的目标,是用纯Python实现它!

新API接口调用的两段JavaScript

先贴上刚才所使用的两段JavaScript代码。
第一段,生成 sign 参数:

const crypto = require('crypto');
const d = "fanyideskweb", u = "webfanyi", m = "client,mysticTime,product", p = "1.0.0", b = "web", f = "fanyi.web";
function v(e) {return crypto.createHash("md5").update(e.toString()).digest("hex")
}
function h(e, t) {return v(`client=${d}&mysticTime=${e}&product=${u}&key=${t}`)
}
function O(e) {const t = (new Date).getTime();return {sign: h(t, e),client: d,product: u,appVersion: p,vendor: b,pointParam: m,mysticTime: t,keyfrom: f}
}

第二段,解密返回结果:

const crypto = require('crypto');
const o = 'ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl';
const n = 'ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4';
S = (t)=>{const a = Buffer.alloc(16, crypto.createHash('md5').update(o).digest());const r = Buffer.alloc(16, crypto.createHash('md5').update(n).digest());const i = crypto.createDecipheriv("aes-128-cbc", a, r);let s = i.update(t, "base64", "utf-8");return s += i.final("utf-8")
}

JavaScript解密函数转Python函数

先来看第一段,生成 sign 参数,其实就是一个 md5 生成函数,先生成一个时间戳,添加到指定字符串中并用 md5 加密即可:

import hashlib
time_stamp = str(time.time())
data = {'i': text,'from': from_,'to': to,'domain': '0','dictResult': 'true','keyid': 'webfanyi','sign': hashlib.md5(f'client=fanyideskweb&mysticTime={time_stamp}&product=webfanyi&key=fsdsogkndfokasodnaso'.encode('utf-8')).hexdigest(),'client': 'fanyideskweb','product': 'webfanyi','appVersion': '1.0.0','vendor': 'web','pointParam': 'client,mysticTime,product','mysticTime': time_stamp,'keyfrom': 'fanyi.web'
}

对于第二段有 AES 加密的代码来说,也简单,调用专门的库就可以实现:

text = 'XXX'
key_md5 = hashlib.md5('ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl'.encode('utf-8')).digest()
iv_md5 = hashlib.md5('ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4'.encode('utf-8')).digest()
print(unpad(AES.new(key=key_md5, mode=AES.MODE_CBC, iv=iv_md5).decrypt(base64.urlsafe_b64decode(text)), AES.block_size).decode('utf-8'))

这里的 text 就是我们的API返回结果啦。

完整代码(纯Python实现)

import json
import time
import base64
# import execjs
import hashlib
import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpaddef translate_old(text):url = 'http://fanyi.youdao.com/translate'params = {'i': text,'doctype': 'json'}return requests.get(url, params=params).json()session = requests.session()
lastModified = requests.get('https://fanyi.youdao.com/index.html').headers['last-Modified']
_nlmf = int(time.mktime(time.strptime(lastModified, "%a, %d %b %Y %H:%M:%S GMT")))
session.headers = {'Referer': 'https://fanyi.youdao.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
}
session.get(f'https://rlogs.youdao.com/rlog.php?_npid=fanyiweb&_ncat=pageview&_ncoo=935962676.0432019&_nssn=NULL&_nver=1.2.0&_ntms={time.time()}&_nref=&_nurl=https%3A%2F%2Ffanyi.youdao.com%2Findex.html%23%2F&_nres=1920x1080&_nlmf={_nlmf}&_njve=0&_nchr=utf-8&_nfrg=%2F&/=NULL&screen=1920*1080')def decrypt(text):key_md5 = hashlib.md5('ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl'.encode('utf-8')).digest()iv_md5 = hashlib.md5('ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4'.encode('utf-8')).digest()return unpad(AES.new(key=key_md5, mode=AES.MODE_CBC, iv=iv_md5).decrypt(base64.urlsafe_b64decode(text)), AES.block_size).decode('utf-8')def translate(text, from_='auto', to=''):time_stamp = str(time.time())data = {'i': text,'from': from_,'to': to,'domain': '0','dictResult': 'true','keyid': 'webfanyi','sign': hashlib.md5(f'client=fanyideskweb&mysticTime={time_stamp}&product=webfanyi&key=fsdsogkndfokasodnaso'.encode('utf-8')).hexdigest(),'client': 'fanyideskweb','product': 'webfanyi','appVersion': '1.0.0','vendor': 'web','pointParam': 'client,mysticTime,product','mysticTime': time_stamp,'keyfrom': 'fanyi.web'}return json.loads(decrypt(session.post('https://dict.youdao.com/webtranslate', data=data).text))if __name__ == '__main__':word = '我多喜欢你,你知道吗?'print(translate_old(word)['translateResult'][0][0]['tgt'])print(translate(word)['translateResult'][0][0]['tgt'])

至于我这里来为什么要写 lastModified = requests.get('https://fanyi.youdao.com/index.html').headers['last-Modified'] ,就要从我发现 cookie 中必须包含 OUTFOX_SEARCH_USER_ID 这个键值说起,然后我去找了找,发现只有 https://rlogs.youdao.com/rlog.php 这个请求会返回 cookie ,然后发现他的请求中,有个当前毫秒时间戳 _ntms 参数和另外一个不知道桌面生成的 _nlmf 参数,我去查找生成发现他是由 https://shared.ydstatic.com/js/rlog/v1.js 启动的,其中的启动函数:
在这里插入图片描述
从堆栈往上走,发现他是这里面的 lastModified 给的:
在这里插入图片描述
但这个值一直变,而且不是现在的时间戳,我在网址中查看了一下:
在这里插入图片描述
发现有好多的网址的响应头都加了 Last-Modified 参数,不同时间上面还不一样,所以我们也在每次运行前获取一次。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57763.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Translate插件的有道翻译

在plugins下载Translate插件 setting-> Tools->Translation 没有id和密钥就申请注册 登录后 创建应用 创建成功后输入id和密钥 点击鼠标右键即可使用 翻译效果 over

python利用有道词典翻译_Python利用有道词典接口制作即时翻译的工具

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于Python 实用宝典&#xff0c;作者Python 实用宝典 前言 在编程时经常会遇到需要将中文词汇翻译成英文的情况。 比如变量名的定义、取一个合…

如何用python“优雅的”调用有道翻译

文章目录 前言分析分析url分析参数01分析参数02加密分析 模拟请求注意点请求代码执行结果 结语 前言 其实在以前就盯上有道翻译了的&#xff0c;但是由于时间问题一直没有研究(我的骚操作还在后面&#xff0c;记得关注)&#xff0c;本文主要讲解如何用python调用有道翻译&…

Python 调用有道的翻译接口

最近为了熟悉一下 js 用有道翻译练了一下手&#xff0c;写一篇博客记录一下&#xff0c;也希望能对大家有所启迪&#xff0c;不过这些网站更新太快&#xff0c;可能大家尝试的时候会有所不同。 首先来看一下网页 post 过去的数据 大家不难发现&#xff0c;我们翻译的内容是…

使用python打造一个中英互译软件(基于有道翻译)

&#xff08;本博客简洁明了&#xff0c;适合小白入门&#xff09; 首先明确整体构架&#xff1a; 1.爬虫部分 2.界面部分 3.打包 涵盖的库&#xff1a; import urllib.request import urllib.parse import json import tkinter as tk import tkinter.messagebox 先确定爬…

ubuntu最好用的划词翻译词典:有道词典和GoldenDict

目录 1、安装有到词典 2、安装GoldenDict 3、GoldenDict的一些简单配置以及相关bug修改 用惯了Windows下的有道词典&#xff0c;其划词翻译功能用起来令人极其舒适&#xff5e;Ubuntu系统中也有有道词典以及一个类似的类似的软件GoldenDict&#xff0c;下面就分别介绍下这两…

有道翻译接口 破解

有道翻译 API 最近有些任务需要将中文翻译成英文&#xff0c;由于个人英文水平问题&#xff0c;每次都要打开好几个在线翻译网页&#xff0c;一句一句的丢进去&#xff0c;取最佳者为所用&#xff0c;甚是麻烦。 任务完成之后&#xff0c;就稍微研究了一下各个翻译接口&#…

对接有道翻译api中英翻译软件

中译英翻译软件对接了有道翻译API的翻译数据接口&#xff0c;通过数据接口&#xff0c;我们可以获得文本的批量翻译并对我们的译后文本进行内容自动编辑&#xff0c;通过调用有道翻译API数据接口&#xff0c;我们可以在我们的中译英翻译软件中更灵活地对我们的文本进行翻译处理…

百度、阿里、腾讯、有道各平台翻译API申请教程

文章目录 文章推荐 vscode插件 var-translate-en 中翻英转驼峰命名百度翻译申请腾讯翻译申请阿里翻译申请有道翻译申请 文章推荐 vscode插件 var-translate-en 中翻英转驼峰命名 快捷 一键转换为英文&#xff0c;并生成多种命名风格支持多平台翻译服务配置&#xff08;谷歌、腾…

塔望 · ​食界​人物|红牛饮料背后的两个企业家

关注行业&#xff0c;更要关注行业发展背后的人。关注企业&#xff0c;更要关注企业的人格化身——“企业家”。人类在任何领域的创新和进步&#xff0c;都离不开企业家精神。优秀的企业家和企业家精神&#xff0c;是经济社会发展的重要推动力。 本期塔望【​食界​人物】将带…

正则表达式爬取红牛分公司数据

正则表达式还是很好玩的,爬取红牛官网分公司信息 import requests import re import pandas as pd response requests.get(url"http://www.redbull.com.cn/about/branch") company re.findall(<h2>(.*?)</h2>, response.text) add re.findall("…

列表表达式爬取红牛分公司数据

列表达式爬取红牛官网分公司信息 import requests import pandas as pd import bs4 response requests.get("http://www.redbull.com.cn/about/branch") main_page bs4.BeautifulSoup(response.text,"html.parser") company [i.text for i in main_pag…

红牛商标所有者泰国天丝集团将投资逾10亿元深化在华布局

全球红牛品牌及“红牛”商标的创始者和所有者 -- 泰国天丝集团宣布&#xff0c;未来三年将对其在华业务进行一系列投资&#xff0c;总额高达10.6亿人民币。具体包括深化在华合作伙伴战略关系、在中国设立新的代表处、组建国内团队、扩建新的生产基地以及推出集团旗下更多新产品…

从红牛案看商业伦理和社会公义中的众生相

一出与生恩、养恩有关的大戏&#xff0c;正在中国商业界上演。 “儿子”是红牛&#xff0c;一方是在养育红牛的华彬集团&#xff0c;一方是生育红牛的泰国天丝&#xff0c;自2016年以来&#xff0c;双方数次诉讼、数次论战&#xff0c;严重冲击了市场秩序的稳定繁荣。 对于生…

java红牛农场答案_Java面向对象程序设计实验指导与习题解答(21世纪高等学校计算机专业实用规划教材)...

导语 《Java面向对象程序设计实验指导与习题解答》是《Java面向对象程序设计》(作者耿祥义,清华大学出版社出版,2010)的配套实验指导和习题解答,目的是通过一系列实验练习使学生巩固所学的知识。本书由16个实验组成,每个实验由6个主要部分构成。本书由耿祥义、张跃平编著。…

红牛开发板模拟器简要说明_V1.0

文档名称 红牛开发板模拟器简要说明_V1.0 版本 1.0 作者 叶帆 日期 2011-2-27 历史 文档列表 http://www.sky-walker.com.cn/MFRelease/YF_document_list.pdf 1、前言 .NET Micro Framwork 除了简单易于开发外&#xff0c;还有一个比较有用的功能&#xff0c;那就是…

zte android截屏快捷键,中兴红牛V5手机怎么截屏 中兴红牛V5截图技巧图解

中兴红牛V5手机截屏怎么截的呢&#xff0c;对于刚开始用智能机的我来说&#xff0c;是一个不小的尝试&#xff0c;包括我刚知道的候一样&#xff0c;下面由本小编教大家怎么使用中兴红牛手机截屏和截图的技巧。操作步骤如下&#xff1a; 红牛V5怎么截屏 中兴红牛V5截图技巧 [中…

我有故事,你有红牛吗?

前言 不经意留意到CSDN官方的活动1024有奖征文|我和CSDN的故事 &#xff0c;CSDN提供了一个帮助自己成长的平台&#xff0c;所以决定写一篇文章真诚的感谢CSDN&#xff0c;当然了我肯定不会为了那小小的奖品而折腰的&#xff0c;不就是个衣服嘛&#xff0c;不就是个会员嘛&…

AutoGPT保姆级使用教程

1. 介绍 Auto-GPT是一个基于ChatGPT的工具&#xff0c;他能帮你自动完成各种任务&#xff0c;比如写代码、写报告、做调研等等。使用它时&#xff0c;你只需要告诉他要扮演的角色和要实现的目标&#xff0c;然后他就会利用ChatGPT和谷歌搜索等工具&#xff0c;不断“思考”如何…

谷歌高级软件工程师的一天

作者 | Dimitris Leventeas 译者 | 弯月 原文链接&#xff1a;https://dimle.wordpress.com/2022/04/24/my-typical-working-day-as-software-engineer/ 本文为 CSDN 翻译&#xff0c;未经授权&#xff0c;禁止转载 我的工作 我有一个文档&#xff0c;专门记录待完成的任…