作为翻译api,js加密要了解哪些
1、前言
最近出了个宇宙轻量级最强——Fleet,小编也申请了一下,用邮件申请的。他回复了一段英文,也不知道有没有申请成功,也没有看到success的关键字,于是想到用某度翻译,不查不知道,一查大部分都是python语言写的,就是要破解那个js。于是,写个了java的。不会Java退出神坛一二三名的位置吧,好像现在Go也内卷了。
2、字段分析
String token = t;
String gtk = c;
String url = "https://fanyi.baidu.com/v2transapi";
String sign = token(q, gtk);
Map<String, String> params = new HashMap<String, String>();
params.put("from", from);
params.put("to", to);
params.put("query", q);
params.put("transtype", "realtime");
params.put("simple_means_flag", "3");
params.put("sign", sign);
params.put("token", token);
params.put("domain", "common");
这里需注意gtk,token,sign这3个
String c = pachongUtil.getStringsByZz(url1,htmlCode,new String[]{"t1"},new String[]{";window.gtk = '(.*?)';"}).get(0)[0]+"";
String t = pachongUtil.getStringsByZz(url1,htmlCode,new String[]{"t1"},new String[]{"token: '(.*?)',"}).get(0)[0]+"";
通过正则可以获取gtk和token
private static String token(String value, String sign) {
String result = "";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
try {
File file = ResourceUtils.getFile("classpath:yhtemp/Baidu.js");
FileReader reader = new FileReader(file.getAbsolutePath());
engine.eval(reader);
if (engine instanceof Invocable) {
Invocable invoke = (Invocable)engine;
result = String.valueOf(invoke.invokeFunction("e", value, sign));
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
根据要翻译的内容和gtk获取sign,这里js加密了
function a(r) {
if (Array.isArray(r)) {
for (var o = 0, t = Array(r.length); o < r.length; o++)
t[o] = r[o];
return t
}
return Array.from(r)
}
function n(r, o) {
for (var t = 0; t < o.length - 2; t += 3) {
var a = o.charAt(t + 2);
a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a),
a = "+" === o.charAt(t + 1) ? r >>> a : r << a,
r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a
}
return r
}
function e(r,u) {
var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
if (null === o) {
var t = r.length;
t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))
} else {
for (var e = r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), C = 0, h = e.length, f = []; h > C; C++)
"" !== e[C] && f.push.apply(f, a(e[C].split(""))),
C !== h - 1 && f.push(o[C]);
var g = f.length;
g > 30 && (r = f.slice(0, 10).join("") + f.slice(Math.floor(g / 2) - 5, Math.floor(g / 2) + 5).join("") + f.slice(-10).join(""))
}
for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
var A = r.charCodeAt(v);
128 > A ? S[c++] = A : (2048 > A ? S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) ? (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)),
S[c++] = A >> 18 | 240,
S[c++] = A >> 12 & 63 | 128) : S[c++] = A >> 12 | 224,
S[c++] = A >> 6 & 63 | 128),
S[c++] = 63 & A | 128)
}
for (var p = m, F = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), D = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), b = 0; b < S.length; b++)
p += S[b],
p = n(p, F);
return p = n(p, D),
p ^= s,
0 > p && (p = (2147483647 & p) + 2147483648),
p %= 1e6,
p.toString() + "." + (p ^ m)
}
最后还要获取cookie
public static String getCookie(WebDriver driver){
WebDriver.Options manage = driver.manage();
Set<Cookie> cookies = manage.getCookies();
String cc = "";
for(Cookie c : cookies){
cc+=c.getName()+ "=" + c.getValue()+";";
}
return cc;
}
最后解析返回内容
private static String getResult(String resource) {
JSONObject object = JSONObject.parseObject(resource);
String temp2 = object.getString("trans_result");
JSONObject object2 = JSONObject.parseObject(temp2);
String temp = object2.getString("data");
JSONArray data = JSONArray.parseArray(temp);
String a = "";
for(int i = 0 ; i < data.size(); i++){
a+=data.getJSONObject(i).getString("dst");
}
return a;
}
3、完整代码
package baidu;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.colorbin.rpa.d_software_auto.d01_browser.browserUtil;
import com.colorbin.rpa.h_pachong.pachongUtil;
import com.colorbin.utils.http.UserAgent;
import org.apache.http.HttpEntity;
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.util.EntityUtils;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.springframework.util.ResourceUtils;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.io.File;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @Description 百度翻译 英译中
* @Author yanhui
* @Date 2021-09-13 11:52
*/
public class TestBaidu2 {
public static void main(String[] args) throws Exception {
String a = transBdApiToEn("爱");
System.out.println("结果:"+a);
}
/**
* 中译英
* @param text
* @return
* @throws Exception
*/
public static String transBdApiToEn(String text) throws Exception {
return transBdApi(text, "zh", "en");
}
/**
* 英译中
* @param text
* @return
* @throws Exception
*/
public static String transBdApiToZh(String text) throws Exception {
return transBdApi(text, "en", "zh");
}
public static String transBdApi(String text,String from, String to) throws Exception {
String url1 = "https://fanyi.baidu.com";
WebDriver webDriver = browserUtil.initBrowserByNoGPUAndAgent(url1);
String htmlCode = browserUtil.getHtml(webDriver);
String cookie = getCookie(webDriver);
browserUtil.quit(webDriver);
String c = pachongUtil.getStringsByZz(url1,htmlCode,new String[]{"t1"},new String[]{";window.gtk = '(.*?)';"}).get(0)[0]+"";
String t = pachongUtil.getStringsByZz(url1,htmlCode,new String[]{"t1"},new String[]{"token: '(.*?)',"}).get(0)[0]+"";
String q = text;
String token = t;
String gtk = c;
String url = "https://fanyi.baidu.com/v2transapi";
String sign = token(q, gtk);
Map<String, String> params = new HashMap<String, String>();
params.put("from", from);
params.put("to", to);
params.put("query", q);
params.put("transtype", "realtime");
params.put("simple_means_flag", "3");
params.put("sign", sign);
params.put("token", token);
params.put("domain", "common");
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost request = new HttpPost(url);
request.setEntity(new UrlEncodedFormEntity(Util.convertParams(params), "UTF-8"));
request.setHeader("Cookie", cookie);
request.setHeader("User-Agent", UserAgent.getUserAgent());
CloseableHttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "utf-8");
String a = getResult(result);
EntityUtils.consume(entity);
response.getEntity().getContent().close();
response.close();
return a;
}
public static String getCookie(WebDriver driver){
WebDriver.Options manage = driver.manage();
Set<Cookie> cookies = manage.getCookies();
String cc = "";
for(Cookie c : cookies){
cc+=c.getName()+ "=" + c.getValue()+";";
}
return cc;
}
private static String getResult(String resource) {
JSONObject object = JSONObject.parseObject(resource);
String temp2 = object.getString("trans_result");
JSONObject object2 = JSONObject.parseObject(temp2);
String temp = object2.getString("data");
JSONArray data = JSONArray.parseArray(temp);
String a = "";
for(int i = 0 ; i < data.size(); i++){
a+=data.getJSONObject(i).getString("dst");
}
return a;
}
private static String token(String value, String sign) {
String result = "";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
try {
File file = ResourceUtils.getFile("classpath:yhtemp/Baidu.js");
FileReader reader = new FileReader(file.getAbsolutePath());
engine.eval(reader);
if (engine instanceof Invocable) {
Invocable invoke = (Invocable)engine;
result = String.valueOf(invoke.invokeFunction("e", value, sign));
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
看了github,很多用Python做的,很优秀。也有封装很好的,除了某度,也有某歌,某道翻译api。
如:
WebDriver webDriver = browserUtil.initBrowserByNoGPUAndAgent(url1);
String htmlCode = browserUtil.getHtml(webDriver);
这些函数代码,都是小编封装好的,可加微信bin490647751。