Browse Source

feat: ip归属地

(cherry picked from commit 0db9e6dbbc70ac16f70310c8b3f1dea1bcf6c2c7)
wangcheng 2 năm trước cách đây
mục cha
commit
43d12aae48

+ 37 - 3
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/PlanNewOutController.java

@@ -3,6 +3,7 @@ package com.webflux.launchadmin.mysql.controller.planNew;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
@@ -13,6 +14,7 @@ import com.webflux.launchadmin.mysql.controller.planNew.res.*;
 import com.webflux.launchadmin.mysql.entity.listening.ListeningPlanNew;
 import com.webflux.launchadmin.mysql.entity.planNew.*;
 import com.webflux.launchadmin.mysql.service.planNew.goGenerate.GoGenerateService;
+import com.webflux.launchadmin.mysql.service.planNew.ipAnalyze.IpAnalyzeServiceInterface;
 import com.webflux.launchadmin.mysql.service.planNew.structure.GoRequest;
 import com.webflux.launchadmin.mysql.service.planNew.structure.Item;
 import com.webflux.launchcommon.returnObj.RStatus;
@@ -22,10 +24,14 @@ import org.springframework.data.domain.Sort;
 import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
 import org.springframework.data.relational.core.query.Criteria;
 import org.springframework.data.relational.core.query.Query;
+import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
+import java.net.InetSocketAddress;
+import java.net.http.HttpRequest;
 import java.time.ZonedDateTime;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
@@ -49,6 +55,9 @@ public class PlanNewOutController {
     @Resource
     private GoGenerateService goGenerateService;
 
+    @Resource
+    private IpAnalyzeServiceInterface ipAnalyzeServiceInterface;
+
 
 
     private static final ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<String,Integer>();
@@ -171,7 +180,16 @@ public class PlanNewOutController {
      * @return {@link Mono}<{@link RStatus}<{@link DataLists}>>
      */
     @PostMapping("hfoInfo")
-    public Mono<RStatus<DataLists>> hfoInfo(@RequestBody HfoRequest request){
+    public Mono<RStatus<DataLists>> hfoInfo(@RequestBody HfoRequest request, ServerWebExchange exchange){
+        ServerHttpRequest httpRequest = exchange.getRequest();
+        InetSocketAddress remoteAddress = httpRequest.getRemoteAddress();
+        String ipAddress;
+        if (remoteAddress != null) {
+            ipAddress = remoteAddress.getAddress().getHostAddress();
+        } else {
+            ipAddress = null;
+        }
+
         Mono<PlanNew> code0 = template.selectOne(Query.query(Criteria.where("code").is(request.getCode())), PlanNew.class)
                 .switchIfEmpty(Mono.error(new BaseException(" code错误")))
                 .onErrorResume(throwable -> Mono.error(new Exception(throwable.getMessage())));
@@ -246,7 +264,23 @@ public class PlanNewOutController {
                     List<Material> collect1 = t4.stream().filter(fff -> !listTxt.contains(fff.id())).collect(Collectors.toList());
                     Material material = collect1.get(RandomUtil.randomInt(0,collect1.size()));
                     listTxt.add(material.id());
-                    h5ImageAndText.setName(material.content());
+                    String content = material.content();
+                    // 解析ip归属地
+                    if (StrUtil.isNotBlank(ipAddress)) {
+                        JSONObject ipInfo = ipAnalyzeServiceInterface.getIpInfo(ipAddress);
+                        if (null != ipInfo) {
+                            String city = ipInfo.getStr("city");
+                            if (StrUtil.isNotBlank(city)) {
+                                content = city + content;
+                            } else {
+                                String province = ipInfo.getStr("region");
+                                if (StrUtil.isNotBlank(province)) {
+                                    content = province + content;
+                                }
+                            }
+                        }
+                    }
+                    h5ImageAndText.setName(content);
                     h5ImageAndText.setRemark(material.remark());
                     h5ImageAndTexts.add(h5ImageAndText);
                 });
@@ -308,7 +342,7 @@ public class PlanNewOutController {
         return RStatus.successList(dataListsMono1);
     }
 
-    
+
     private ReturnLoop getReturnLoop() {
         return new ReturnLoop(-1L, null, null, null, null, null, null, null, null, null, null, null, null, null);
     }

+ 49 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/planNew/ipAnalyze/IpAnalyzeServiceImpl.java

@@ -0,0 +1,49 @@
+package com.webflux.launchadmin.mysql.service.planNew.ipAnalyze;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpHeaders;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+
+/**
+ * ip解析
+ *
+ * @author: wangcheng
+ * @date: 2024/7/2 15:03
+ */
+@Slf4j
+@Service
+public class IpAnalyzeServiceImpl implements IpAnalyzeServiceInterface {
+
+    @Override
+    public JSONObject getIpInfo(String ip) {
+        HttpClient httpClient = HttpClient.newHttpClient();
+        HttpRequest httpRequest = HttpRequest.newBuilder()
+                .uri(URI.create("https://c2ba.api.huachen.cn/ip?ip=" + ip))
+                .GET()
+                .header("Authorization", "APPCODE 757a4a0cb5234bf283d68ec584c96607")
+                .build();
+        try {
+            HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
+            int statusCode = httpResponse.statusCode();
+            if (statusCode != 200) {
+                return null;
+            }
+            String responseBody = httpResponse.body();
+            log.info("ip解析result: {}", responseBody);
+            JSONObject jsonObject = JSONUtil.parseObj(responseBody);
+            if (jsonObject.getInt("ret") == 200) {
+                return jsonObject.getJSONObject("data");
+            }
+        } catch (Exception e) {
+            log.error("ip解析异常", e);
+        }
+        return null;
+    }
+}

+ 13 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/planNew/ipAnalyze/IpAnalyzeServiceInterface.java

@@ -0,0 +1,13 @@
+package com.webflux.launchadmin.mysql.service.planNew.ipAnalyze;
+
+import cn.hutool.json.JSONObject;
+
+/**
+ * ip解析
+ *
+ * @author: wangcheng
+ * @date: 2024/7/2 15:01
+ */
+public interface IpAnalyzeServiceInterface {
+    JSONObject getIpInfo(String ip);
+}

+ 25 - 9
launch-admin/src/test/java/com/webflux/launchadmin/LaunchAdminApplicationTests.java

@@ -3,20 +3,36 @@ package com.webflux.launchadmin;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Spliterator;
-import java.util.concurrent.Phaser;
-import java.util.stream.Stream;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpHeaders;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
 
 @SpringBootTest
 class LaunchAdminApplicationTests {
 
-@Test
-    public void te(){
+    @Test
+    public void te() {
+        HttpClient httpClient = HttpClient.newHttpClient();
+        HttpRequest httpRequest = HttpRequest.newBuilder()
+                .uri(URI.create("https://c2ba.api.huachen.cn/ip?ip=58.211.174.206"))
+                .GET()
+                .header("Authorization", "APPCODE 757a4a0cb5234bf283d68ec584c96607")
+                .build();
+        try {
+            HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
 
+            int statusCode = httpResponse.statusCode();
+            HttpHeaders headers = httpResponse.headers();
+            String responseBody = httpResponse.body();
 
-}
+            System.out.println("Status Code: " + statusCode);
+            System.out.println("Headers: " + headers);
+            System.out.println("Response Body: " + responseBody);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 
 }