yumeng před 1 měsícem
rodič
revize
3009f3d86f

+ 41 - 1
src/main/java/com/adx/tencent/honor/controller/HonorTrackingController.java

@@ -192,7 +192,7 @@ public class HonorTrackingController {
         if (placement.getBidFloor() > 0) imp.put("bidFloor", placement.getBidFloor());
 
         Map<String, Object> device = new LinkedHashMap<>();
-        device.put("ip", firstParam(params, "ip", "m6a") != null ? firstParam(params, "ip", "m6a") : clientIp(request));
+        putDeviceIp(device, firstParam(params, "ip", "m6a"), firstParam(params, "ipv6"), clientIp(request));
         String rawUa = firstParam(params, "ua", "user_agent", "useragent");
         String normalizedUa = normalizeUserAgent(rawUa, resolved.platform());
         device.put("ua", normalizedUa);
@@ -377,6 +377,46 @@ public class HonorTrackingController {
         }
     }
 
+    private static void putDeviceIp(Map<String, Object> device, String ipv4Candidate, String ipv6Candidate, String fallbackIp) {
+        String ipv4 = normalizeIp(ipv4Candidate);
+        String ipv6 = normalizeIp(ipv6Candidate);
+        String fallback = normalizeIp(fallbackIp);
+        if (ipv4 == null && ipv6 == null && fallback != null) {
+            if (isIpv6(fallback)) {
+                ipv6 = fallback;
+            } else {
+                ipv4 = fallback;
+            }
+        }
+        if (ipv4 != null && isIpv6(ipv4)) {
+            ipv6 = ipv4;
+            ipv4 = null;
+        }
+        if (ipv6 != null && !isIpv6(ipv6)) {
+            if (ipv4 == null) {
+                ipv4 = ipv6;
+            }
+            ipv6 = null;
+        }
+        if (ipv4 != null) {
+            device.put("ip", ipv4);
+        }
+        if (ipv6 != null) {
+            device.put("ipv6", ipv6);
+        }
+    }
+
+    private static String normalizeIp(String value) {
+        if (value == null || value.isBlank()) {
+            return null;
+        }
+        return value.trim();
+    }
+
+    private static boolean isIpv6(String value) {
+        return value != null && value.contains(":");
+    }
+
     private static String clientIp(HttpServletRequest request) {
         String xff = request.getHeader("X-Forwarded-For");
         if (xff != null && !xff.isBlank()) {

+ 41 - 2
src/main/java/com/adx/tencent/httpapi/TrackingController.java

@@ -397,8 +397,7 @@ public class TrackingController {
 
         Map<String, Object> device = new LinkedHashMap<>();
         // S2S架构:腾讯服务器回调,真实用户IP通过参数传递,优先使用参数中的IP
-        String paramIp = params.get("ip");
-        device.put("ip", (paramIp != null && !paramIp.isBlank()) ? paramIp : clientIp(request));
+        putDeviceIp(device, params.get("ip"), params.get("ipv6"), clientIp(request));
         // 优先使用真实设备UA,无则根据平台构造合理的移动设备UA
         String ua = firstParam(params, "ua", "user_agent", "useragent");
         if (ua == null || ua.isBlank()) {
@@ -458,6 +457,46 @@ public class TrackingController {
         return "Mozilla/5.0 (Linux; Android 14; Pixel 8 Build/UQ1A.240205.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.71 Mobile Safari/537.36";
     }
 
+    private static void putDeviceIp(Map<String, Object> device, String ipv4Candidate, String ipv6Candidate, String fallbackIp) {
+        String ipv4 = normalizeIp(ipv4Candidate);
+        String ipv6 = normalizeIp(ipv6Candidate);
+        String fallback = normalizeIp(fallbackIp);
+        if (ipv4 == null && ipv6 == null && fallback != null) {
+            if (isIpv6(fallback)) {
+                ipv6 = fallback;
+            } else {
+                ipv4 = fallback;
+            }
+        }
+        if (ipv4 != null && isIpv6(ipv4)) {
+            ipv6 = ipv4;
+            ipv4 = null;
+        }
+        if (ipv6 != null && !isIpv6(ipv6)) {
+            if (ipv4 == null) {
+                ipv4 = ipv6;
+            }
+            ipv6 = null;
+        }
+        if (ipv4 != null) {
+            device.put("ip", ipv4);
+        }
+        if (ipv6 != null) {
+            device.put("ipv6", ipv6);
+        }
+    }
+
+    private static String normalizeIp(String value) {
+        if (value == null || value.isBlank()) {
+            return null;
+        }
+        return value.trim();
+    }
+
+    private static boolean isIpv6(String value) {
+        return value != null && value.contains(":");
+    }
+
     private Map<String, Object> baiduUidFromParams(Map<String, String> p) {
         Map<String, Object> uid = new LinkedHashMap<>();
         putUid(uid, "did", firstParam(p, "did", "imei"));

+ 41 - 1
src/main/java/com/adx/tencent/kuaishou/controller/KuaishouTrackingController.java

@@ -220,7 +220,7 @@ public class KuaishouTrackingController {
         }
 
         Map<String, Object> device = new LinkedHashMap<>();
-        device.put("ip", firstParam(params, "ip") != null ? firstParam(params, "ip") : clientIp(request));
+        putDeviceIp(device, firstParam(params, "ip"), firstParam(params, "ipv6"), clientIp(request));
         device.put("ua", normalizeUserAgent(firstParam(params, "ua"), resolved.platform()));
         device.put("deviceType", 1);
         int os = baiduOsForPlatform(resolved.platform());
@@ -490,6 +490,46 @@ public class KuaishouTrackingController {
         return base + "-" + Instant.now().toEpochMilli();
     }
 
+    private static void putDeviceIp(Map<String, Object> device, String ipv4Candidate, String ipv6Candidate, String fallbackIp) {
+        String ipv4 = normalizeIp(ipv4Candidate);
+        String ipv6 = normalizeIp(ipv6Candidate);
+        String fallback = normalizeIp(fallbackIp);
+        if (ipv4 == null && ipv6 == null && fallback != null) {
+            if (isIpv6(fallback)) {
+                ipv6 = fallback;
+            } else {
+                ipv4 = fallback;
+            }
+        }
+        if (ipv4 != null && isIpv6(ipv4)) {
+            ipv6 = ipv4;
+            ipv4 = null;
+        }
+        if (ipv6 != null && !isIpv6(ipv6)) {
+            if (ipv4 == null) {
+                ipv4 = ipv6;
+            }
+            ipv6 = null;
+        }
+        if (ipv4 != null) {
+            device.put("ip", ipv4);
+        }
+        if (ipv6 != null) {
+            device.put("ipv6", ipv6);
+        }
+    }
+
+    private static String normalizeIp(String value) {
+        if (value == null || value.isBlank()) {
+            return null;
+        }
+        return value.trim();
+    }
+
+    private static boolean isIpv6(String value) {
+        return value != null && value.contains(":");
+    }
+
     private String firstParam(Map<String, String> params, String... keys) {
         for (String key : keys) {
             String value = params.get(key);