比较常用谷歌翻译,现在要翻译大量的英文,手工去做太麻烦了。想能不能调用翻译接口实现自动。
在页面上翻译可以看到,谷歌翻译页面就是一个普通的get请求。
其中参数意思非常好懂,sl=en 源语言, tl=zh-CN 翻译的目标语言。除了其中一个tk参数,相当于一个密钥。
随便搜索一下,大神非常多。这里参考一下tk值的算法过程
https://www.52pojie.cn/thread-707169-1-1.html
// a:你要翻译的内容
// uq:tkk的值
function vq(a,uq='422388.3876711001') {
if (null !== uq)
var b = uq;
else {
b = sq('T');
var c = sq('K');
b = [b(), c()];
b = (uq = window[b.join(c())] || "") || ""
}
var d = sq('t');
c = sq('k');
d = [d(), c()];
c = "&" + d.join("") + "=";
d = b.split(".");
b = Number(d[0]) || 0;
for (var e = [], f = 0, g = 0; g < a.length; g++) {
var l = a.charCodeAt(g);
128 > l ? e[f++] = l : (2048 > l ? e[f++] = l >> 6 | 192 : (55296 == (l & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (l = 65536 + ((l & 1023) << 10) + (a.charCodeAt(++g) & 1023),
e[f++] = l >> 18 | 240,
e[f++] = l >> 12 & 63 | 128) : e[f++] = l >> 12 | 224,
e[f++] = l >> 6 & 63 | 128),
e[f++] = l & 63 | 128)
}
a = b;
for (f = 0; f < e.length; f++)
a += e[f],
a = tq(a, "+-a^+6");
a = tq(a, "+-3^+b+-f");
a ^= Number(d[1]) || 0;
0 > a && (a = (a & 2147483647) + 2147483648);
a %= 1000000;
return c + (a.toString() + "." + (a ^ b))
};
/*--------------------------------------------------------------------------------
参数:a 为你要翻译的原文
其他外部函数:
--------------------------------------------------------------------------------*/
function sq(a) {
return function() {
return a
}
}
function tq(a, b) {
for (var c = 0; c < b.length - 2; c += 3) {
var d = b.charAt(c + 2);
d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d);
d = "+" == b.charAt(c + 1) ? a >>> d : a << d;
a = "+" == b.charAt(c) ? a + d & 4294967295 : a ^ d
}
return a
}
上面大概是页面趴下来的js代码段。花了点时间将他转为纯java版本。
public static String getTkt(String a, String uq) {
String b = uq;
String c = "&tk=";
String[] d = null;
if(b.indexOf('.')<0) {
b = "0";
}else {
d = b.split("\\.");
b = d[0];
}
int f = 0;
List<Long> e = new ArrayList<Long>();
for (int g=0; g < a.length(); g++) {
long l = a.charAt(g);
if(128 > l) {
e.add(l);
} else if(2048 > l) {
e.add(l >> 6 | 192);
} else {
if(55296 == (l & 64512) && g + 1 < a.length() && 56320 == (a.charAt(g + 1) & 64512)) {
l = 65536 + ((l & 1023) << 10) + (a.charAt(++g) & 1023);
e.add(l >> 18 | 240);
e.add(l >> 12 & 63 | 128);
} else {
e.add(l >> 12 | 224);
e.add(l >> 6 & 63 | 128);
}
e.add(l & 63 | 128);
}
}
long aa = Long.parseLong(b);
for (f = 0; f < e.size(); f++) {
aa += e.get(f);
aa = tq(aa, "+-a^+6");
}
aa = tq(aa, "+-3^+b+-f");
aa ^= (d==null || d.length<1) ? 0 : Long.parseLong(d[1]);
if(0 > aa) {
aa = (aa & 2147483647l) + 2147483648l;
}
aa %= 1000000;
return c + (Long.toString(aa) + "." + (aa ^ Long.parseLong(b)));
};
public static long tq(long a, String b) {
for (int c = 0; c < b.length() - 2; c += 3) {
char d = b.charAt(c + 2);
long dd = 'a' <= d ? (byte)d - 87 : Integer.parseInt(String.valueOf(d));
dd = '+' == b.charAt(c + 1) ? a >>> dd : a << dd;
a = '+' == b.charAt(c) ? a + dd & 4294967295l : a ^ dd;
}
return a;
}
其中使用到tkk值,是页面上的一个属性,一段时间有效。这里可以定时或者调用时去压面扒取这个属性值。
剩下的就是拼装请求发送请求就完事了。
完成一个jar包,测试返回如下:
担心一段时间内请求过多,不敢太频繁的去调用。
附jar包链接
https://download.youkuaiyun.com/download/qq_35088473/11258947