Google翻譯-破解版
阿新 • • 發佈:2018-12-09
直接上程式碼,沒有先後順序,全部匯入就行,將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
}