标签归档:Python安全

Python 反编译调用有道翻译(附完整代码)

网易有道翻译是一款非常优秀的产品,他们的神经网络翻译真的挺无敌。无奈有道客户端实在是太难用了,而且在某些具体场景(比如对网站进行批量翻译)无法使用,而有道的云服务又特别的贵,一般人是无法支付得起的。

然而理论上而言,所有看得见的东西都是爬得到的,有道翻译接口也一样。为了祖国未来花朵(咸鱼) 的发展,今天就来给大家介绍一下如何用 Python超简单快速地调用有道翻译得到翻译结果 。此外,本教程仅供学习哦。

如果你懒得看教程,只想要拿到源代码,请关注Python实用宝典公众号并回复:“Python有道接口” 。

1.找到翻译相关接口

打开 fanyi.youdao.com 随便输入一个单词进行翻译,使用开发者工具(空白处右键检查或F12)查看请求数据。

可以看到,请求的接口是:
http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule

开发者工具往下拉,查看Form Data得到请求的body是:

  1. i: 你好
  2. from: AUTO
  3. to: AUTO
  4. smartresult: dict
  5. client: fanyideskweb
  6. salt: 15707931034929
  7. sign: 99d0fc48506346afc40e36d5648cc320
  8. ts: 1570793103492
  9. bv: ca3dedaa9d15daa003dbdaaa991540d1
  10. doctype: json
  11. version: 2.1
  12. keyfrom: fanyi.web
  13. action: FY_BY_REALTlME

2.解析请求body内容

显然,以上body内容中,i 是需要翻译的文本,from是原文语言,to是翻译语言。我们其他的参数只需要设置为一致的即可。现在需要解决这几个参数:salt, sign, bv,ts.

ts从格式上看就知道是时间戳,而且ts和salt内容很接近,且只差了一位,可以合理猜测,salt就是ts+1位随机数。

接下来就差sign和bv,这两个值看起来非常像MD5,不过不确定是什么参数的MD5,因此需要阅读前端源代码。

在performance中录制,重新请求接口,找到翻译接口的前端代码(fanyi.min.js).然后搜索我们的关键词sign或者bv. 使用debug工具查看值的流动。

从这里我们可以知道,bv 即浏览器头部信息MD5的值,我的浏览器头部是这样的: “5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36”

实际上在请求接口的时候随便用什么头部都能过这个校验,只要符合标准就行。

最后一个未知参数是sign. 同样,我们打开debug模式,输入信息,就可以得到其值了。

很显然,sign由n.md5(“fanyideskweb” + e + i + “n%A-rKaT5fb[Gy?;N5@Tj”)组成,而e根据debug显示的结果,就是我们需要翻译的信息,而i就是salt. 因此4个参数我们全部成功反编译!

3. 用Python调用接口进行翻译

我们只需要伪造请求的body,向接口发送post请求即可得到翻译结果。比如,ts是13位时间戳,在Python中可以使用time.time()*1000获得:

ts = str(int(time.time()*1000))

salt是ts+一位随机数,太简单了:

salt = ts + str(random.randint(0, 9))

bv是浏览器User-Agent,需要进行MD5计算,我们新建一个MD5函数,将字符串传入函数获得MD5。

def get_md5(string):
    string = string.encode('utf-8')
    md5 = hashlib.md5(string).hexdigest()
    return md5
bv = get_md5("5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36")

sign是四个字符串组成后进行MD5的结果:

sign = get_md5("fanyideskweb" + context + salt + "n%A-rKaT5fb[Gy?;N5@Tj") 

这样,我们获得了所有需要用到的参数,集合在一起后发送post请求。

试一下效果:

print(translation('你好')) 

成功得到接口返回的翻译结果:

(base) F:\push\20191011>python YouDaoSpider.py
hello 

关注下方的公众号,回复 “Python有道接口“即可获得全部源代码。

文章到此就结束啦,如果你喜欢今天的Python 教程,请持续关注Python实用宝典,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典