柯桥增值式服务
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

170 linhas
6.9KB

  1. package com.ningdatech.kqapi.scheduler.task;
  2. import cn.hutool.core.date.StopWatch;
  3. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  4. import com.google.common.collect.Lists;
  5. import com.ningdatech.kqapi.common.model.entity.Item;
  6. import com.ningdatech.kqapi.common.util.HttpUtil;
  7. import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu;
  8. import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMenuService;
  9. import lombok.RequiredArgsConstructor;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.apache.http.conn.ssl.NoopHostnameVerifier;
  12. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  13. import org.apache.http.conn.ssl.TrustStrategy;
  14. import org.apache.http.impl.client.CloseableHttpClient;
  15. import org.apache.http.impl.client.HttpClientBuilder;
  16. import org.apache.http.impl.client.HttpClients;
  17. import org.apache.http.ssl.SSLContexts;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.beans.factory.annotation.Value;
  20. import org.springframework.http.HttpEntity;
  21. import org.springframework.http.HttpHeaders;
  22. import org.springframework.http.MediaType;
  23. import org.springframework.http.ResponseEntity;
  24. import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
  25. import org.springframework.scheduling.annotation.Scheduled;
  26. import org.springframework.stereotype.Component;
  27. import org.springframework.util.LinkedMultiValueMap;
  28. import org.springframework.util.MultiValueMap;
  29. import org.springframework.web.client.RestTemplate;
  30. import javax.net.ssl.SSLContext;
  31. import java.io.BufferedReader;
  32. import java.io.IOException;
  33. import java.io.InputStreamReader;
  34. import java.net.*;
  35. import java.util.HashMap;
  36. import java.util.List;
  37. import java.util.Map;
  38. import java.util.Objects;
  39. import java.util.concurrent.CompletableFuture;
  40. import java.util.regex.Matcher;
  41. import java.util.regex.Pattern;
  42. /**
  43. * @author ZPF
  44. * @since 2023/08/31 18:16
  45. */
  46. @Component
  47. @Slf4j
  48. @RequiredArgsConstructor
  49. public class CheckMattersUrlTask {
  50. @Value("${hostname}")
  51. public String HOST;
  52. @Value("${spring.profiles.active}")
  53. public String active;
  54. @Autowired
  55. private INdKqZzsfwMenuService menuService;
  56. /**
  57. * 每天9点 开始校检 链接 是不是可行
  58. */
  59. @Scheduled(cron = "0 0 9 * * ?")
  60. public void doTask() throws UnknownHostException, MalformedURLException {
  61. // if (!HOST.equals(InetAddress.getLocalHost().getHostName())) {
  62. // log.info("定时器没开启或者host不对! {}:{}",
  63. // HOST,InetAddress.getLocalHost().getHostName());
  64. // return;
  65. // }
  66. StopWatch stopWatch = new StopWatch();
  67. stopWatch.start();
  68. log.info("==========开始校检事项表里的链接 会不会404 如果404就隐藏");
  69. List<NdKqZzsfwMenu> menus = menuService.list(Wrappers.lambdaQuery(NdKqZzsfwMenu.class)
  70. .eq(NdKqZzsfwMenu::getHasUrl, 1)
  71. .isNotNull(NdKqZzsfwMenu::getWebapplyurl));
  72. Integer errNum = 0;
  73. List<String> errUrls = Lists.newArrayList();
  74. for (NdKqZzsfwMenu menu : menus) {
  75. RestTemplate restTemplate = new RestTemplate(generateHttpRequestFactory());
  76. String url = "https://www.zjzwfw.gov.cn/jpaas-zjservice-server/open-api/item/getItemDetail";
  77. MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
  78. String webapplyurl = menu.getWebapplyurl();
  79. webapplyurl = webapplyurl.replace("/#","");
  80. Map<String, String> queryParams = getQueryParams(new URL(webapplyurl));
  81. String localInnerCode = queryParams.get("localInnerCode");
  82. log.info("localInnerCode :{}",localInnerCode);
  83. map.add("localInnerCode", localInnerCode);
  84. HttpHeaders headers = new HttpHeaders();
  85. headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
  86. HttpEntity<MultiValueMap<String, String>> formEntity = new HttpEntity(map, headers);
  87. ResponseEntity<Item> response = restTemplate.postForEntity(url, formEntity, Item.class);
  88. System.out.println(response.getBody());
  89. Item body = response.getBody();
  90. assert body != null;
  91. Item.ItemData itemData = body.getData();
  92. //如果是空的
  93. if(Objects.isNull(itemData.getItem())){
  94. //隐藏
  95. menuService.update(Wrappers.lambdaUpdate(NdKqZzsfwMenu.class)
  96. .eq(NdKqZzsfwMenu::getId,menu.getId())
  97. .set(NdKqZzsfwMenu::getHasUrl,0)
  98. .set(NdKqZzsfwMenu::getWebapplyurl,null));
  99. errNum += 1;
  100. errUrls.add(webapplyurl);
  101. }
  102. }
  103. log.info("不可用的链接有 :{}条 ,详情:{}",errNum,errUrls);
  104. stopWatch.stop();
  105. log.info("校检事项表里的链接结束====={}s",stopWatch.getTotalTimeSeconds());
  106. }
  107. public static void main(String[] args) throws Exception {
  108. String url = "https://www.zjzwfw.gov.cn/zjservice-fe/#/workguide?localInnerCode=3bd735e2-ddfe-4377-86b3-beec85252f21&siteCode=330000000000";
  109. url = url.replace("/#","");
  110. Map<String, String> queryParams = getQueryParams(new URL(url));
  111. System.out.println(queryParams.get("localInnerCode"));
  112. }
  113. public static Map<String, String> getQueryParams(URL url) {
  114. Map<String, String> queryPairs = new HashMap<>();
  115. String query = url.getQuery();
  116. String[] pairs = query.split("&");
  117. for (String pair : pairs) {
  118. int idx = pair.indexOf("=");
  119. try {
  120. if (idx > 0) {
  121. String key = pair.substring(0, idx);
  122. String value = pair.substring(idx + 1);
  123. queryPairs.put(key, value);
  124. }
  125. } catch (Exception e) {
  126. e.printStackTrace();
  127. }
  128. }
  129. return queryPairs;
  130. }
  131. /**
  132. * 通过该工厂类创建的RestTemplate发送请求时,可忽略https证书认证
  133. * @return 工厂
  134. */
  135. public static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory(){
  136. try{
  137. TrustStrategy acceptingTrustStrategy = ((x509Certificates, authType) -> true);
  138. SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
  139. SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
  140. HttpClientBuilder httpClientBuilder = HttpClients.custom();
  141. httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);
  142. CloseableHttpClient httpClient = httpClientBuilder.build();
  143. HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
  144. factory.setHttpClient(httpClient);
  145. return factory;
  146. }catch (Exception e){
  147. e.printStackTrace();
  148. }
  149. return null;
  150. }
  151. }