逆向学习之有道翻译
00 分钟
2022-7-30
2024-6-4
type
status
date
slug
summary
tags
category
icon
password

逆向学习之有道翻译

声明

本人所有逆向、破解及爬虫相关教程均是以纯技术的角度来探讨研究和学习,严禁使用教程中提到的技术去破解、滥用、伤害其他公司及个人的利益,以及将以下内容用于商业或者非法用途。

〇、为啥?

看到聚合翻译的软件,就心想咱要是也想搞一个类似的得咋弄呢?肯定要有几家常用翻译翻译的接口,然后去聚合调用才行。就想先拿有道翻译的接口试试水,并记录一下过程。

一、找到API接口

首先还是要在请求中找到我们要的api,使用的工具就是chrome浏览器开发者工具。
过滤选择下面的 Fetch/XHR 然后随便输入几个字符看看下面的请求
notion image
可以发现每次输入框发生改变都会调用图中圈起的api,在看一下参数和响应内容发现就是我们想要的。

二、观察接口

先看一下接口的详细情况:
  • URL参数:
    • 参数名
      参数值
      猜测的用途
      smartresult
      dict
      固定的
      smartresult
      rule
      固定的
  • Form Data参数:
    • 参数名
      参数值
      猜测的用途
      i
      aaa
      要翻译啥
      from
      AUTO
      从啥语言翻的
      to
      AUTO
      往哪翻的
      smartresult
      dict
      固定的
      client
      fanyideskweb
      固定的
      salt
      16456680560149
      像是时间戳
      sign
      3d4a58570b60a9e4729d84ffc539ec23
      加密字符串
      lts
      1645668056014
      像是时间戳
      bv
      866ddc825824adb95a25e4ff4107f5a0
      加密字符串
      doctype
      json
      固定的
      version
      2.1
      固定的
      keyfrom
      固定的
      action
      FY_BY_REALTlME
      固定的
  • cookies:
    • OUTFOX_SEARCH_USER_ID
      JSESSIONID
      aaaj-vk-PYAZR7X05Wk8x
      OUTFOX_SEARCH_USER_ID_NCOO
      49135154.68687222
      JSESSIONID
      abcQQkpI3SuAO4ybQ-k8x
      DICT_UGC
      be3af0da19b5c5e6aa4e17bd8d90b28a
      _ntes_nnid
      6c20d2b4a1d415e9f66b45f42896a2bb,1645411239529
      SESSION_FROM_COOKIE
      fanyiweb
      YOUDAO_FANYI_SELECTOR
      OFF
      ___rl__test__cookies
      1645668063927
  • 请求头:请求头看着是有很多的,但常用必传的就那么几个如:OriginRefererUser-Agent ,这几个参数大部分是都会验证的,Cookies 是根据情况来传递的
上面列出来了这个请求的参数和参数用途的一些猜想,还有这个参数所携带的cookies。
对于参数来说有些参数就是固定的不能管就行,有些参数是经过计算出来的,要找到对能算法才能模拟。
对于cookies来说可能会有很多,不一定是都需要的,可以根据cookies的时效性,cookies的名称来粗略的判断一下,在通过请求模拟工具如 postmanApifox等进一步的判断一下哪几个cookies才是真正要用到的

三、寻找参数

首先在chrome开发者工具里面找到对应的请求,然后再找到发起这个请求的方法,这里有两个方法可以找到对应的js代码:
  • 通过network的Initiator标签这个查看请求栈
notion image
  • 通过打请求断点的方式,直接切换到 Sources 页面,在 XHR/fech Breakpoints 添加要监听的请求,请求中包括这个字符串就会断掉
notion image
使用以上哪种方法都可以,然后改变输入框中字符串触发断点。观察 Call Stack 找到参数来源
notion image
断点可能会断在发请求的底层,要观察调用栈找到发起请求的业务代码是哪里
notion image
可以发现这里就是发起请求的地方,参数也能对应上,查看加密参数的生成会发现是由一个叫
v.generateSaltSign(n) 的方法生成的,下面看看这个方法里面实现的逻辑就可以了,在打一个断点达到方法处,然后可以单步调试进入进去或直接在 Console 面板输入函数名查看
notion image
函数的逻辑如下:
代码逻辑很简单,就是时间戳、md5加密和随机数之类的一些,直接模拟就好,参数 e 是要翻译的字符串,我们把它转成python的代码看看:
到此为止请求体中的参数全部找到了,我们用python请求一下看看:
让我们看下运行结果:

四、寻找Cookies

结果返回了一个错误,原因呢猜测是 cookies 的问题,可以从请求中复制一个到代码中确认下我们的猜想:
不出所料返回了正确的结果,下一步就是逐步确认下需要的 cookies 是哪几个,上面的cookies一共是三组,可以挨个删除试试,最后得出结果是只需要 OUTFOX_SEARCH_USER_ID 的cookies,接下来就是找到这个cookies设置的地方,一个cookies如果会保存到浏览器中只会有两种方法:
  • JavaScript代码保存
  • 通过请求响应头中的 Set-Cookie
先看看第一种方法:
在浏览器调试页面按快捷键 : Ctrl+Shift+F 全局搜索这个cookies,看看有没有哪里的代码设置这个cookies
notion image
全局搜索后发现只有
cookies的生成,没有
的生成。
然后我们接下来看第二个方法:
先把cookies清空
notion image
再把请求过滤改为
然后清空所有请求,改变输入框内容后观察请求:
notion image
notion image
notion image
可以看到清空cookies后它发起了一个不带目标 cookies
的请求吗,然后同样报错了,再看另一个请求:
notion image
可以看到通过这个请求获取了设置cookies,接下来就是使用同样的方法查看这个请求的参数:
notion image
同样去掉一些固定的参数后只有两个是我们需要模拟的,让我们来找一下相关代码:
notion image
会发现里面的变量
就是带入的参数,
就是获取动态参数的方法,进入t函数内部就看看,找出目标变量:
notion image
观察上面的代码后可以发现:
  • 设置了cookie:___rl__test__cookies 值为当日时间戳
  • 设置变量G 等于 OUTFOX_SEARCH_USER_ID_NCOO 的cookie,如果没有则设置为:
  • 设置了值 _ncoo 等于变量 G
  • 设置了值 _nssn 登录变量 FF 的值为空所有可以不管
  • 设置了值 _ntms 为时间戳 a
所以获取cookies请求的参数已经找到了,先转成python代码:
提示:random.uniform(0, 1)是代替js种的Math.random(), 其作用都是获取0到1之间的浮点数
由于是调用一个请求获取的cookie然后要带入到另一个请求中,所以要两个请求保持同一个会话

五、编写代码

下面是示例代码:
运行结果:
这里我们来分析下响应结果:
  • smartResult:词典的结果
  • translateResult:翻译的结果,有来源和目标
  • type:翻译的类型就是从什么语言翻译到什么语言
会看到翻译完后,界面上面的显示也会由 自动检测语言 改变为返回的内容,只不过是中文的,所以查一下 en2zh-CHS 会不会查到什么对应关系:
notion image
可以看到对应关系是直接写在html中的,取出来就好,然后在对代码做一些小调整:
运行结果:

六、结束

本篇文章呢难度相对不大,但涉及到的知识点还有有一些的:
  • chrome浏览器开发者工具调试方法,如:观察请求、追踪请求代码栈、打请求断点、全局搜索代码、清空cookies等
  • 如何分析js代码
  • 浏览器cookies保存的方式
  • python中保持同一个会话以带入上一个请求中的cookies
上一篇
shell 脚本之安装 PostgreSQL
下一篇
自建IM对比