欢迎大家进群,一起探讨学习

微信公众号,每天给大家提供技术干货

java对接谷歌翻译
第一种方式
HttpClientUtil
package com.yoostar.translate.v1.util;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
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.net.Proxy;
import java.net.URI;
import java.util.Map;
public class HttpClientUtil {
public static final int SO_TIMEOUT_MS = 8000;
public static final int CONNECTION_TIMEOUT_MS = 1000;
public static String doGet(String url, Map<String, String> param) {
CloseableHttpClient httpclient = HttpClients.createDefault();
String resultString = "";
CloseableHttpResponse response = null;
try {
URIBuilder builder = new URIBuilder(url);
if (param != null) {
for (String key : param.keySet()) {
builder.addParameter(key, (String) param.get(key));
}
}
URI uri = builder.build();
HttpGet httpGet = new HttpGet(uri);
response = httpclient.execute(httpGet);
if (response.getStatusLine().getStatusCode() != 200) {
} else {
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
public static String doGet(String url, Map<String, String> param, Proxy proxy) throws Exception {
CloseableHttpClient httpclient = HttpClients.createDefault();
String resultString = "";
CloseableHttpResponse response = null;
try {
URIBuilder builder = new URIBuilder(url);
if (param != null) {
for (String key : param.keySet()) {
builder.addParameter(key, (String) param.get(key));
}
}
URI uri = builder.build();
HttpGet httpGet = new HttpGet(uri);
httpGet.setConfig(buildRequestConfig(proxy));
response = httpclient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200) {
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
}
} catch (Exception e) {
throw e;
} finally {
try {
if (response != null) {
response.close();
}
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
public static String doGetWithProxy(String url, Proxy proxy) throws Exception {
return doGet(url, null, proxy);
}
public static String doGet(String url) {
return doGet(url, null);
}
public static RequestConfig buildRequestConfig(Proxy proxy) {
String address = proxy.address().toString();
String[] addressArr = address.replace("/", "").split(":");
String ip = addressArr[0].trim();
String host = addressArr[1].trim();
if ((proxy != null) && (!(StringUtils.isBlank(ip))) && (!(StringUtils.isBlank(host)))) {
HttpHost httpHost = new HttpHost(ip, Integer.parseInt(host));
RequestConfig requestConfig = RequestConfig.custom().setProxy(httpHost)
.setSocketTimeout(SO_TIMEOUT_MS)
.setConnectTimeout(CONNECTION_TIMEOUT_MS).build();
return requestConfig;
}
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(SO_TIMEOUT_MS)
.setConnectTimeout(CONNECTION_TIMEOUT_MS).build();
return requestConfig;
}
}
RegularUtil
package com.yoostar.translate.v1.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegularUtil {
public static String extractByStartAndEnd(String str, String startStr, String endStr) {
String regEx = startStr + ".*?" + endStr;
String group = findMatchString(str, regEx);
String trim = group.replace(startStr, "").replace(endStr, "").trim();
return trim(trim);
}
public static String findMatchString(String str, String regEx) {
try {
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(str);
return findFristGroup(matcher);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static String findFristGroup(Matcher matcher) {
matcher.find();
return matcher.group(0);
}
public static String removeAllBlank(String s) {
String result = "";
if (null != s && !"".equals(s)) {
result = s.replaceAll("[ *| *| *|//s*]*", "");
}
return result;
}
public static String trim(String s) {
String result = "";
if (null != s && !"".equals(s)) {
result = s.replaceAll("^[ *| *| *|//s*]*", "").replaceAll("[ *| *| *|//s*]*$", "");
}
return result;
}
}
Browser
package com.yoostar.translate.v1;
import com.yoostar.translate.v1.util.HttpClientUtil;
import lombok.Data;
import java.io.Serializable;
import java.net.InetSocketAddress;
import java.net.Proxy;
@Data
public class Browser implements Serializable {
public Proxy proxy;
public String url;
public void setProxy(String ip, Integer port) {
this.proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ip, port.intValue()));
}
public String executeGet()
throws Exception {
String result;
if (this.proxy != null) {
result = HttpClientUtil.doGetWithProxy(this.url, this.proxy);
} else {
result = HttpClientUtil.doGet(this.url);
}
return result;
}
}
GoogleApi
package com.yoostar.translate.v1;
import com.alibaba.fastjson.JSONArray;
import com.yoostar.translate.v1.util.RegularUtil;
import org.apache.commons.lang3.StringUtils;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URLEncoder;
public class GoogleApi {
private static final String PATH = "/gettk.js";
static ScriptEngine engine = null;
private com.yoostar.translate.v1.Browser browser = null;
static {
ScriptEngineManager maneger = new ScriptEngineManager();
engine = maneger.getEngineByName("javascript");
FileInputStream fileInputStream = null;
Reader scriptReader = null;
try {
scriptReader = new InputStreamReader(GoogleApi.class.getResourceAsStream(PATH), "utf-8");
engine.eval(scriptReader);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (scriptReader != null) {
try {
scriptReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public GoogleApi() {
this.browser = new com.yoostar.translate.v1.Browser();
}
public GoogleApi(String ip, Integer port) {
this.browser = new com.yoostar.translate.v1.Browser();
this.browser.setProxy(ip, port);
}
public String getTKK() throws Exception {
browser.setUrl("https://translate.google.cn/");
try {
String result = browser.executeGet();
if (StringUtils.isNotBlank(result)) {
if (result.indexOf("tkk") > -1) {
String matchString = RegularUtil.findMatchString(result, "tkk:.*?',");
String tkk = matchString.substring(5, matchString.length() - 2);
return tkk;
}
}
} catch (Exception e) {
throw new RuntimeException("获取 tkk 出错");
}
return null;
}
public static String getTK(String word, String tkk) {
String result = null;
try {
if (engine instanceof Invocable) {
Invocable invocable = (Invocable) engine;
result = (String) invocable.invokeFunction("tk", new Object[]{word, tkk});
}
} catch (Exception e) {
throw new RuntimeException("获取 tk 出错");
}
return result;
}
public String translate(String word, String from, String to) throws Exception {
if (StringUtils.isBlank(word)) {
return null;
}
String tkk = getTKK();
if (StringUtils.isBlank(tkk)) {
throw new RuntimeException("无法获取 tkk");
}
String tk = getTK(word, tkk);
try {
word = URLEncoder.encode(word, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
StringBuffer buffer = new StringBuffer("https://translate.google.cn/translate_a/single?client=t");
if (StringUtils.isBlank(from)) {
from = "auto";
}
buffer.append("&sl=" + from);
buffer.append("&tl=" + to);
buffer.append("&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&source=btn&kc=0");
buffer.append("&tk=" + tk);
buffer.append("&q=" + word);
browser.setUrl(buffer.toString());
try {
String result = browser.executeGet();
JSONArray array = (JSONArray) JSONArray.parse(result);
JSONArray rArray = array.getJSONArray(0);
StringBuffer rBuffer = new StringBuffer();
for (int i = 0; i < rArray.size(); i++) {
String r = rArray.getJSONArray(i).getString(0);
if (StringUtils.isNotBlank(r)) {
rBuffer.append(r);
}
}
return rBuffer.toString();
} catch (Exception e) {
throw new RuntimeException("结果集解析出错");
}
}
public String translate(String word, String to) throws Exception {
return translate(word, null, to);
}
}
gettk.js 请把这个文件放resources目录下

var b = function (a, b) {
for (var d = 0; d < b.length - 2; d += 3) {
var c = b.charAt(d + 2),
c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
}
return a
}
var tk = function (a,TKK) {
for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
var c = a.charCodeAt(f);
128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ? (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240, g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
}
a = h;
for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
a = b(a, "+-3^+b+-f");
a ^= Number(e[1]) || 0;
0 > a && (a = (a & 2147483647) + 2147483648);
a %= 1E6;
return a.toString() + "." + (a ^ h)
}
第二种方式比较简单很多 (推荐)
GoogleApi
package com.yoostar.translate.v2;
import com.alibaba.fastjson.JSONArray;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.*;
public class GoogleApi {
private static final String PATH = "https://translate.googleapis.com/translate_a/single";
private static final String CLIENT = "gtx";
private static final String USER_AGENT = "Mozilla/5.0";
private static final Map<String, String> LANGUAGE_MAP = new HashMap();
private static GoogleApi GOOGLEAPI = null;
public static GoogleApi getInstance() {
if (null == GOOGLEAPI) {
GOOGLEAPI = new GoogleApi();
GOOGLEAPI.init();
}
return GOOGLEAPI;
}
private void init() {
LANGUAGE_MAP.put("auto", "Automatic");
LANGUAGE_MAP.put("af", "Afrikaans");
LANGUAGE_MAP.put("sq", "Albanian");
LANGUAGE_MAP.put("am", "Amharic");
LANGUAGE_MAP.put("ar", "Arabic");
LANGUAGE_MAP.put("hy", "Armenian");
LANGUAGE_MAP.put("az", "Azerbaijani");
LANGUAGE_MAP.put("eu", "Basque");
LANGUAGE_MAP.put("be", "Belarusian");
LANGUAGE_MAP.put("bn", "Bengali");
LANGUAGE_MAP.put("bs", "Bosnian");
LANGUAGE_MAP.put("bg", "Bulgarian");
LANGUAGE_MAP.put("ca", "Catalan");
LANGUAGE_MAP.put("ceb", "Cebuano");
LANGUAGE_MAP.put("ny", "Chichewa");
LANGUAGE_MAP.put("zh_cn", "Chinese Simplified");
LANGUAGE_MAP.put("zh_tw", "Chinese Traditional");
LANGUAGE_MAP.put("co", "Corsican");
LANGUAGE_MAP.put("hr", "Croatian");
LANGUAGE_MAP.put("cs", "Czech");
LANGUAGE_MAP.put("da", "Danish");
LANGUAGE_MAP.put("nl", "Dutch");
LANGUAGE_MAP.put("en", "English");
LANGUAGE_MAP.put("eo", "Esperanto");
LANGUAGE_MAP.put("et", "Estonian");
LANGUAGE_MAP.put("tl", "Filipino");
LANGUAGE_MAP.put("fi", "Finnish");
LANGUAGE_MAP.put("fr", "French");
LANGUAGE_MAP.put("fy", "Frisian");
LANGUAGE_MAP.put("gl", "Galician");
LANGUAGE_MAP.put("ka", "Georgian");
LANGUAGE_MAP.put("de", "German");
LANGUAGE_MAP.put("el", "Greek");
LANGUAGE_MAP.put("gu", "Gujarati");
LANGUAGE_MAP.put("ht", "Haitian Creole");
LANGUAGE_MAP.put("ha", "Hausa");
LANGUAGE_MAP.put("haw", "Hawaiian");
LANGUAGE_MAP.put("iw", "Hebrew");
LANGUAGE_MAP.put("hi", "Hindi");
LANGUAGE_MAP.put("hmn", "Hmong");
LANGUAGE_MAP.put("hu", "Hungarian");
LANGUAGE_MAP.put("is", "Icelandic");
LANGUAGE_MAP.put("ig", "Igbo");
LANGUAGE_MAP.put("id", "Indonesian");
LANGUAGE_MAP.put("ga", "Irish");
LANGUAGE_MAP.put("it", "Italian");
LANGUAGE_MAP.put("ja", "Japanese");
LANGUAGE_MAP.put("jw", "Javanese");
LANGUAGE_MAP.put("kn", "Kannada");
LANGUAGE_MAP.put("kk", "Kazakh");
LANGUAGE_MAP.put("km", "Khmer");
LANGUAGE_MAP.put("ko", "Korean");
LANGUAGE_MAP.put("ku", "Kurdish (Kurmanji)");
LANGUAGE_MAP.put("ky", "Kyrgyz");
LANGUAGE_MAP.put("lo", "Lao");
LANGUAGE_MAP.put("la", "Latin");
LANGUAGE_MAP.put("lv", "Latvian");
LANGUAGE_MAP.put("lt", "Lithuanian");
LANGUAGE_MAP.put("lb", "Luxembourgish");
LANGUAGE_MAP.put("mk", "Macedonian");
LANGUAGE_MAP.put("mg", "Malagasy");
LANGUAGE_MAP.put("ms", "Malay");
LANGUAGE_MAP.put("ml", "Malayalam");
LANGUAGE_MAP.put("mt", "Maltese");
LANGUAGE_MAP.put("mi", "Maori");
LANGUAGE_MAP.put("mr", "Marathi");
LANGUAGE_MAP.put("mn", "Mongolian");
LANGUAGE_MAP.put("my", "Myanmar (Burmese)");
LANGUAGE_MAP.put("ne", "Nepali");
LANGUAGE_MAP.put("no", "Norwegian");
LANGUAGE_MAP.put("ps", "Pashto");
LANGUAGE_MAP.put("fa", "Persian");
LANGUAGE_MAP.put("pl", "Polish");
LANGUAGE_MAP.put("pt", "Portuguese");
LANGUAGE_MAP.put("ma", "Punjabi");
LANGUAGE_MAP.put("ro", "Romanian");
LANGUAGE_MAP.put("ru", "Russian");
LANGUAGE_MAP.put("sm", "Samoan");
LANGUAGE_MAP.put("gd", "Scots Gaelic");
LANGUAGE_MAP.put("sr", "Serbian");
LANGUAGE_MAP.put("st", "Sesotho");
LANGUAGE_MAP.put("sn", "Shona");
LANGUAGE_MAP.put("sd", "Sindhi");
LANGUAGE_MAP.put("si", "Sinhala");
LANGUAGE_MAP.put("sk", "Slovak");
LANGUAGE_MAP.put("sl", "Slovenian");
LANGUAGE_MAP.put("so", "Somali");
LANGUAGE_MAP.put("es", "Spanish");
LANGUAGE_MAP.put("su", "Sundanese");
LANGUAGE_MAP.put("sw", "Swahili");
LANGUAGE_MAP.put("sv", "Swedish");
LANGUAGE_MAP.put("tg", "Tajik");
LANGUAGE_MAP.put("ta", "Tamil");
LANGUAGE_MAP.put("te", "Telugu");
LANGUAGE_MAP.put("th", "Thai");
LANGUAGE_MAP.put("tr", "Turkish");
LANGUAGE_MAP.put("uk", "Ukrainian");
LANGUAGE_MAP.put("ur", "Urdu");
LANGUAGE_MAP.put("uz", "Uzbek");
LANGUAGE_MAP.put("vi", "Vietnamese");
LANGUAGE_MAP.put("cy", "Welsh");
LANGUAGE_MAP.put("xh", "Xhosa");
LANGUAGE_MAP.put("yi", "Yiddish");
LANGUAGE_MAP.put("yo", "Yoruba");
LANGUAGE_MAP.put("zu", "Zulu");
}
public boolean isSupport(String language) {
if (null == LANGUAGE_MAP.get(language)) {
return false;
}
return true;
}
public String getCode(String desiredLang) {
if (null != LANGUAGE_MAP.get(desiredLang)) {
return desiredLang;
}
String tmp = desiredLang.toLowerCase();
for (Map.Entry<String, String> enter : LANGUAGE_MAP.entrySet()) {
if (enter.getValue().equals(tmp)) {
return enter.getKey();
}
}
return null;
}
public String translateText(String text, String sourceLang, String targetLang) throws Exception {
String retStr = "";
if (!(isSupport(sourceLang) || isSupport(targetLang))) {
throw new Exception("不支持的语言类型");
}
List<NameValuePair> nvp = new ArrayList();
nvp.add(new BasicNameValuePair("client", CLIENT));
nvp.add(new BasicNameValuePair("sl", sourceLang));
nvp.add(new BasicNameValuePair("tl", targetLang));
nvp.add(new BasicNameValuePair("dt", "t"));
nvp.add(new BasicNameValuePair("q", text));
String resp = postHttp(PATH, nvp);
if (null == resp) {
throw new Exception("网络异常");
}
JSONArray jsonObject = JSONArray.parseArray(resp);
for (Iterator<Object> it = jsonObject.getJSONArray(0).iterator(); it.hasNext(); ) {
JSONArray a = (JSONArray) it.next();
retStr += a.getString(0);
}
return retStr;
}
private String postHttp(String url, List<NameValuePair> nvp) {
String responseStr = null;
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("User-Agent", USER_AGENT);
CloseableHttpResponse response2 = null;
try {
httpPost.setEntity(new UrlEncodedFormEntity(nvp, Charset.forName("UTF-8")));
try {
response2 = httpclient.execute(httpPost);
} catch (IOException e) {
e.printStackTrace();
}
HttpEntity entity2 = response2.getEntity();
responseStr = EntityUtils.toString(entity2);
EntityUtils.consume(entity2);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != response2) {
try {
response2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != httpclient) {
try {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return responseStr;
}
}
测试
GoogleApi.getInstance().translateText("hello I am liu", "en", "en")