网络接口 2 ——调用搜狗翻译API

package com.mabang.test;

import com.mabang.util.SslUtils;
import javax.net.ssl.*;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.Map;

/**
 * 测试调用搜狗翻译
 */
public class TestSougou {
    public static void main(String[] args) {
        try{
            //get获取搜狗翻译cookie
            String cookie = SSLUtils.getRequest("https://fanyi.sogou.com/ ", 30 * 1000);
            System.out.println("====================================================");
            //获取当前时间
            Instant nowTime = Instant.now();
            //post调翻译
            for (int i =0;i <= 100;i++){
                String body="打开"+i;
                String request = SSLUtils.postRequest("https://fanyi.sogou.com/api/transpc/text/transword",body,cookie,30*1000);
                System.out.println(i + ":" + request);
            }
            //获取结束时间
            Instant endTime = Instant.now();
            //计算运行时间
            System.out.println("运行了多少: "+ Duration.between(nowTime,endTime).getSeconds()+"秒");
            System.out.println("====================================================");
            //解析数据
//            JSONObject object= (JSONObject) JSONObject.parse(request);
//            String code = object.getString("code");
//            String message=object.getString("message");
//            Object data = object.get("data");
//            //目前只知道返回0为返回成功
//            if (code.equals("0")){
//                System.out.println(data);
//            }else{
//                System.out.println("未知错误:"+message);
//            }
//            System.out.println(request);
        }catch (Exception e){
            System.out.println("搜狗翻译API报错:"+e.getMessage());
        }
    }
}
//绕过PKIX和SSL的限制
class SSLUtils{
    private static void trustAllHttpsCertificates() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[1];
        TrustManager tm = new SSLUtils.miTM();
        trustAllCerts[0] = tm;
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }
    static class miTM implements TrustManager, X509TrustManager {

        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public boolean isServerTrusted(X509Certificate[] certs) {
            return true;
        }

        public boolean isClientTrusted(X509Certificate[] certs) {
            return true;
        }

        public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
            return;
        }

        public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
            return;
        }
    }
    /**
     * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
     * @throws Exception
     */
    public static void ignoreSsl() throws Exception{
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
                return true;
            }
        };
        trustAllHttpsCertificates();
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }
    //get请求
    public static String getRequest(String url,int timeOut) throws Exception{
        String result="";
        URL u = new URL(url);
        if("https".equalsIgnoreCase(u.getProtocol())){
            SslUtils.ignoreSsl();
        }
        URLConnection conn = u.openConnection();
        conn.setConnectTimeout(timeOut);
        conn.setReadTimeout(timeOut);
        conn.setRequestProperty("Content-Type","application/json");
        conn.setRequestProperty("Host","fanyi.sogou.com");
        conn.setRequestProperty("Connection","keep-alive");
        conn.setRequestProperty("sec-ch-ua","\"Not-A.Brand\";v=\"24\", \"Chromium\";v=\"14\"");
        conn.setRequestProperty("sec-ch-ua-mobile","?0");
        conn.setRequestProperty("sec-ch-ua-platform","\"Windows\"");
        conn.setRequestProperty("Upgrade-Insecure-Requests","1");
        conn.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36");
        conn.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng, /;q=0.8,application/signed-exchange;v=b3;q=0.9");
        conn.setRequestProperty("Sec-Fetch-Site","none");
        conn.setRequestProperty("Sec-Fetch-Mode","navigate");
        conn.setRequestProperty("Sec-Fetch-User","?1");
        conn.setRequestProperty("Sec-Fetch-Dest","document");
        conn.setRequestProperty("Accept-Language","zh-CN,zh;q=0.9");
        //获取请求头里面的字段,取出Set-Cookie里面的FQV
        Map<String, List<String>> headerFields = conn.getHeaderFields();
        List<String> stringList = headerFields.get("Set-Cookie");
        if (stringList !=null && stringList.size() > 0){
            for (String list:stringList) {
                if (list.contains("FQV")){
                    //截取FQV
                    String cookie=list.substring(0,36);
                    return cookie;
                }else{
                    System.out.println("FQV获取失败");;//没有获取到cookie里面的FQV
                }
            }
        }else{
            System.out.println("get调用搜狗获取cookie失败");
        }
        return result;
    }
    //post请求
    public static String postRequest(String urlAddress,String args,String cookie,int timeOut) throws Exception{
        String body="{\n" + "\"from\":\"auto\",\n" + "\"to\":\"ko\",\n" + "\"query\":\""+args+"\"\n" + "}";
        URL url = new URL(urlAddress);
        if("https".equalsIgnoreCase(url.getProtocol())){
            SslUtils.ignoreSsl();
        }
        URLConnection u = url.openConnection();
        u.setDoInput(true);
        u.setDoOutput(true);
        u.setConnectTimeout(timeOut);
        u.setReadTimeout(timeOut);
        u.setRequestProperty("Content-Type","application/json");
        u.setRequestProperty("sec-ch-ua-mobile","?0");
        u.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36");
        u.setRequestProperty("sec-ch-ua-platform","\"Windows\"");
        u.setRequestProperty("Origin","https://fanyi.sogou.com");
        u.setRequestProperty("Sec-Fetch-Site","same-origin");
        u.setRequestProperty("Sec-Fetch-Mode","cors");
        u.setRequestProperty("Accept-Language","zh-CN,zh;q=0.9 ");
        u.setRequestProperty("Cookie",cookie);
        OutputStreamWriter osw = new OutputStreamWriter(u.getOutputStream(), "UTF-8");
        osw.write(body);
        osw.flush();
        osw.close();
        u.getOutputStream();
        String result = SslUtils.readStream(u.getInputStream());
        return result;
    }
    //将input流转为string
    public static String readStream(InputStream inputStream) throws Exception {
        ByteArrayOutputStream bos = null;
        try {
            bos = new ByteArrayOutputStream();

            byte[] bytes = new byte[32768];

            while (true) {
                int len = inputStream.read(bytes);
                if (len > 0) {
                    bos.write(bytes, 0, len);
                    bos.flush();
                } else {
                    return bos.toString();
                }
            }
        } catch (Throwable th) {
            throw th;
        } finally {
            ;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值