Procházet zdrojové kódy

人保修改请求头,并且加证书不校验

wanghao před 2 měsíci
rodič
revize
0b1bfa4e2b

+ 74 - 3
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/component/RenBaoNewCrawlerRequestComponent.java

@@ -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;
+    }
+
     /**
      * 车型查询
      *

+ 0 - 1
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerGetTokenImpl.java

@@ -208,7 +208,6 @@ public class RenBaoNewCrawlerGetTokenImpl implements RenBaoNewCrawlerGetToken {
             request.setToken(token);
             request.setUserCode(userCode);
             request.setComCode(comCode);
-            
             RenBaoNewCrawlerNpcInitResponse response = requestComponent.getNpcInit(request, headers);
             
             if (!response.isSuccess()) {