版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24615069/article/details/82692205
直接上代码,没有先后顺序,全部导入就行,将Google.js放在resources/tk/ 里面,注意修改package。
使用方法:
Querier<AbstractTranslator> querierTrans = new Querier<>();
querierTrans.setParams(LANG.EN, LANG.ZH, "把我翻译一下,谢谢");
querierTrans.attach(new GoogleTranslator());
List<String> result = querierTrans.execute();
package cn.luowudi.common.translate.http;
import cn.luowudi.common.translate.lang.LANG;
public interface HttpParams {
public void setFormData(LANG source, String text);
public void setFormData(LANG from, LANG to, String text);
}
package cn.luowudi.common.translate.http;
import cn.luowudi.common.translate.lang.LANG;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public abstract class AbstractHttpAttribute {
public String url;
public Map<String, String> formData;
public Map<LANG, String> langMap;
public CloseableHttpClient httpClient;
public AbstractHttpAttribute(String url) {
this.url = url;
this.formData = new HashMap<>();
this.langMap = new HashMap<>();
this.httpClient = HttpClients.createDefault();
}
public abstract String query() throws Exception;
public abstract String run(LANG source, String text);
public abstract String run(LANG from, LANG to, String text);
public void close(HttpEntity httpEntity, CloseableHttpResponse httpResponse) {
try {
EntityUtils.consume(httpEntity);
if (null != httpResponse) {
httpResponse.close();
}
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void close() {
try {
if (null != httpClient) {
httpClient.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package cn.luowudi.common.translate.lang;
/**
* <p>
* 说明:
* </p>
*
* @author Luo Gaolin
*/
public enum LANG {
ZH, // 中文
EN, // 英语
JP, // 日语
FRA, // 法语
KOR, // 韩语
MS, // 马来语
DE, // 德语
RU, // 俄语
}
package cn.luowudi.common.translate.querier;
import cn.luowudi.common.translate.http.AbstractHttpAttribute;
import cn.luowudi.common.translate.lang.LANG;
import java.util.ArrayList;
import java.util.List;
public final class Querier<T extends AbstractHttpAttribute> {
private LANG from;
private LANG to;
private String text;
private List<T> collection;
public Querier() {
collection = new ArrayList<T>();
}
public List<String> execute() {
List<String> result = new ArrayList<String>();
for (T element : collection) {
if (element.getClass().getName().contains("Translator")) {
result.add(element.run(from, to, text));
} else if (element.getClass().getName().contains("TTS")) {
result.add(element.run(from, text));
}
}
return result;
}
public void setParams(LANG from, LANG to, String text) {
this.from = from;
this.to = to;
this.text = text;
}
public void setParams(LANG source, String text) {
this.from = source;
this.text = text;
}
public void attach(T element) {
collection.add(element);
}
public void detach(T element) {
collection.remove(element);
}
}
package cn.luowudi.common.translate.trans;
import cn.luowudi.common.translate.http.AbstractHttpAttribute;
import cn.luowudi.common.translate.http.HttpParams;
import cn.luowudi.common.translate.lang.LANG;
import java.io.IOException;
public abstract class AbstractTranslator extends AbstractHttpAttribute implements HttpParams {
public AbstractTranslator(String url) {
super(url);
setLangSupport();
}
@Override
public String run(LANG source, String text) {
return null;
}
@Override
public String run(LANG from, LANG to, String text) {
String result = "";
setFormData(from, to, text);
try {
result = parses(query());
} catch (Exception e) {
e.printStackTrace();
}
close();
return result;
}
public abstract void setLangSupport();
@Override
public void setFormData(LANG source, String text) {
}
@Override
public abstract void setFormData(LANG from, LANG to, String text);
@Override
public abstract String query() throws Exception;
public abstract String parses(String text) throws IOException;
}
package cn.luowudi.common.translate.trans.impl;
import cn.luowudi.common.translate.lang.LANG;
import cn.luowudi.common.translate.trans.AbstractTranslator;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.util.EntityUtils;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public final class GoogleTranslator extends AbstractTranslator {
private static final String url = "https://translate.google.cn/translate_a/single";
public GoogleTranslator() {
super(url);
}
@Override
public void setLangSupport() {
langMap.put(LANG.ZH, "zh-CN");
langMap.put(LANG.EN, "en");
langMap.put(LANG.JP, "ja");
langMap.put(LANG.KOR, "ko");
langMap.put(LANG.FRA, "fr");
langMap.put(LANG.RU, "ru");
langMap.put(LANG.DE, "de");
}
@Override
public void setFormData(LANG from, LANG to, String text) {
formData.put("client", "t");
formData.put("sl", langMap.get(from));
formData.put("tl", langMap.get(to));
formData.put("hl", "zh-CN");
formData.put("dt", "at");
formData.put("dt", "bd");
formData.put("dt", "ex");
formData.put("dt", "ld");
formData.put("dt", "md");
formData.put("dt", "qca");
formData.put("dt", "rw");
formData.put("dt", "rm");
formData.put("dt", "ss");
formData.put("dt", "t");
formData.put("ie", "UTF-8");
formData.put("oe", "UTF-8");
formData.put("source", "btn");
formData.put("ssel", "0");
formData.put("tsel", "0");
formData.put("kc", "0");
formData.put("tk", token(text));
formData.put("q", text);
}
@Override
public String query() throws Exception {
URIBuilder uri = new URIBuilder(url);
for (String key : formData.keySet()) {
String value = formData.get(key);
uri.addParameter(key, value);
}
HttpUriRequest request = new HttpGet(uri.toString());
CloseableHttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "utf-8");
EntityUtils.consume(entity);
response.getEntity().getContent().close();
response.close();
return result;
}
@Override
public String parses(String text) throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.readTree(text).get(0).get(0).get(0).toString();
}
private String token(String text) {
String tk = "";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
try {
FileReader reader = new FileReader("./src/main/resources/tk/Google.js");
engine.eval(reader);
if (engine instanceof Invocable) {
Invocable invoke = (Invocable) engine;
tk = String.valueOf(invoke.invokeFunction("token", text));
}
} catch (Exception e) {
e.printStackTrace();
}
return tk;
}
}
Google.js
function token(a) {
var k = "";
var b = 406644;
var b1 = 3293161072;
var jd = ".";
var sb = "+-a^+6";
var Zb = "+-3^+b+-f";
for (var e = [], f = 0, g = 0; g < a.length; g++) {
var m = a.charCodeAt(g);
128 > m ? e[f++] = m: (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023), e[f++] = m >> 18 | 240, e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224, e[f++] = m >> 6 & 63 | 128), e[f++] = m & 63 | 128)
}
a = b;
for (f = 0; f < e.length; f++) a += e[f],
a = RL(a, sb);
a = RL(a, Zb);
a ^= b1 || 0;
0 > a && (a = (a & 2147483647) + 2147483648);
a %= 1E6;
return a.toString() + jd + (a ^ b)
};
function RL(a, b) {
var t = "a";
var Yb = "+";
for (var c = 0; c < b.length - 2; c += 3) {
var d = b.charAt(c + 2),
d = d >= t ? d.charCodeAt(0) - 87 : Number(d),
d = b.charAt(c + 1) == Yb ? a >>> d: a << d;
a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d
}
return a
}