前言
想找一个翻译接口用来翻译我的一个小项目,国外的翻译工具在中日翻译时效果不好。国内的翻译简单的看了一圈,发现彩云小译不错,嗯,就是它了。
彩云小译提供免费调用额度,新用户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参数
参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 |
---|---|---|---|---|
origin | https://fanyi.caiyunapp.com | Text | 是 | - |
x-authorization | token:qgemv4jr1y38jyq6vhvi | Text | 是 | - |
请求Body参数
{"browser_id":"99e8052ad7ce181e94faf45aa7bd2c7f"}
参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 |
---|---|---|---|---|
browser_id | 32位字符串,小写和数字 | String | 是 | 浏览器标识 |
成功响应示例
{
"rc": 0,
"jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJicm93c2VyX2lkIjoiOTllODA1MmFkN2NlMTgxZTk0ZmFmNDVhYTdiZDJjN2YiLCJpcF9hZGRyZXNzIjoiMTIzLjExNS4xMTYuMjU1IiwidG9rZW4iOiJxZ2VtdjRqcjF5MzhqeXE2dmh2aSIsInZlcnNpb24iOjEsImV4cCI6MTY5MTk4MDQxNH0.Dv9qsGdzIY5XjSMdsa3NPlv5d-APfDrbZd4YDVs1HjM"
}
结余
麻烦的很,这估计还是简单的。还是花点钱吧。
这个请求参数不全,可能,但差不了多少了。其实不用研究参数,直接请求也是一样的,参数就和写死了一样。
本篇文章仅为技术交流,若有侵害他人行为,请联系:[email protected],确认后将迅速删除。
大佬,好厉害的样子emmm。小白看不懂。摸摸大佬头
可以试试chatgpt翻译,效果可好了
chatgpt 不是也要收费嘛,而且也不方便调用,不过翻译确实好用。
之前写过一个对接 Claude AI的接口,但响应时长感人 ̄﹃ ̄,要惊人的4秒才能完整返回回答。