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 ——调用搜狗翻译API
最新推荐文章于 2024-04-09 21:42:29 发布
这段代码演示了如何使用Java通过SSLUtils工具类进行HTTPGET和POST请求来调用搜狗翻译API。它首先获取搜狗翻译的cookie,然后执行100次翻译请求,记录运行时间,并忽略SSL证书验证。
摘要由CSDN通过智能技术生成