|
|
@@ -5,20 +5,18 @@ import com.jzg.commons.entity.quote.vo.identify.SliderCaptchaVo;
|
|
|
import com.jzg.commons.exception.SystemException;
|
|
|
import com.jzg.quotation.ansheng.crawler.component.AnShengCrawlerCacheComponent;
|
|
|
import com.jzg.quotation.ansheng.crawler.component.AnShengCrawlerRequestComponent;
|
|
|
-import com.jzg.quotation.ansheng.crawler.entity.request.AnShengCrawlerCheckLoginRequest;
|
|
|
-import com.jzg.quotation.ansheng.crawler.entity.request.AnShengCrawlerCheckVerificationRequest;
|
|
|
-import com.jzg.quotation.ansheng.crawler.entity.request.AnShengCrawlerVerifyRequest;
|
|
|
+import com.jzg.quotation.ansheng.crawler.entity.request.*;
|
|
|
import com.jzg.quotation.ansheng.crawler.entity.response.AnShengCrawlerVerifyResponse;
|
|
|
import com.jzg.quotation.ansheng.crawler.service.AnShengCrawlerLoginService;
|
|
|
import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
|
|
|
-import com.jzg.quotation.commons.utils.CookieParseUtils;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import org.springframework.http.HttpHeaders;
|
|
|
-import org.springframework.http.ResponseEntity;
|
|
|
+import org.springframework.http.MediaType;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.LinkedMultiValueMap;
|
|
|
+import org.springframework.util.MultiValueMap;
|
|
|
|
|
|
import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
|
|
|
@Service
|
|
|
@RequiredArgsConstructor
|
|
|
@@ -67,4 +65,112 @@ public class AnShengCrawlerLoginServiceImpl implements AnShengCrawlerLoginServic
|
|
|
throw new SystemException("登录失败,请重新登录");
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public DownloadTokenResult getObtainDownloadToken(String username, String password) {
|
|
|
+ // 构建请求头
|
|
|
+ HttpHeaders headers = buildCommonHeaders();
|
|
|
+ headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
|
|
|
+
|
|
|
+ // URL参数
|
|
|
+ MultiValueMap<String, String> urlParams = new LinkedMultiValueMap<>();
|
|
|
+ urlParams.add("method", "login");
|
|
|
+
|
|
|
+ // 表单参数
|
|
|
+ MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
|
|
|
+ formData.add("account", username);
|
|
|
+ formData.add("password", password);
|
|
|
+ formData.add("phone", "");
|
|
|
+ formData.add("agentCode", "");
|
|
|
+ formData.add("verificationCode", "");
|
|
|
+ formData.add("authenticationType", "1");
|
|
|
+ // 拼接滑块码
|
|
|
+ String dragCode = getHuaKuai();
|
|
|
+ formData.add("dragSliderCode", dragCode != null ? dragCode : "");
|
|
|
+ // 发起POST表单请求,使用项目已有的form请求方法
|
|
|
+ LoginResp loginResp = anShengCrawlerRequestComponent.downloadToken( formData, urlParams,headers);
|
|
|
+ if (loginResp == null) {
|
|
|
+ DownloadTokenResult result = new DownloadTokenResult();
|
|
|
+ result.setCode(400);
|
|
|
+ result.setMessage("登录响应为空");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断登录是否成功
|
|
|
+ if ("成功".equals(loginResp.getMsg())) {
|
|
|
+ String token = loginResp.getToken();
|
|
|
+ String agentCode = loginResp.getData() != null ? loginResp.getData().getAgentCode() : "";
|
|
|
+
|
|
|
+ // 3. 二次请求:根据agentCode获取bdToken
|
|
|
+ HttpHeaders secondHeaders = new HttpHeaders();
|
|
|
+ secondHeaders.add("loginToken", token);
|
|
|
+ secondHeaders.add("User-Agent", buildUserAgent());
|
|
|
+
|
|
|
+ MultiValueMap<String, String> secondUrlParams = new LinkedMultiValueMap<>();
|
|
|
+ secondUrlParams.add("method", "getUserByAgentCode");
|
|
|
+
|
|
|
+ MultiValueMap<String, String> secondForm = new LinkedMultiValueMap<>();
|
|
|
+ secondForm.add("agentCode", agentCode);
|
|
|
+ secondForm.add("agentPersonCode", "");
|
|
|
+ String bdToken = "";
|
|
|
+ BdTokenResp bdResp = anShengCrawlerRequestComponent.bdResp(secondForm, secondUrlParams, headers);
|
|
|
+ if (bdResp != null && bdResp.getData() != null) {
|
|
|
+ bdToken = bdResp.getData().getToken();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 组装成功返回
|
|
|
+ DownloadTokenResult success = new DownloadTokenResult();
|
|
|
+ success.setCode(200);
|
|
|
+ success.setMessage(loginResp.getMsg());
|
|
|
+ success.setToken(token);
|
|
|
+ success.setBdToken(bdToken);
|
|
|
+ return success;
|
|
|
+ } else {
|
|
|
+ // 登录失败
|
|
|
+ DownloadTokenResult fail = new DownloadTokenResult();
|
|
|
+ fail.setCode(400);
|
|
|
+ fail.setMessage(loginResp.getMsg());
|
|
|
+ return fail;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 1. GET 请求 获取滑块验证码 dragSliderCode
|
|
|
+ */
|
|
|
+ public String getHuaKuai() {
|
|
|
+ HttpHeaders headers = buildCommonHeaders();
|
|
|
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
|
|
+ params.add("method", "getDragSliderCode");
|
|
|
+ DragSliderResp dragSliderResp = anShengCrawlerRequestComponent.huaKuai(params, headers);
|
|
|
+ return dragSliderResp.getData();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建公共请求头(复刻Python headers)
|
|
|
+ */
|
|
|
+ private HttpHeaders buildCommonHeaders() {
|
|
|
+ HttpHeaders headers = new HttpHeaders();
|
|
|
+ headers.add("Host", "apps.axa.cn");
|
|
|
+ headers.add("Pragma", "no-cache");
|
|
|
+ headers.add("Cache-Control", "no-cache");
|
|
|
+ headers.add("Accept", "application/json, text/plain, */*");
|
|
|
+ headers.add("Origin", "https://apps.axa.cn");
|
|
|
+ headers.add("loginToken", "");
|
|
|
+ headers.add("User-Agent", buildUserAgent());
|
|
|
+ headers.add("Referer", "https://apps.axa.cn/astmobilefront/index.html");
|
|
|
+ headers.add("Accept-Language", "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7");
|
|
|
+ headers.add("X-Requested-With", "com.axa.ast");
|
|
|
+ return headers;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String buildUserAgent() {
|
|
|
+ return "Mozilla/5.0 (Linux; Android 9; MI 8 Build/PKQ1.180729.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/72.0.3626.121 Mobile Safari/537.36";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|