|
|
@@ -18,6 +18,7 @@ import org.springframework.http.HttpEntity;
|
|
|
import org.springframework.http.HttpHeaders;
|
|
|
import org.springframework.http.MediaType;
|
|
|
import org.springframework.http.ResponseEntity;
|
|
|
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.LinkedMultiValueMap;
|
|
|
import org.springframework.util.MultiValueMap;
|
|
|
@@ -25,7 +26,12 @@ import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.net.HttpURLConnection;
|
|
|
+import java.net.InetSocketAddress;
|
|
|
+import java.net.Proxy;
|
|
|
import java.net.URLDecoder;
|
|
|
+import java.security.SecureRandom;
|
|
|
+import java.security.cert.X509Certificate;
|
|
|
import java.time.LocalDate;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Base64;
|
|
|
@@ -33,6 +39,12 @@ import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
+import javax.net.ssl.HostnameVerifier;
|
|
|
+import javax.net.ssl.HttpsURLConnection;
|
|
|
+import javax.net.ssl.SSLContext;
|
|
|
+import javax.net.ssl.TrustManager;
|
|
|
+import javax.net.ssl.X509TrustManager;
|
|
|
+
|
|
|
/**
|
|
|
* 人保车险HTTP请求组件
|
|
|
*
|
|
|
@@ -65,11 +77,15 @@ public class RenBaoNewCrawlerRequestComponent {
|
|
|
*/
|
|
|
private HttpHeaders buildHeaders(String token) {
|
|
|
HttpHeaders headers = new HttpHeaders();
|
|
|
+ headers.set("Accept", "application/json, text/plain, */*");
|
|
|
+ headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6");
|
|
|
headers.set("Authorization", token);
|
|
|
- headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0");
|
|
|
+ headers.set("Connection", "keep-alive");
|
|
|
+ headers.set("Content-Type", MediaType.APPLICATION_JSON_VALUE);
|
|
|
+ headers.set("Host", "portal.piccltd.com.cn");
|
|
|
headers.set("Origin", "https://portal.piccltd.com.cn");
|
|
|
headers.set("Referer", "https://portal.piccltd.com.cn/cbzx/car/picc/index1");
|
|
|
- headers.set("Host", "portal.piccltd.com.cn");
|
|
|
+ headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0");
|
|
|
return headers;
|
|
|
}
|
|
|
|
|
|
@@ -133,10 +149,65 @@ public class RenBaoNewCrawlerRequestComponent {
|
|
|
public RenBaoNewCrawlerNpcInitResponse getNpcInit(RenBaoNewCrawlerNpcInitRequest request, HttpHeaders headers) {
|
|
|
String url = buildUrl(RequestUrl.NPC_INIT.getUrl());
|
|
|
log.info("Request NPC init: {}", request.getUserCode());
|
|
|
- ResponseEntity<String> responseEntity = requestComponent.stringPost(url, "", String.class, headers);
|
|
|
+ SimpleClientHttpRequestFactory requestFactory = createIgnoreSslProxyRequestFactory();
|
|
|
+ RestTemplate proxyRestTemplate = new RestTemplate(requestFactory);
|
|
|
+ HttpEntity<String> entity = new HttpEntity<>("", headers);
|
|
|
+ ResponseEntity<String> responseEntity = proxyRestTemplate.postForEntity(url, entity, String.class);
|
|
|
return JSON.parseObject(responseEntity.getBody(), RenBaoNewCrawlerNpcInitResponse.class);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 创建关闭证书校验的代理请求工厂,仅用于NPC初始化代理请求。
|
|
|
+ */
|
|
|
+ private SimpleClientHttpRequestFactory createIgnoreSslProxyRequestFactory() {
|
|
|
+ SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory() {
|
|
|
+ @Override
|
|
|
+ protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
|
|
|
+ if (connection instanceof HttpsURLConnection httpsConnection) {
|
|
|
+ httpsConnection.setSSLSocketFactory(createTrustAllSslContext().getSocketFactory());
|
|
|
+ httpsConnection.setHostnameVerifier(trustAllHostnameVerifier());
|
|
|
+ }
|
|
|
+ super.prepareConnection(connection, httpMethod);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ //requestFactory.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("192.168.5.168", 9999)));
|
|
|
+ return requestFactory;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建信任所有证书的SSL上下文。
|
|
|
+ */
|
|
|
+ private SSLContext createTrustAllSslContext() {
|
|
|
+ try {
|
|
|
+ TrustManager[] trustManagers = new TrustManager[]{new X509TrustManager() {
|
|
|
+ @Override
|
|
|
+ public void checkClientTrusted(X509Certificate[] chain, String authType) {
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void checkServerTrusted(X509Certificate[] chain, String authType) {
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public X509Certificate[] getAcceptedIssuers() {
|
|
|
+ return new X509Certificate[0];
|
|
|
+ }
|
|
|
+ }};
|
|
|
+ SSLContext sslContext = SSLContext.getInstance("TLS");
|
|
|
+ sslContext.init(null, trustManagers, new SecureRandom());
|
|
|
+ return sslContext;
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new SystemException("创建忽略证书校验SSL上下文失败: " + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建信任所有主机名的校验器。
|
|
|
+ */
|
|
|
+ private HostnameVerifier trustAllHostnameVerifier() {
|
|
|
+ return (hostname, session) -> true;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 车型查询
|
|
|
*
|