探究彩云小译接口
柳铃
撰写于 2023年 08月 13 日

前言

本篇文章不会详细给出最终程序,仅分析过程。

想找一个翻译接口用来翻译我的一个小项目,国外的翻译工具在中日翻译时效果不好。国内的翻译简单的看了一圈,发现彩云小译不错,嗯,就是它了。

彩云小译提供免费调用额度,新用户100万字,一个月。emmm,收费。一百万字好像是20块钱,也不贵。官方介绍:https://docs.caiyunapp.com/blog/2018/09/03/lingocloud-api/ 官方也有试用token,但不保证可用性,emm

但它的web页面免费使用,和其它的翻译工具一样。试试看能不能找到相关接口(看着UI界面和产品文档的样子我好像可以试一试)

过程

查找接口

这一步很简单,打开浏览器控制台监听网络,在翻译框输入文字,看看有啥新的请求。甚至不用我去点击翻译按钮,大善人(

很好哇,可以在控制台看到接口地址和返回的数据。这个接口地址和彩云文档里公开的接口地址一毛一样。

其中返回数据里的 target 值就是翻译后的文字,"target":"FTIfoT8=" ,乍一看是base64编码,但解密后是乱码。说明它多半加密过。接下来就得从js文件中翻相关方法了。其余的先不管,先把这个解决掉再说,其余的应该不难。

查找数据加密方法的过程

在控制台里找到这个接口的发起程序,可以看到有一堆哇,按个点进去看看。比如这个名字叫 translate 的就很可疑(其实我找了好久)。

就是先读一下,看看可疑度,可疑的话就打断点看看值。
果然!就是这里, translate。

就在我打的俩断点这里,这个 o 值就是 target 值,然后传给了We()方法。
至于看不懂js代码,我也看不懂,一坨一坨的,眼花缭乱(我是在打开了Windows的放大镜 win键加+/-键)。。。起码得能看懂一点点,然后剩下的就问 GPT AI 吧,很好用。

找一下这个We方法的位置。鼠标放到这个函数上面,会弹出一个窗口,其中Functionunctionlocation就是具体位置。

找到位置,阅读理解,打断点,看不懂的问GPT AI。

一个是加密相关的方法(GPT 说是凯撒密码加密函数),一个是base64解码,没问题了,应该就是它。

加密方法:

function Hh(e) {
    const t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
      , i = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"
      , a = n=>t.indexOf(n)
      , o = n=>a(n) > -1 ? i[a(n)] : n;
    return e.split("").map(o).join("")
}

PHP版本:

function Hh($e) {
    
  function a($n) {
    $t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    return strpos($t, $n);
  }
  
  function o($n) {
    $i = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm";
    if (a($n) !== false) {
      return $i[a($n)];
    }
    return $n;
  }
  
  $chars = str_split($e);
  $mapped = array_map("o", $chars);
  return implode('', $mapped);
}

PHP版本是通过GPT翻译的,我改了改。

让我们试一试解密这个 "target":"FTIfoT8=" ,结果是 SGVsbG8=
正常解码了啊,说明咱的猜测是对的。这个用的加密果然简单。

探究接口

这里使用apiPost,postman英文看不懂。。。

简单探究,这是接口的几个参数,试了一下,基本一个不可缺少。

{
  "source": "反感不反感",
  "trans_type": "auto2en",
  "request_id": "web_fanyi",
  "media": "text",
  "os_type": "web",
  "dict": true,
  "cached": true,
  "replaced": true,
  "style": "formal",
  "detect": true,
  "browser_id": "99e8052ad7ce181e94faf45aa7bd2c7f"
}

然后呢,header头也是有俩必须。

Tip:"X-Authorization": "token gh0nd9ybc4a7mvb2unqi" 像这样,token是写死的。web网页的。

看来说不定还要去翻 js

补充一个快捷键 Ctrl+Shift+F 控制台文件内搜索。

T-Authorization 可难找哇,通过搜索,即可找到位置:


发现值是 p ,在函数 gi 里面。

搜索 gi 函数,看看哪里调用的这个函数:


可以看到,p值啊,又调用了一个函数 Ut(),找Ut()


这个 Ut() 有关参数啊,e。调用的时候可没有。经过阅读理解,发现逻辑是判断,如果e为空,则输出ts值,否则输出e值。很好,找ts值。。。

这里真的没搜到 ts 值的赋值方法,但是通过长时间的探索发现,发现这个 ts 值是通过接口请求得到的(反正值和接口返回值一毛一样)。这个接口信息:

通过网络控制台明显可知,接口 header 头也需要 X-Authorization 值,但可以通过代码发现(打断点,执行函数发现的),这个是写死的,很棒。

还有个browser_id 值,也是必须的,是请求参数。找到位置,发现就是上面第二张图里面的 t 值,在 ei() 函数里。接下来找 ei() 函数在哪调用。


经过测试,这个 n 值就是 browser_id ,通过 Xs.x64hash128(o.join(""), 31); 这个赋值。

继续研究这个给 n 赋值的函数,发现这个 o 变量包含了浏览器的许多信息。咱也看不懂都是啥。


他把这些浏览器信息合并成一个字符串,又去 hash 加密成了一串数字,就是这个 browser_id 值。那这样的话,我是不是就可以随便编一个值。。。长度一样。这里一比一还原太头疼了。

接下来就是对接口进行测试,看看还需要什么东西。还好,没有别的了。T-Authorization 就是接口返回的 jwt 值, browser_id 随机32位。下面看看完善的这个 jwt 接口。

/彩云小译 jwt

彩云小译web端api接口的前置请求

接口状态

已完成

接口URL

https://api.interpreter.caiyunai.com/v1/user/jwt/generate

请求方式

POST

Content-Type

json

请求Header参数

参数名示例值参数类型是否必填参数描述
originhttps://fanyi.caiyunapp.comText-
x-authorizationtoken:qgemv4jr1y38jyq6vhviText-

请求Body参数

{"browser_id":"99e8052ad7ce181e94faf45aa7bd2c7f"}
参数名示例值参数类型是否必填参数描述
browser_id32位字符串,小写和数字String浏览器标识

成功响应示例

{
    "rc": 0,
    "jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJicm93c2VyX2lkIjoiOTllODA1MmFkN2NlMTgxZTk0ZmFmNDVhYTdiZDJjN2YiLCJpcF9hZGRyZXNzIjoiMTIzLjExNS4xMTYuMjU1IiwidG9rZW4iOiJxZ2VtdjRqcjF5MzhqeXE2dmh2aSIsInZlcnNpb24iOjEsImV4cCI6MTY5MTk4MDQxNH0.Dv9qsGdzIY5XjSMdsa3NPlv5d-APfDrbZd4YDVs1HjM"
}

结余

麻烦的很,这估计还是简单的。还是花点钱吧。

这个请求参数不全,可能,但差不了多少了。其实不用研究参数,直接请求也是一样的,参数就和写死了一样。

本篇文章仅为技术交流,若有侵害他人行为,请联系:[email protected],确认后将迅速删除。

探究彩云小译接口

前言

本篇文章不会详细给出最终程序,仅分析过程。

想找一个翻译接口用来翻译我的一个小项目,国外的翻译工具在中日翻译时效果不好。国内的翻译简单的看了一圈,发现彩云小译不错,嗯,就是它了。

彩云小译提供免费调用额度,新用户100万字,一个月。emmm,收费。一百万字好像是20块钱,也不贵。官方介绍:https://docs.caiyunapp.com/blog/2018/09/03/lingocloud-api/ 官方也有试用token,但不保证可用性,emm

但它的web页面免费使用,和其它的翻译工具一样。试试看能不能找到相关接口(看着UI界面和产品文档的样子我好像可以试一试)

过程

查找接口

这一步很简单,打开浏览器控制台监听网络,在翻译框输入文字,看看有啥新的请求。甚至不用我去点击翻译按钮,大善人(

很好哇,可以在控制台看到接口地址和返回的数据。这个接口地址和彩云文档里公开的接口地址一毛一样。

其中返回数据里的 target 值就是翻译后的文字,"target":"FTIfoT8=" ,乍一看是base64编码,但解密后是乱码。说明它多半加密过。接下来就得从js文件中翻相关方法了。其余的先不管,先把这个解决掉再说,其余的应该不难。

查找数据加密方法的过程

在控制台里找到这个接口的发起程序,可以看到有一堆哇,按个点进去看看。比如这个名字叫 translate 的就很可疑(其实我找了好久)。

就是先读一下,看看可疑度,可疑的话就打断点看看值。
果然!就是这里, translate。

就在我打的俩断点这里,这个 o 值就是 target 值,然后传给了We()方法。
至于看不懂js代码,我也看不懂,一坨一坨的,眼花缭乱(我是在打开了Windows的放大镜 win键加+/-键)。。。起码得能看懂一点点,然后剩下的就问 GPT AI 吧,很好用。

找一下这个We方法的位置。鼠标放到这个函数上面,会弹出一个窗口,其中Functionunctionlocation就是具体位置。

找到位置,阅读理解,打断点,看不懂的问GPT AI。

一个是加密相关的方法(GPT 说是凯撒密码加密函数),一个是base64解码,没问题了,应该就是它。

加密方法:

function Hh(e) {
    const t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
      , i = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"
      , a = n=>t.indexOf(n)
      , o = n=>a(n) > -1 ? i[a(n)] : n;
    return e.split("").map(o).join("")
}

PHP版本:

function Hh($e) {
    
  function a($n) {
    $t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    return strpos($t, $n);
  }
  
  function o($n) {
    $i = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm";
    if (a($n) !== false) {
      return $i[a($n)];
    }
    return $n;
  }
  
  $chars = str_split($e);
  $mapped = array_map("o", $chars);
  return implode('', $mapped);
}

PHP版本是通过GPT翻译的,我改了改。

让我们试一试解密这个 "target":"FTIfoT8=" ,结果是 SGVsbG8=
正常解码了啊,说明咱的猜测是对的。这个用的加密果然简单。

探究接口

这里使用apiPost,postman英文看不懂。。。

简单探究,这是接口的几个参数,试了一下,基本一个不可缺少。

{
  "source": "反感不反感",
  "trans_type": "auto2en",
  "request_id": "web_fanyi",
  "media": "text",
  "os_type": "web",
  "dict": true,
  "cached": true,
  "replaced": true,
  "style": "formal",
  "detect": true,
  "browser_id": "99e8052ad7ce181e94faf45aa7bd2c7f"
}

然后呢,header头也是有俩必须。

Tip:"X-Authorization": "token gh0nd9ybc4a7mvb2unqi" 像这样,token是写死的。web网页的。

看来说不定还要去翻 js

补充一个快捷键 Ctrl+Shift+F 控制台文件内搜索。

T-Authorization 可难找哇,通过搜索,即可找到位置:


发现值是 p ,在函数 gi 里面。

搜索 gi 函数,看看哪里调用的这个函数:


可以看到,p值啊,又调用了一个函数 Ut(),找Ut()


这个 Ut() 有关参数啊,e。调用的时候可没有。经过阅读理解,发现逻辑是判断,如果e为空,则输出ts值,否则输出e值。很好,找ts值。。。

这里真的没搜到 ts 值的赋值方法,但是通过长时间的探索发现,发现这个 ts 值是通过接口请求得到的(反正值和接口返回值一毛一样)。这个接口信息:

通过网络控制台明显可知,接口 header 头也需要 X-Authorization 值,但可以通过代码发现(打断点,执行函数发现的),这个是写死的,很棒。

还有个browser_id 值,也是必须的,是请求参数。找到位置,发现就是上面第二张图里面的 t 值,在 ei() 函数里。接下来找 ei() 函数在哪调用。


经过测试,这个 n 值就是 browser_id ,通过 Xs.x64hash128(o.join(""), 31); 这个赋值。

继续研究这个给 n 赋值的函数,发现这个 o 变量包含了浏览器的许多信息。咱也看不懂都是啥。


他把这些浏览器信息合并成一个字符串,又去 hash 加密成了一串数字,就是这个 browser_id 值。那这样的话,我是不是就可以随便编一个值。。。长度一样。这里一比一还原太头疼了。

接下来就是对接口进行测试,看看还需要什么东西。还好,没有别的了。T-Authorization 就是接口返回的 jwt 值, browser_id 随机32位。下面看看完善的这个 jwt 接口。

/彩云小译 jwt

彩云小译web端api接口的前置请求

接口状态

已完成

接口URL

https://api.interpreter.caiyunai.com/v1/user/jwt/generate

请求方式

POST

Content-Type

json

请求Header参数

参数名示例值参数类型是否必填参数描述
originhttps://fanyi.caiyunapp.comText-
x-authorizationtoken:qgemv4jr1y38jyq6vhviText-

请求Body参数

{"browser_id":"99e8052ad7ce181e94faf45aa7bd2c7f"}
参数名示例值参数类型是否必填参数描述
browser_id32位字符串,小写和数字String浏览器标识

成功响应示例

{
    "rc": 0,
    "jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJicm93c2VyX2lkIjoiOTllODA1MmFkN2NlMTgxZTk0ZmFmNDVhYTdiZDJjN2YiLCJpcF9hZGRyZXNzIjoiMTIzLjExNS4xMTYuMjU1IiwidG9rZW4iOiJxZ2VtdjRqcjF5MzhqeXE2dmh2aSIsInZlcnNpb24iOjEsImV4cCI6MTY5MTk4MDQxNH0.Dv9qsGdzIY5XjSMdsa3NPlv5d-APfDrbZd4YDVs1HjM"
}

结余

麻烦的很,这估计还是简单的。还是花点钱吧。

这个请求参数不全,可能,但差不了多少了。其实不用研究参数,直接请求也是一样的,参数就和写死了一样。

本篇文章仅为技术交流,若有侵害他人行为,请联系:[email protected],确认后将迅速删除。


赞 (5)

评论区(4条评论)

我要评论


时光巷陌
LV1
  

JS 逆向,牛逼

回复 1
云云星羽
LV1
  

大佬,好厉害的样子emmm。小白看不懂。摸摸大佬头

回复 2
oniati
LV1
  

可以试试chatgpt翻译,效果可好了

柳铃
博主
   oniati

chatgpt 不是也要收费嘛,而且也不方便调用,不过翻译确实好用。

之前写过一个对接 Claude AI的接口,但响应时长感人 ̄﹃ ̄,要惊人的4秒才能完整返回回答。

回复 0