瀏覽代碼

华农保险对接提交

wanghao 5 月之前
父節點
當前提交
44482941c5

+ 1 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/component/HuaNongCrawlerCacheComponent.java

@@ -62,9 +62,9 @@ public class HuaNongCrawlerCacheComponent {
         collect.put(TOKEN, token);
         // 3.1 存入redis中
         RMap<String, Object> rMap = redissonClient.getMap(AUTHORIZATION + username);
-        rMap.putAll(collect);
         collect.put(USER_CODE, login.getUserCode());
         collect.put(USER_NAME, login.getUserName());
+        rMap.putAll(collect);
         rMap.expire(Duration.ofHours(AUTHORIZATION_TIME));
     }
 

+ 4 - 0
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/HuaNongCrawlerConfigureParameters.java

@@ -43,5 +43,9 @@ public class HuaNongCrawlerConfigureParameters implements ConfigureParameters {
      * 维护人
      */
     private String callerName;
+    /**
+     * 设备码
+     */
+    private String deviceid;
 
 }

+ 2 - 2
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerLoginRequestRequest.java

@@ -52,14 +52,14 @@ public class HuaNongCrawlerLoginRequestRequest implements HuaNongHeadRequest {
     @JsonProperty("pwd")
     private String pwd;
 
-    public HuaNongCrawlerLoginRequestRequest(String username, String password, String captchaKey, String captchaResult) {
+    public HuaNongCrawlerLoginRequestRequest(String username, String password,String deviceId, String captchaKey, String captchaResult) {
         this.head = new HuaNongCrawlerRequestBaseHead("");
         this.head.setAnonymousId("19b4e062d676f0.06752622f9e3c44.26061a51.2073600.19b4e062d68f9f");
         this.userCode = username;
         this.type = "1";
         this.captchaKey = captchaKey;
         this.verificationCode = captchaResult;
-        this.deviceId = DigestUtils.md5Hex(HighPerformanceRandomStringGenerator.generate(24, new Random()));
+        this.deviceId = deviceId;
         this.mobile = "";
         this.saaLoginFlag = "";
         this.verificationNo = "";

+ 1 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/HuaNongCrawlerGetToken.java

@@ -18,6 +18,6 @@ public interface HuaNongCrawlerGetToken {
     /**
      * 获取登录信息
      */
-    RMap<String, Object> getAuthorization(String username, String password);
+    RMap<String, Object> getAuthorization(String username, String password,String deviceId);
 
 }

+ 1 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/HuaNongCrawlerQuoteProcessService.java

@@ -17,7 +17,7 @@ public interface HuaNongCrawlerQuoteProcessService {
      * @param password 密码
      * @param isFirst  是否首次(协议、账号)
      */
-    void login(String username, String password, boolean isFirst);
+    void login(String username, String password,String deviceId, boolean isFirst);
 
     /**
      * 获取归属信息

+ 6 - 5
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerGetTokenImpl.java

@@ -23,21 +23,22 @@ public class HuaNongCrawlerGetTokenImpl implements HuaNongCrawlerGetToken {
     private final HuaNongCrawlerQuoteProcessService huaNongCrawlerQuoteProcessService;
 
     @Override
-    public String getToken(String username, String password) {
-        return getAuthData(username, password,
+    public String getToken(String username, String password ) {
+        return getAuthData(username, password,null,
                 () -> huaNongCrawlerCacheComponent.getToken(username),
                 StringUtils::hasText);
     }
 
 
     @Override
-    public RMap<String, Object> getAuthorization(String username, String password) {
-        return getAuthData(username, password,
+    public RMap<String, Object> getAuthorization(String username, String password,String deviceId) {
+        return getAuthData(username, password,deviceId,
                 () -> huaNongCrawlerCacheComponent.getAuthorization(username),
                 auth -> auth != null && !auth.isEmpty());
     }
 
     private <T> T getAuthData(String username, String password,
+                              String deviceId,
                               Supplier<T> cacheSupplier,
                               Predicate<T> validator) {
         try {
@@ -45,7 +46,7 @@ public class HuaNongCrawlerGetTokenImpl implements HuaNongCrawlerGetToken {
             if (validator.test(data)) {
                 return data;
             }
-            huaNongCrawlerQuoteProcessService.login(username, password, false);
+            huaNongCrawlerQuoteProcessService.login(username, password,deviceId, false);
             T newData = cacheSupplier.get();
             if (!validator.test(newData)) {
                 throw new SystemException("登录后无法获取有效的身份验证数据");

+ 55 - 24
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java

@@ -16,6 +16,7 @@ import com.jzg.quotation.huanong.crawler.entity.response.*;
 import com.jzg.quotation.huanong.crawler.service.HuaNongCrawlerQuoteProcessService;
 import com.jzg.quotation.huanong.crawler.utils.ImageIdGenerate;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 
@@ -23,6 +24,7 @@ import java.time.Duration;
 import java.util.*;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuoteProcessService {
@@ -38,13 +40,13 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
     private final RedissonComponent redissonComponent;
 
     // 登录循环次数
-    private final static int LOGIN_RETRY_COUNT = 3;
+    private final static int LOGIN_RETRY_COUNT = 5;
 
 
     @Override
-    public void login(String username, String password, boolean isFirst) {
+    public void login(String username, String password,String deviceId, boolean isFirst) {
         try {
-            distributedLockComponent.executeWithLock(HuaNongCrawlerCacheComponent.LOGIN_LOCKOUT + username, () -> authorization(username, password, isFirst), 20, 30);
+            distributedLockComponent.executeWithLock(HuaNongCrawlerCacheComponent.LOGIN_LOCKOUT + username, () -> authorization(username, password,deviceId, isFirst), 20, 30);
         } catch (Exception e) {
             e.printStackTrace();
             throw new SystemException("登录失败");
@@ -62,23 +64,48 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
                 .orElse("登录失败,未知错误");
     }
 
-    private HuaNongCrawlerLoginResponse attemptLoginWithRetry(String username, String password) {
+    private HuaNongCrawlerLoginResponse attemptLoginWithRetry(String username, String password,String deviceId) {
         // 循环次数
         for (int i = 0; i < LOGIN_RETRY_COUNT; i++) {
-            HttpHeaders httpHeaders = new HttpHeaders();
-            // 验证码
-            HuaNongCrawlerVerificationCodeRequestRequest huaNongCrawlerVerificationCodeRequest = new HuaNongCrawlerVerificationCodeRequestRequest();
-            HuaNongCrawlerVerificationCodeResponse huaNongCrawlerVerificationCodeResponse = huaNongCrawlerRequestComponent.verificationCode(huaNongCrawlerVerificationCodeRequest, httpHeaders);
-            // 识别验证码
-            String captcha = exteriorUtilsRequest.captchaCalculate(huaNongCrawlerVerificationCodeResponse.getImageStream());
-            // 验证码结果
-            //String captchaResult = parseCaptcha(captcha);
-            // 登录
-            HuaNongCrawlerLoginRequestRequest huaNongCrawlerLoginRequest = new HuaNongCrawlerLoginRequestRequest(username, password, huaNongCrawlerVerificationCodeResponse.getCaptchaKey(), captcha);
-            HuaNongCrawlerLoginResponse login = huaNongCrawlerRequestComponent.login(huaNongCrawlerLoginRequest, httpHeaders);
-            if (isLoginSuccessful(login)) {
-                huaNongCrawlerCacheComponent.cacheLoginInfo(login, username);
-                return login;
+            try {
+                HttpHeaders httpHeaders = new HttpHeaders();
+
+                // 1. 获取验证码
+                HuaNongCrawlerVerificationCodeRequestRequest request = new HuaNongCrawlerVerificationCodeRequestRequest();
+                HuaNongCrawlerVerificationCodeResponse response = huaNongCrawlerRequestComponent.verificationCode(request, httpHeaders);
+
+                // 2. 识别验证码文本
+                String captchaText = exteriorUtilsRequest.captchaIdentify(response.getImageStream());
+                log.info("第 {} 次尝试,识别结果: {}", i + 1, captchaText);
+
+                // 3. 计算验证码结果
+                String captchaResult = parseCaptcha(captchaText);
+                log.info("计算结果: {}", captchaResult);
+
+                // 4. 执行登录(用计算后的结果)
+                HuaNongCrawlerLoginRequestRequest loginRequest = new HuaNongCrawlerLoginRequestRequest(
+                        username,
+                        password,
+                        deviceId,
+                        response.getCaptchaKey(),
+                        captchaResult  // ← 用计算结果而不是原始文本
+                );
+
+                HuaNongCrawlerLoginResponse loginResponse = huaNongCrawlerRequestComponent.login(loginRequest, httpHeaders);
+
+                // 5. 判断是否成功
+                if (isLoginSuccessful(loginResponse)) {
+                    log.info("登录成功,第 {} 次尝试", i + 1);
+                    huaNongCrawlerCacheComponent.cacheLoginInfo(loginResponse, username);
+                    return loginResponse;
+                }
+
+                // 失败时记录原因
+                String errorMsg = extractErrorMessage(loginResponse);
+                log.warn("第 {} 次登录失败: {}", i + 1, errorMsg);
+
+            } catch (Exception e) {
+                log.error("第 {} 次尝试发生异常: {}", i + 1, e.getMessage());
             }
         }
         throw new SystemException("超过最大重试次数,登录失败");
@@ -90,15 +117,19 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
      */
     private String parseCaptcha(String captcha) {
         String result = "";
-        if (captcha == null || captcha.length() < 3) {
+        if (captcha == null) {
             throw new SystemException("验证码长度解析失败");
+        }else if(captcha.length() == 2 ){
+            int firstNum = Integer.parseInt(String.valueOf(captcha.charAt(0)));
+            int lastNum = Integer.parseInt(String.valueOf(captcha.charAt(1)));
+            result = String.valueOf(firstNum - lastNum);
         }
         else if (captcha.length() == 3 && (captcha.contains("x") || captcha.contains("+"))) {
             try {
                 int firstNum = Integer.parseInt(String.valueOf(captcha.charAt(0)));
                 int lastNum = Integer.parseInt(String.valueOf(captcha.charAt(2)));
                 if (captcha.contains("x")) {
-                    result = String.valueOf(firstNum * lastNum);
+                    result = String.valueOf(firstNum + lastNum);
                 }
                 else if (captcha.contains("+")) {
                     result = String.valueOf(firstNum + lastNum);
@@ -117,18 +148,18 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
         return result;
     }
 
-    private void authorization(String username, String password, boolean isFirst) {
+    private void authorization(String username, String password,String deviceId, boolean isFirst) {
         // 判断是否在首次登录(协议、账号)
         if (!isFirst) {
             huaNongCrawlerCacheComponent.isAccountLockout(username);
         }
-        HuaNongCrawlerLoginResponse login = attemptLoginWithRetry(username, password);
+        HuaNongCrawlerLoginResponse login = attemptLoginWithRetry(username, password,deviceId);
         // 判断是否在首次登录(协议、账号)
         if (!isFirst) {
             huaNongCrawlerCacheComponent.accountLockout(username);
         }
-        String s = extractErrorMessage(login);
-        throw new SystemException(s);
+       /* String s = extractErrorMessage(login);
+        throw new SystemException(s);*/
     }
 
     @Override

+ 4 - 4
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerRequestImpl.java

@@ -54,7 +54,7 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
 
     @Override
     public void login(LoginBase loginBase) {
-        huaNongCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword(), true);
+        huaNongCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword(), null,true);
     }
 
     @Override
@@ -569,13 +569,13 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
     private LoginInfoBO getLoginInfoDto(AttributionInformationVo attributionInformationVo) {
         HuaNongCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(HuaNongCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
         //todo  验证码问题,临时使用token
-        cacheLoginInfo(attributionInformationVo);
-        RMap<String, Object> authorization = huaNongCrawlerGetToken.getAuthorization(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+        //cacheLoginInfo(attributionInformationVo);
+        RMap<String, Object> authorization = huaNongCrawlerGetToken.getAuthorization(attributionInformationVo.getUsername(), attributionInformationVo.getPassword(),parameters.getDeviceid());
         String token = (String) authorization.get(HuaNongCrawlerCacheComponent.TOKEN);
         String userCode = (String) authorization.get(HuaNongCrawlerCacheComponent.USER_CODE);
         String userName = (String) authorization.get(HuaNongCrawlerCacheComponent.USER_NAME);
         String loginCom = parameters.getLoginCom();
-        String loginComCode = (String) authorization.get(loginCom);
+        String loginComCode = parameters.getLoginCom();
         return new LoginInfoBO(token, loginCom, loginComCode, userCode, userName, parameters);
     }