作为翻译api,js加密要了解哪些

作为翻译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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值