• 百度翻译接口破解


    百度翻译网页地址

    https://fanyi.baidu.com

    代码

    1. 获取签名
    import javax.script.Invocable;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    /**
     * @author xiaog
     */
    public class Sign {
    
        private Sign() {
        }
    
        public static ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
    
        /**
         * 调用js方法生成签名
         * @param query 原文
         * @param gtk 种子签名
         * @return 签名
         * @throws Exception
         */
        public static String getSign(String query, String gtk) throws ScriptException, NoSuchMethodException {
            String func = "function getSign(query) {\n" +
                    "    function a(r, o) {\n" +
                    "        for (var t = 0; t < o.length - 2; t += 3) {\n" +
                    "            var a = o.charAt(t + 2);\n" +
                    "            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\n" +
                    "        }\n" +
                    "        return r\n" +
                    "    }\n" +
                    "\n" +
                    "    var C = null;\n" +
                    "    var hash = function (r, _gtk) {\n" +
                    "        var o = r.length;\n" +
                    "        o > 30 && (r = '' + r.substr(0, 10) + r.substr(Math.floor(o / 2) - 5, 10) + r.substr(-10, 10));\n" +
                    "        var t = void 0, t = null !== C ? C : (C = _gtk || '') || '';\n" +
                    "        for (var e = t.split('.'), h = Number(e[0]) || 0, i = Number(e[1]) || 0, d = [], f = 0, g = 0; g < r.length; g++) {\n" +
                    "            var m = r.charCodeAt(g);\n" +
                    "            128 > m ? d[f++] = m : (2048 > m ? d[f++] = m >> 6 | 192 : (55296 === (64512 & m) && g + 1 < r.length && 56320 === (64512 & r.charCodeAt(g + 1)) ? (m = 65536 + ((1023 & m) << 10) + (1023 & r.charCodeAt(++g)), d[f++] = m >> 18 | 240, d[f++] = m >> 12 & 63 | 128) : d[f++] = m >> 12 | 224, d[f++] = m >> 6 & 63 | 128), d[f++] = 63 & m | 128)\n" +
                    "        }\n" +
                    "        for (var S = h, u = '+-a^+6', l = '+-3^+b+-f', s = 0; s < d.length; s++) S += d[s], S = a(S, u);\n" +
                    "        return S = a(S, l), S ^= i, 0 > S && (S = (2147483647 & S) + 2147483648), S %= 1e6, S.toString() + '.' + (S ^ h)\n" +
                    "    }\n" +
                    "    return hash(query,'" + gtk + "')\n" +
                    "}\n";
            //执行js脚本定义函数
            engine.eval(func);
            Invocable invocable = (Invocable) engine;
            Object res = invocable.invokeFunction("getSign", query);
            return res.toString();
        }
    }
    
    1. 请求翻译接口
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import okhttp3.*;
    
    public class Translate {
    
        private static ObjectMapper objectMapper = new ObjectMapper();
    
        private static OkHttpClient client = new OkHttpClient.Builder().build();
    
        /**
         * 令牌 window.common.token
         */
        private static String token = "925160a8745a657e443b666ce5d3c383";
    
        /**
         * cookie
         */
        private static String cookie = "BAIDUID=FAE39815F9431170B8E230B87980567A:FG=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1638152216; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1638152217; __yjs_duid=1_edd46d1edb3a155419bbb51bcaf3a6941638152218380; ab_sr=1.0.1_NDgyOWM1NDgzNDJlMDNlYzVhNGJlOTcxMjBmZGQ0NGFiZDdiOTUzNGEwZDQ0MWIyMTcyMmQzNTZjMGMxMGU3OTQ3OGEzNWJhNGJkZDQ3ODM0YzUxOGJjMGZkOTEyNGU0NmJlYzJjNWFmZTI0ZTg3NmYwODYzMjY4YjhhMmRhZGZhY2U0YTA5NTMzNDBjZmRiNzJmMGJkMTM0OTJlYjRmZg==";
    
        /**
         * 种子签名 window.gtk
         */
        private static String seedSign = "320305.131321201";
    
        private RequestBody getRequestBody(String query,String from,String to) throws Exception {
            String sign = Sign.getSign(query,seedSign);
            return new FormBody.Builder()
                    .add("from", from)
                    .add("to", to)
                    .add("query", query)
                    .add("transtype", "realtime")
                    .add("simple_means_flag", "3")
                    .add("sign", sign)
                    .add("token", token)
                    .add("domain", "common")
                    .build();
        }
    
        private Request.Builder getRequestBuilder() {
            return new Request.Builder()
                    .header("Connection", "keep-alive")
                    .header("sec-ch-ua", "\"Chromium\";v=\"94\", \"Google Chrome\";v=\"94\", \";Not A Brand\";v=\"99\"")
                    .header("Accept", "*/*")
                    .header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
                    .header("X-Requested-With", "XMLHttpRequest")
                    .header("sec-ch-ua-mobile", "?0")
                    .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36")
                    .header("sec-ch-ua-platform", "\"Windows\"")
                    .header("Origin", "https://fanyi.baidu.com")
                    .header("Sec-Fetch-Site", "same-origin")
                    .header("Sec-Fetch-Mode", "cors")
                    .header("Sec-Fetch-Dest", "empty")
                    .header("Referer", "https://fanyi.baidu.com/")
                    .header("Accept-Language", "zh-CN,zh;q=0.9")
                    .header("Cookie", cookie);
        }
    
        /**
         * 英翻汉
         * @param query 原文
         * @return
         * @throws Exception
         */
        public String enToZh(String query) throws Exception {
            return translate(query,"en","zh");
        }
    
        /**
         * 翻译,原文语种自动识别
         * @param query 原文
         * @param to 译文语种
         * @return
         * @throws Exception
         */
        public String translate(String query,String to) throws Exception {
            String from = langDetect(query);
            return translate(query,from,to);
        }
    
        /**
         * 翻译
         * @param query 原文
         * @param from 原文语种
         * @param to 译文语种
         * @return
         * @throws Exception
         */
        public String translate(String query,String from,String to) throws Exception {
            RequestBody requestBody = getRequestBody(query,from,to);
            Request request = getRequestBuilder()
                    .url("https://fanyi.baidu.com/v2transapi?from="+from+"&to="+to)
                    .post(requestBody).build();
            Response response = client.newCall(request).execute();
            String result = response.body().string();
            JsonNode jsonNode = objectMapper.readTree(result);
            String res = jsonNode.at("/trans_result/data/0/dst").asText();
            return res;
        }
    
        /**
         *  检测语种
         * @param query
         * @return
         * @throws IOException
         */
        public String langDetect(String query) throws IOException {
            FormBody formBody = new FormBody.Builder()
                    .add("query", query).build();
            Request request = getRequestBuilder()
                    .url("https://fanyi.baidu.com/langdetect")
                    .post(formBody).build();
            Response response = client.newCall(request).execute();
            String result = response.body().string();
            JsonNode jsonNode = objectMapper.readTree(result);
            String res = jsonNode.at("/lan").asText();
            return res;
        }
    
        public static void main(String[] args) throws Exception {
            Translate translate = new Translate();
            String query = "hello";
            String result = translate.enToZh(query);
            System.out.println(result);
            query = "こんにちは";
            result = translate.translate(query,"zh");
            System.out.println(result);
        }
    }
    
    1. 依赖
    <dependencies>
        <!-- jackson,用于处理json -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.12.3</version>
        </dependency>
        <!-- okhttp3,用于发送http请求 -->
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.1</version>
        </dependency>
    </dependencies>
    

    解释

    1. 以下是百度翻译接口的完整HTTP请求,格式是idea的http文件格式
    POST https://fanyi.baidu.com/v2transapi?from=en&to=zh
    Connection: keep-alive
    sec-ch-ua: "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"
    Accept: */*
    X-Requested-With: XMLHttpRequest
    sec-ch-ua-mobile: ?0
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36
    sec-ch-ua-platform: "Windows"
    Origin: https://fanyi.baidu.com
    Sec-Fetch-Site: same-origin
    Sec-Fetch-Mode: cors
    Sec-Fetch-Dest: empty
    Referer: https://fanyi.baidu.com/
    Accept-Language: zh-CN,zh;q=0.9
    Cookie: BAIDUID=D7029489CFEEAB420F853746FCA71824:FG=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1637976767; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1637976767; __yjs_duid=1_0103d0111a955a8b1616dbf9b12fe69f1637976760950; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; __yjs_st=2_MmI4YWY1M2U4OGI3MzEzM2U4YmYxMjYwYjA3NTQ5ZWQ0M2MxMDVlYjVmMGJkMTIxYTBiY2FjMTExYzEyMjJlZDc3MGEwN2U2Nzk0YjdjODc0NzM2NGI4YzQ3ZmZkNjcwZTc3NzhlZWVjMjRlNDRlMTMzMDVjNDZiYjZlM2M5ZTA0MDJkNDEwMjkyYzJiZjU5N2QxODY4NTVjODNmNGJiMmNlYzg4NWU4NjIxZWMwYTM5Y2RmODdmY2ZiOWQzYzk1MzA5ZGM2ZDU4ODNkNjY4OWU5NmQxNzA5YjQ2NjQwNmQzYzFhMmViNmU4ZDAwNmFmMWJjMTYwMzNhNjkxY2Q3MF83X2QxOTg4MjYx; ab_sr=1.0.1_MTZlMTk3YjY5YmMyNWNjZTJmMTdhMGFlYmM5MWY2NjMyOGVmMzE1YzYyYzY4ZjE2OGUxYmVjMTBjNzM2NWY1ZWQ1MDExYzE2ZTAyMTRjNTc2OGJlMDhhZjAzZjhmODYwOGI5NmU4MGE3MDg3NmMzYzhlMWM3MGNlODA1MDM4Mzk4NzdiYWM4ZGNjMDY1YmFiOGZmZGNjZTRjNjUwZjcxMQ==
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    
    from=en&to=zh&query=hello&transtype=realtime&simple_means_flag=3&sign=54706.276099&token=1bf7c3c20520a2203e4668c83073bfba&domain=common
    
    1. 在以上请求中有如下变量
    • cookie
    • from,原文的语种简称,英文是en
    • to,译文的语种简称,中文是zh
    • query,译文
    • sign,签名,原网页中是在js中生成,需要一个种子签名,可在页面通过window.gtk获取
    • token,令牌,原网页中的变量,可在页面通过window.common.token获取
    1. 代码中的Sign类就是网页中生成sign的js方法,利用java去执行
    不积跬步无以至千里
  • 相关阅读:
    如何一次性杀掉几千个的linux进程
    获取字符串中全部的回文子串
    python 中常用的高阶函数
    (python)字符串中找出连续最长的数字串
    批量更新 mytais
    Java Stream
    内存区域
    lock上
    Java代理
    heap、stack
  • 原文地址:https://www.cnblogs.com/xiaogblog/p/15619948.html
Copyright © 2020-2023  润新知