|
|
@@ -0,0 +1,134 @@
|
|
|
+package com.jzg.quotation.zhongmei.crawler.service.Impl;
|
|
|
+
|
|
|
+import cn.hutool.crypto.digest.MD5;
|
|
|
+import com.alibaba.fastjson2.JSON;
|
|
|
+import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
|
|
|
+import com.jzg.quotation.commons.component.RequestComponent;
|
|
|
+import com.jzg.quotation.commons.utils.RequestObjectConversion;
|
|
|
+import com.jzg.quotation.zhongmei.crawler.component.ZmCrawlerRequestComponent;
|
|
|
+import com.jzg.quotation.zhongmei.crawler.constant.ZmCrawlerImageConstant;
|
|
|
+import com.jzg.quotation.zhongmei.crawler.constant.enums.RequestUrl;
|
|
|
+import com.jzg.quotation.zhongmei.crawler.entity.Request.ZmCrawlerImageCookieRequest;
|
|
|
+import com.jzg.quotation.zhongmei.crawler.entity.Request.ZmCrawlerImageImportRequest;
|
|
|
+import com.jzg.quotation.zhongmei.crawler.entity.Response.ZmCrawlerImageImportResponse;
|
|
|
+import com.jzg.quotation.zhongmei.crawler.entity.po.ZmCrawlerOrder;
|
|
|
+import com.jzg.quotation.zhongmei.crawler.service.ZhongMeiCrawlerQuoteProcessService;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import org.springframework.http.HttpHeaders;
|
|
|
+import org.springframework.http.ResponseEntity;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.LinkedMultiValueMap;
|
|
|
+import org.springframework.util.MultiValueMap;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+import org.jsoup.Jsoup;
|
|
|
+import org.jsoup.nodes.Document;
|
|
|
+import org.jsoup.nodes.Element;
|
|
|
+import org.jsoup.select.Elements;
|
|
|
+
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class ZhongMeiCrawlerQuoteProcessServiceImpl implements ZhongMeiCrawlerQuoteProcessService {
|
|
|
+
|
|
|
+ private final RequestComponent requestComponent;
|
|
|
+
|
|
|
+ private final ZmCrawlerRequestComponent zmCrawlerRequestComponent;
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void uploadImage(String authorization, ZmCrawlerOrder crawlerOrder, List<InsuranceImageVo> imageVoList) {
|
|
|
+
|
|
|
+ // 1. 获取上传页面的cookie
|
|
|
+ ZmCrawlerImageCookieRequest request = new ZmCrawlerImageCookieRequest(crawlerOrder.getBussinessNo(), authorization);
|
|
|
+ MultiValueMap<String, String> param = RequestObjectConversion.convertMultiValueStringMap(request);
|
|
|
+ ResponseEntity<String> response = requestComponent.baseGet(ZmCrawlerImageConstant.IMAGE_SYSTEM_URL, param, String.class,null);
|
|
|
+ System.out.println(response.getBody());
|
|
|
+ // 2. 使用 Jsoup 解析 HTML
|
|
|
+ Document doc = Jsoup.parse(response.getBody());
|
|
|
+ String actionUrl = doc.selectFirst("form[action][method]").attr("action");
|
|
|
+ Elements inputs = doc.select("input[value]");
|
|
|
+ String xml = inputs.get(0).attr("value");
|
|
|
+ String code = inputs.get(1).attr("value");
|
|
|
+ String format = inputs.get(2).attr("value");
|
|
|
+ System.out.println(actionUrl);
|
|
|
+
|
|
|
+ // 3. 准备 POST 请求数据
|
|
|
+ MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
|
|
|
+ parts.add("xml", xml);
|
|
|
+ parts.add("code", code);
|
|
|
+ parts.add("format", format);
|
|
|
+ HttpHeaders headers = new HttpHeaders();
|
|
|
+ headers.set("Host", "image.chinacoal-ins.com");
|
|
|
+ headers.set("Connection", "keep-alive");
|
|
|
+ headers.set("Cache-Control", "max-age=0");
|
|
|
+ headers.set("sec-ch-ua", "\"Chromium\";v=\"104\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"104\"");
|
|
|
+ headers.set("sec-ch-ua-mobile", "?0");
|
|
|
+ headers.set("sec-ch-ua-platform", "\"Windows\"");
|
|
|
+ headers.set("Upgrade-Insecure-Requests", "1");
|
|
|
+ headers.set("Origin", "https://hxkscd.chinacoal-ins.com");
|
|
|
+ headers.set("Content-Type", "application/x-www-form-urlencoded");
|
|
|
+ headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36");
|
|
|
+ headers.set("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");
|
|
|
+ headers.set("Sec-Fetch-Site", "same-site");
|
|
|
+ headers.set("Sec-Fetch-Mode", "navigate");
|
|
|
+ headers.set("Sec-Fetch-Dest", "document");
|
|
|
+ headers.set("Referer", "https://hxkscd.chinacoal-ins.com/");
|
|
|
+ headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
|
|
|
+ ResponseEntity<String> res = requestComponent.formData(actionUrl,parts,String.class,headers);
|
|
|
+ System.out.println(res.getBody());
|
|
|
+ String responseText = res.getBody();
|
|
|
+ // 5. 提取 XML 返回内容
|
|
|
+ String userCode = extract(responseText, "<USER_CODE>(.*?)</USER_CODE>");
|
|
|
+ String userName = extract(responseText, "<USER_NAME>(.*?)</USER_NAME>");
|
|
|
+ String orgName = extract(responseText, "<ORG_NAME>(.*?)</ORG_NAME>");
|
|
|
+ String orgCode = extract(responseText, "<ORG_CODE>(.*?)</ORG_CODE>");
|
|
|
+ List<String> cookies = res.getHeaders().get("Set-Cookie");
|
|
|
+ System.out.println("CREATE_USER = " + userCode);
|
|
|
+ System.out.println("CREATE_USERNAME = " + userName);
|
|
|
+ System.out.println("UPLOAD_ORG = " + orgName);
|
|
|
+ System.out.println("BIZ_ORG = " + orgCode);
|
|
|
+
|
|
|
+ // 6.导入图片并组装提交入参
|
|
|
+ //生成影像批次号,如果存在多次上传该字段需保存
|
|
|
+ String batchId = MD5.create().digestHex(ZmCrawlerImageConstant.ZM_IMAGE_BATCHID_PRE + crawlerOrder.getBussinessNo());
|
|
|
+
|
|
|
+ //导入影像
|
|
|
+ ZmCrawlerImageImportResponse importResponse = null;
|
|
|
+// Map<String, List<Map<String, String>>> docCodeAndImage = new HashMap<>();
|
|
|
+ for (InsuranceImageVo image : imageVoList) {
|
|
|
+ List<InsuranceImageVo.ImageDTO> imageBase64List = image.getImageBase64List();
|
|
|
+ if (imageBase64List != null && !imageBase64List.isEmpty()) {
|
|
|
+ //判断照片类型是否属于中煤影像类型,不属于则默认为01
|
|
|
+ String codeStr = Arrays.stream(ZmCrawlerImageConstant.ZM_IMAGE_TYPE).collect(Collectors.toList()).contains(image.getImageCode()) ? image.getImageCode() : "01";
|
|
|
+ ZmCrawlerImageImportRequest imageImportRequest = new ZmCrawlerImageImportRequest(imageBase64List.size(), crawlerOrder.getBussinessNo(), codeStr, batchId);
|
|
|
+ importResponse = zmCrawlerRequestComponent.importImage(imageImportRequest, imageBase64List,cookies);
|
|
|
+ System.out.println(JSON.toJSON(importResponse));
|
|
|
+// if (importResponse != null) {
|
|
|
+// Map<String, Object> result = importResponse.getResult();
|
|
|
+// List<Map<String, String>> maps = docCodeAndImage.get(imageImportRequest.getDocCode());
|
|
|
+// List<Map<String, String>> imageResList = new ArrayList<>();
|
|
|
+// //先判断是否存在一样的图片类型
|
|
|
+// if (maps != null) {
|
|
|
+// imageResList = maps;
|
|
|
+// }
|
|
|
+// for (int i = 0; i < result.size()-1; i++) {
|
|
|
+// imageResList.add((Map<String, String>)result.get(String.valueOf(i)));
|
|
|
+// }
|
|
|
+// docCodeAndImage.put(imageImportRequest.getDocCode(), imageResList);
|
|
|
+// }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String extract(String text, String pattern) {
|
|
|
+ Matcher matcher = Pattern.compile(pattern).matcher(text);
|
|
|
+ return matcher.find() ? matcher.group(1) : "";
|
|
|
+ }
|
|
|
+}
|