dodo hold 3 місяців тому
батько
коміт
a7dd8051b6

+ 5 - 2
molilian.api/Controllers/public/TkController.cs

@@ -240,7 +240,9 @@ namespace molilian.api.Controllers
             {
                 Content = s,
                 Ip = ip,
-                Oaid = oaid
+                Oaid = oaid,
+                RiskStrategy = string.Empty,
+                LaunchScene = 0,
             };
 
             var result = JdUnionPlus.GetFormattedObject(request);
@@ -249,7 +251,8 @@ namespace molilian.api.Controllers
             string content2 = s2.UrlDecode();
             try
             {
-                if (AlimamaPlus.ShouldIgnoreRequest(ip, oaid, string.Empty, 0, out string reason))
+
+                if (AlimamaPlus.ShouldIgnoreRequest(request, out string reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";

+ 6 - 3
molilian.api/Controllers/public/TracksController.cs

@@ -66,7 +66,7 @@ namespace molilian.api.Controllers
         }
 
         [HttpGet]
-        public async Task<ActionResult> Daily([FromQuery] int daysAgo = 0, [FromQuery] string reportDate = "", [FromQuery] bool includeToday = false, [FromQuery] bool includeYesterday = true)
+        public async Task<ActionResult> Daily([FromQuery] int daysAgo = 0, [FromQuery] string reportDate = "", [FromQuery] bool includeToday = true, [FromQuery] bool includeYesterday = true)
         {
             var dates = new List<DateTime>();
             DateTime today = DateTime.Now.Date;
@@ -93,12 +93,15 @@ namespace molilian.api.Controllers
 
             int rows = 0;
             var reportDates = new List<string>();
+            var details = new List<object>();
             foreach (var date in dates.Distinct())
             {
-                rows += await TracksCore.FlushDailyAsync(date);
+                int dateRows = await TracksCore.FlushDailyAsync(date);
+                rows += dateRows;
                 reportDates.Add(date.ToString("yyyy-MM-dd"));
+                details.Add(new { reportDate = date.ToString("yyyy-MM-dd"), rows = dateRows });
             }
-            return new APIResult(new { success = true, message = "ok", rows, reportDates });
+            return new APIResult(new { success = true, message = "ok", rows, reportDates, details });
 
         }
     }

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
molilian.api/Properties/PublishProfiles/latest.pubxml.user


+ 2 - 2
molilian.core/Core/OverrideRuleCore.cs

@@ -128,9 +128,9 @@ namespace molilian.core
 
                 if (item.use_risk_control)
                 {
-                    bool is_ignore = AlimamaPlus.ShouldIgnoreRequest(request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out _);
+                    bool is_ignore = AlimamaPlus.ShouldIgnoreRequest(request, out _);
                     if (is_ignore) continue;
-                    is_ignore = AlimamaPlus.FlowControlIgnoreRequest(request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out _);
+                    is_ignore = AlimamaPlus.FlowControlIgnoreRequest(request, out _);
                     if (is_ignore) continue;
                 }
 

+ 9 - 2
molilian.core/Core/cps/UnionCpsCore.cs

@@ -262,8 +262,15 @@ namespace molilian.core
             try
             {
                 string reason;
-                if (AlimamaPlus.FilterRiskLink(ip, oaid, content, out reason) ||
-                    AlimamaPlus.ShouldIgnoreRequest(ip, oaid, string.Empty, 0, out reason))
+                UnionParseRequest request = new()
+                {
+                    Ip = ip,
+                    Oaid = oaid,
+                    RiskStrategy = string.Empty,
+                    LaunchScene = 0,
+                };
+
+                if (AlimamaPlus.FilterRiskLink(ip, oaid, content, out reason) || AlimamaPlus.ShouldIgnoreRequest(request, out reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";

+ 8 - 1
molilian.core/Core/taoke/TkActivityCore.cs

@@ -49,7 +49,14 @@ namespace molilian.core
             try
             {
                 string reason;
-                if (AlimamaPlus.ShouldIgnoreRequest(ip, oaid, string.Empty, 0, out reason))
+                UnionParseRequest request = new()
+                {
+                    Ip = ip,
+                    Oaid = oaid,
+                    RiskStrategy = string.Empty,
+                    LaunchScene = 0,
+                };
+                if (AlimamaPlus.ShouldIgnoreRequest(request, out reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";

+ 15 - 3
molilian.core/Core/taoke/UnionCouponCore.cs

@@ -38,7 +38,7 @@ namespace molilian.core
                             result.shortLinkurl,
                             result.token,
                             result.channel,
-                            exposeTracks =$"https://api.molilian.com/tracks/track?track_id=9&unique_id={result.channel}",
+                            exposeTracks = $"https://api.molilian.com/tracks/track?track_id=9&unique_id={result.channel}",
                             clickTracks = $"https://api.molilian.com/tracks/track?track_id=10&unique_id={result.channel}",
                         });
                     }
@@ -92,8 +92,15 @@ namespace molilian.core
             try
             {
                 string reason;
+                UnionParseRequest request = new()
+                {
+                    Ip = ip,
+                    Oaid = oaid,
+                    RiskStrategy = string.Empty,
+                    LaunchScene = 0,
+                };
                 if (AlimamaPlus.FilterRiskLink(ip, oaid, content, out reason) ||
-                    AlimamaPlus.ShouldIgnoreRequest(ip, oaid, string.Empty, 0, out reason))
+                    AlimamaPlus.ShouldIgnoreRequest(request, out reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";
@@ -215,7 +222,12 @@ namespace molilian.core
             try
             {
                 var config = TkConfigCore.Get();
-                if (JdUnionPlus.ShouldIgnoreRequest(config, ip, oaid, string.Empty, 0, out string reason))
+                UnionParseRequest request = new();
+                request.Ip = ip;
+                request.Oaid = oaid;
+                request.RiskStrategy = string.Empty;
+                request.LaunchScene = 0;
+                if (JdUnionPlus.ShouldIgnoreRequest(config, request, out string reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";

+ 9 - 9
molilian.core/Core/taoke/UnionParseCore/UnionParseCore.cs

@@ -596,7 +596,7 @@ namespace molilian.core
                 }
                 //============================== 放弃转链-地区过滤 ==============================
 
-                bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out reason);
+                bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(request, out reason);
 
                 if (is_ignore2)
                 {
@@ -888,7 +888,7 @@ namespace molilian.core
                 string itemId = null;
 
                 //============================== 放弃转链-地区过滤 ==============================
-                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && request.AccountId == 0 && JdUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out string reason))
+                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && request.AccountId == 0 && JdUnionPlus.ShouldIgnoreRequest(config, request, out string reason))
                 {
                     result.link_type = JdUnionPlus.GetLinkType(result.shortLinkurl, out out_url, out itemId);
 
@@ -954,7 +954,7 @@ namespace molilian.core
                 result.proxy_name = plus._proxyName;
                 result.proxy_node = plus._proxy?.Address?.Host;
 
-                result = await plus.JdParseAsync(content, request.CommerceType, request.ClickId, result, cancellationToken);
+                result = await plus.JdParseAsync(content, request, result, cancellationToken);
             }
             catch (Exception ex)
             {
@@ -1048,7 +1048,7 @@ namespace molilian.core
                 string itemId = null;
 
                 //============================== 放弃转链-地区过滤 ==============================
-                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && request.AccountId == 0 && JdUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out string reason))
+                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && request.AccountId == 0 && JdUnionPlus.ShouldIgnoreRequest(config, request, out string reason))
                 {
                     result.link_type = JdUnionPlus.GetLinkType(result.shortLinkurl, out out_url, out itemId);
 
@@ -1129,7 +1129,7 @@ namespace molilian.core
                 result.proxy_name = plus._proxyName;
                 result.proxy_node = plus._proxy?.Address?.Host;
 
-                result = await plus.JdParseAsync(content, request.CommerceType, request.ClickId, result, cancellationToken);
+                result = await plus.JdParseAsync(content, request, result, cancellationToken);
             }
             catch (Exception ex)
             {
@@ -1317,7 +1317,7 @@ namespace molilian.core
                     }
                 }
                 //============================== 放弃转链-地区过滤 ==============================
-                if (request.AccountId == 0 && PddUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, out string reason))
+                if (request.AccountId == 0 && PddUnionPlus.ShouldIgnoreRequest(config, request, out string reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";
@@ -1327,7 +1327,7 @@ namespace molilian.core
                     return PddParseOutput(result);
                 }
 
-                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && PddUnionPlus.FlowControlIgnoreRequest(config, out reason))
+                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && PddUnionPlus.FlowControlIgnoreRequest(config, request, out reason))
                 {
                     result.success = false;
                     result.link_type = LinkTypeEnum.unknown;
@@ -1507,7 +1507,7 @@ namespace molilian.core
                     }
                 }
                 //============================== 放弃转链-地区过滤 ==============================
-                if (request.AccountId == 0 && PddUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, out string reason))
+                if (request.AccountId == 0 && PddUnionPlus.ShouldIgnoreRequest(config, request, out string reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";
@@ -1516,7 +1516,7 @@ namespace molilian.core
                     _ = TkLogCore.ParseLogAsync(result);
                     return PddParseOutput(result);
                 }
-                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && PddUnionPlus.FlowControlIgnoreRequest(config, out reason))
+                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && PddUnionPlus.FlowControlIgnoreRequest(config, request, out reason))
                 {
                     result.success = false;
                     result.link_type = LinkTypeEnum.unknown;

+ 5 - 5
molilian.core/Core/taoke/UnionParseCore/dp2dp.cs

@@ -342,7 +342,7 @@ namespace molilian.core
                 }
                 //============================== 放弃转链-地区过滤 ==============================
 
-                bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out reason);
+                bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(request, out reason);
 
                 if (is_ignore2)
                 {
@@ -593,7 +593,7 @@ namespace molilian.core
                 string itemId = null;
 
                 //============================== 放弃转链-地区过滤 ==============================
-                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && request.AccountId == 0 && JdUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out string reason))
+                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && request.AccountId == 0 && JdUnionPlus.ShouldIgnoreRequest(config, request, out string reason))
                 {
                     result.link_type = JdUnionPlus.GetLinkType(result.shortLinkurl, out out_url, out itemId);
 
@@ -654,7 +654,7 @@ namespace molilian.core
                 result.proxy_name = plus._proxyName;
                 result.proxy_node = plus._proxy?.Address?.Host;
 
-                result = await plus.JdParseAsync(content, request.CommerceType, request.ClickId, result, cancellationToken);
+                result = await plus.JdParseAsync(content, request, result, cancellationToken);
             }
             catch (Exception ex)
             {
@@ -746,7 +746,7 @@ namespace molilian.core
                 }
 
                 //============================== 放弃转链-地区过滤 ==============================
-                if (request.AccountId == 0 && PddUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, out string reason))
+                if (request.AccountId == 0 && PddUnionPlus.ShouldIgnoreRequest(config, request, out string reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";
@@ -756,7 +756,7 @@ namespace molilian.core
                     return PddParseOutput(result);
                 }
 
-                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && PddUnionPlus.FlowControlIgnoreRequest(config, out reason))
+                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && PddUnionPlus.FlowControlIgnoreRequest(config, request, out reason))
                 {
                     result.success = false;
                     result.link_type = LinkTypeEnum.unknown;

+ 20 - 12
molilian.core/Plus/Alimama/parse.cs

@@ -133,7 +133,7 @@ namespace molilian.core
 
             //============================== 放弃转链-地区过滤 ==============================
 
-            bool is_ignore2 = FlowControlIgnoreRequest(request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out string reason);
+            bool is_ignore2 = FlowControlIgnoreRequest(request, out string reason);
             string message = "放弃转链";
             if (is_ignore2)
             {
@@ -644,34 +644,42 @@ namespace molilian.core
             return false;
         }
 
-        public static bool ShouldIgnoreRequest(string ip, string oaid, string riskStrategy, int launchScene, out string reason)
+        public static bool ShouldIgnoreRequest(UnionParseRequest request, out string reason)
         {
             reason = string.Empty;
             ////2025-05-11 brw不做风控
             //if (!string.IsNullOrEmpty(riskStrategy) && !"os".Equals(riskStrategy) && launchScene != -1) return false;
 
+            switch (request.RiskStrategy)
+            {
+                case "tbpush":
+                case "brwsimilar":
+                case "icon":
+                    return false;
+            }
+
             try
             {
                 // IP和流量控制
                 var config = TkConfigCore.Get();
                 string ignorePercentageCity = config.ignorePercentageCity;
-                string? ipInfo = IP2RegionPlus.Search(ip);
-                if (!TestParseCore.InWhitelist(ip, oaid) && IgnoreRegionIncluded(ignorePercentageCity, ipInfo, out string regionInfo))
+                string? ipInfo = IP2RegionPlus.Search(request.Ip);
+                if (!TestParseCore.InWhitelist(request.Ip, request.Oaid) && IgnoreRegionIncluded(ignorePercentageCity, ipInfo, out string regionInfo))
                 {
                     reason = $"地区控制:{regionInfo}";
                     return true;
                 }
 
-                if (TkLogCore.InBlacklist(config.blacklist_oaid, oaid))
+                if (TkLogCore.InBlacklist(config.blacklist_oaid, request.Oaid))
                 {
                     reason = "OAID黑名单";
                     return true;
                 }
 
                 int limit_num = config.tk_limit_per_ip_24h;
-                if (!TestParseCore.InWhitelist(ip, oaid) && limit_num > 0)
+                if (!TestParseCore.InWhitelist(request.Ip, request.Oaid) && limit_num > 0)
                 {
-                    int num = TkLogCore.getClientRequestTotalByIp(TkChannelEnum.tb, ip);
+                    int num = TkLogCore.getClientRequestTotalByIp(TkChannelEnum.tb, request.Ip);
                     if (num >= limit_num)
                     {
                         reason = "IP控制";
@@ -679,9 +687,9 @@ namespace molilian.core
                     }
                 }
                 limit_num = config.tk_limit_per_oaid_24h;
-                if (!TestParseCore.InWhitelist(ip, oaid) && limit_num > 0)
+                if (!TestParseCore.InWhitelist(request.Ip, request.Oaid) && limit_num > 0)
                 {
-                    int num = TkLogCore.getClientRequestTotalByOAID(TkChannelEnum.tb, oaid);
+                    int num = TkLogCore.getClientRequestTotalByOAID(TkChannelEnum.tb, request.Oaid);
                     if (num >= limit_num)
                     {
                         reason = "OAID控制";
@@ -696,13 +704,13 @@ namespace molilian.core
             return false;
         }
 
-        public static bool FlowControlIgnoreRequest(string ip, string oaid, string riskStrategy, int launchScene, out string reason)
+        public static bool FlowControlIgnoreRequest(UnionParseRequest request, out string reason)
         {
             reason = string.Empty;
             ////2025-05-11 brw不做风控
             //if (!string.IsNullOrEmpty(riskStrategy) && !"os".Equals(riskStrategy) && launchScene != -1) return false;
 
-            switch (riskStrategy)
+            switch (request.RiskStrategy)
             {
                 case "tbpush":
                 case "brwsimilar":
@@ -710,7 +718,7 @@ namespace molilian.core
                     return false;
             }
 
-            if (TestParseCore.InWhitelist(ip, oaid)) return false;
+            if (TestParseCore.InWhitelist(request.Ip, request.Oaid)) return false;
 
             try
             {

+ 9 - 10
molilian.core/Plus/JDUnion/JdUnionPlus.cs

@@ -273,7 +273,7 @@ namespace molilian.core
             return Regex.IsMatch(content, pattern);
         }
 
-        public async Task<JdDataDTO> JdParseAsync(string content, int commerceType, string clickId, JdDataDTO result, CancellationToken cancellationToken = default)
+        public async Task<JdDataDTO> JdParseAsync(string content, UnionParseRequest request, JdDataDTO result, CancellationToken cancellationToken = default)
         {
 
             string message = "OK";
@@ -362,8 +362,7 @@ namespace molilian.core
                     }
                     break;
             }
-
-            if (!TestParseCore.InWhitelist(result.ip, result.oaid) && FlowControlIgnoreRequest(_config, result.riskStrategy, result.launchScene, out string reason))
+            if (!TestParseCore.InWhitelist(result.ip, result.oaid) && FlowControlIgnoreRequest(_config, request, out string reason))
             {
                 result.success = false;
                 result.link_type = LinkTypeEnum.unknown;
@@ -382,33 +381,33 @@ namespace molilian.core
                 return result;
             }
 
-            switch (commerceType)
+            switch (request.CommerceType)
             {
                 case 1:
                 case 2:
                     result.success = false;
                     result.message = "放弃转链";
-                    result.reason = $"厂商放弃{commerceType}";
+                    result.reason = $"厂商放弃{request.CommerceType}";
                     return result;
             }
 
             switch (_account.work_mode)
             {
                 case JdUnionWorkMode.SiteApi:
-                    result = await GetPromotionBySiteAsync(result, url, clickId, cancellationToken);
+                    result = await GetPromotionBySiteAsync(result, url, request.ClickId, cancellationToken);
                     break;
                 case JdUnionWorkMode.AffApi:
-                    result = await GetPromotionByAffAsync(result, url, clickId, cancellationToken);
+                    result = await GetPromotionByAffAsync(result, url, request.ClickId, cancellationToken);
                     break;
                 case JdUnionWorkMode.Ddx:
-                    result = await GetPromotionByDdxAsync(result, url, clickId, cancellationToken);
+                    result = await GetPromotionByDdxAsync(result, url, request.ClickId, cancellationToken);
                     break;
                 case JdUnionWorkMode.JingFen:
-                    result = await GetPromotionByCrawlerJingfenAsync(result, url, clickId, cancellationToken);
+                    result = await GetPromotionByCrawlerJingfenAsync(result, url, request.ClickId, cancellationToken);
                     break;
                 case JdUnionWorkMode.Crawler:
                 default:
-                    result = await GetPromotionByCrawlerAsync(result, url, clickId, cancellationToken);
+                    result = await GetPromotionByCrawlerAsync(result, url, request.ClickId, cancellationToken);
                     break;
             }
             return result;

+ 22 - 7
molilian.core/Plus/JDUnion/base.cs

@@ -108,24 +108,31 @@ namespace molilian.core
             return body;
         }
 
-        public static bool ShouldIgnoreRequest(TkConfigDTO config, string ip, string oaid, string riskStrategy, int launchScene, out string reason)
+        public static bool ShouldIgnoreRequest(TkConfigDTO config, UnionParseRequest request, out string reason)
         {
             reason = string.Empty;
             //2025-06-24 brw不做风控
             //if (!string.IsNullOrEmpty(riskStrategy) && !"os".Equals(riskStrategy) && launchScene != -1) return false;
 
+            switch (request.RiskStrategy)
+            {
+                case "tbpush":
+                case "brwsimilar":
+                case "icon":
+                    return false;
+            }
             try
             {
                 // IP和流量控制
                 string ignorePercentageCity = config.jdIgnorePercentageCity;
-                string? ipInfo = IP2RegionPlus.Search(ip);
-                if (!TestParseCore.InWhitelist(ip, oaid) && AlimamaPlus.IgnoreRegionIncluded(ignorePercentageCity, ipInfo, out string regionInfo))
+                string? ipInfo = IP2RegionPlus.Search(request.Ip);
+                if (!TestParseCore.InWhitelist(request.Ip, request.Oaid) && AlimamaPlus.IgnoreRegionIncluded(ignorePercentageCity, ipInfo, out string regionInfo))
                 {
                     reason = $"地区控制:{regionInfo}";
                     return true;
                 }
 
-                if (TkLogCore.InBlacklist(config.blacklist_oaid, oaid))
+                if (TkLogCore.InBlacklist(config.blacklist_oaid, request.Oaid))
                 {
                     reason = "OAID黑名单";
                     return true;
@@ -134,7 +141,7 @@ namespace molilian.core
                 int limit_num = config.jd_limit_per_ip_24h;
                 if (limit_num > 0)
                 {
-                    int num = TkLogCore.getClientRequestTotalByIp(TkChannelEnum.jd, ip);
+                    int num = TkLogCore.getClientRequestTotalByIp(TkChannelEnum.jd, request.Ip);
                     if (num >= limit_num)
                     {
                         reason = "IP控制";
@@ -144,7 +151,7 @@ namespace molilian.core
                 limit_num = config.jd_limit_per_oaid_24h;
                 if (limit_num > 0)
                 {
-                    int num = TkLogCore.getClientRequestTotalByOAID(TkChannelEnum.jd, oaid);
+                    int num = TkLogCore.getClientRequestTotalByOAID(TkChannelEnum.jd, request.Oaid);
                     if (num >= limit_num)
                     {
                         reason = "OAID控制";
@@ -159,11 +166,19 @@ namespace molilian.core
             return false;
         }
 
-        public static bool FlowControlIgnoreRequest(TkConfigDTO config, string riskStrategy, int launchScene, out string reason)
+        public static bool FlowControlIgnoreRequest(TkConfigDTO config, UnionParseRequest request, out string reason)
         {
             reason = string.Empty;
             //if (!string.IsNullOrEmpty(riskStrategy) && !"os".Equals(riskStrategy) && launchScene != -1) return false;
 
+            switch (request.RiskStrategy)
+            {
+                case "tbpush":
+                case "brwsimilar":
+                case "icon":
+                    return false;
+            }
+
             try
             {
                 // IP和流量控制

+ 5 - 6
molilian.core/Plus/pdd/PddUnionPlus.cs

@@ -284,12 +284,11 @@ namespace molilian.core
             if (string.IsNullOrWhiteSpace(goods_url)) return RrecheckGoodsIdResult.Empty;
             try
             {
-                string precheckClientId = (config?.pdd_precheck_client_id ?? TkConfigDTO.DefaultPddPrecheckClientId).Trim();
-                string precheckClientSecret = (config?.pdd_precheck_client_secret ?? TkConfigDTO.DefaultPddPrecheckClientSecret).Trim();
-                string precheckPid = (config?.pdd_precheck_pid ?? TkConfigDTO.DefaultPddPrecheckPid).Trim();
-                if (string.IsNullOrWhiteSpace(precheckClientId) ||
-                    string.IsNullOrWhiteSpace(precheckClientSecret) ||
-                    string.IsNullOrWhiteSpace(precheckPid))
+                string precheckClientId = config?.pdd_precheck_client_id;
+                string precheckClientSecret = config?.pdd_precheck_client_secret;
+                string precheckPid = config?.pdd_precheck_pid;
+
+                if (string.IsNullOrWhiteSpace(precheckClientId) || string.IsNullOrWhiteSpace(precheckClientSecret) || string.IsNullOrWhiteSpace(precheckPid))
                 {
                     _ = new LoggerLibrary("PddUnion", "PrecheckGoodsIdAsync.Config")
                         .Info(goods_url, "precheck config missing")

+ 26 - 7
molilian.core/Plus/pdd/base.cs

@@ -51,23 +51,33 @@ namespace molilian.core
             }
         }
 
-        public static bool ShouldIgnoreRequest(TkConfigDTO config, string ip, string oaid, out string reason)
+        public static bool ShouldIgnoreRequest(TkConfigDTO config, UnionParseRequest request, out string reason)
         {
             reason = string.Empty;
+
+
+            switch (request.RiskStrategy)
+            {
+                case "tbpush":
+                case "brwsimilar":
+                case "icon":
+                    return false;
+            }
+
             try
             {
-                if (TestParseCore.InWhitelist(ip, oaid)) return false;
+                if (TestParseCore.InWhitelist(request.Ip, request.Oaid)) return false;
 
                 // IP和流量控制
                 string ignorePercentageCity = config.pddIgnorePercentageCity;
-                string? ipInfo = IP2RegionPlus.Search(ip);
+                string? ipInfo = IP2RegionPlus.Search(request.Ip);
                 if (AlimamaPlus.IgnoreRegionIncluded(ignorePercentageCity, ipInfo, out string regionInfo))
                 {
                     reason = $"地区控制:{regionInfo}";
                     return true;
                 }
 
-                if (TkLogCore.InBlacklist(config.blacklist_oaid, oaid))
+                if (TkLogCore.InBlacklist(config.blacklist_oaid, request.Oaid))
                 {
                     reason = "OAID黑名单";
                     return true;
@@ -76,7 +86,7 @@ namespace molilian.core
                 int limit_num = config.pdd_limit_per_ip_24h;
                 if (limit_num > 0)
                 {
-                    int num = TkLogCore.getClientRequestTotalByIp(TkChannelEnum.pdd, ip);
+                    int num = TkLogCore.getClientRequestTotalByIp(TkChannelEnum.pdd, request.Ip);
                     if (num >= limit_num)
                     {
                         reason = "IP控制";
@@ -86,7 +96,7 @@ namespace molilian.core
                 limit_num = config.pdd_limit_per_oaid_24h;
                 if (limit_num > 0)
                 {
-                    int num = TkLogCore.getClientRequestTotalByOAID(TkChannelEnum.pdd, oaid);
+                    int num = TkLogCore.getClientRequestTotalByOAID(TkChannelEnum.pdd, request.Oaid);
                     if (num >= limit_num)
                     {
                         reason = "OAID控制";
@@ -102,9 +112,18 @@ namespace molilian.core
             return false;
         }
 
-        public static bool FlowControlIgnoreRequest(TkConfigDTO config, out string reason)
+        public static bool FlowControlIgnoreRequest(TkConfigDTO config, UnionParseRequest request, out string reason)
         {
             reason = string.Empty;
+
+            switch (request.RiskStrategy)
+            {
+                case "tbpush":
+                case "brwsimilar":
+                case "icon":
+                    return false;
+            }
+
             try
             {
                 // IP和流量控制

+ 7 - 5
track_report_schema_fix.sql

@@ -1,6 +1,6 @@
 -- Fix track report dimensions:
 -- 1. track_links stores platform and typename separately.
--- 2. track_daily_report uniqueness is based on the monitored link, not display dimensions.
+-- 2. track_daily_report uniqueness is based on the monitored link + metric scene.
 
 SET @sql = (
   SELECT IF(
@@ -62,7 +62,7 @@ UPDATE `track_daily_report` d
 JOIN `track_links` l ON d.`track_link_id` = l.`id`
 SET d.`platform` = l.`platform`,
     d.`typename` = l.`typename`,
-    d.`scene` = l.`scene`,
+    d.`scene` = CASE WHEN d.`scene` <> '' THEN d.`scene` ELSE l.`scene` END,
     d.`unique_id` = l.`unique_id`;
 
 DROP TEMPORARY TABLE IF EXISTS `tmp_track_daily_keep`;
@@ -71,22 +71,24 @@ DROP TEMPORARY TABLE IF EXISTS `tmp_track_daily_merge`;
 CREATE TEMPORARY TABLE `tmp_track_daily_keep` AS
 SELECT MIN(`id`) AS `id`
 FROM `track_daily_report`
-GROUP BY `report_date`, `event_type`, `track_link_id`;
+GROUP BY `report_date`, `event_type`, `track_link_id`, `scene`;
 
 CREATE TEMPORARY TABLE `tmp_track_daily_merge` AS
   SELECT
     `report_date`,
     `event_type`,
     `track_link_id`,
+    `scene`,
     MAX(`event_count`) AS `event_count`
   FROM `track_daily_report`
-  GROUP BY `report_date`, `event_type`, `track_link_id`;
+  GROUP BY `report_date`, `event_type`, `track_link_id`, `scene`;
 
 UPDATE `track_daily_report` d
 JOIN `tmp_track_daily_merge` m
   ON d.`report_date` = m.`report_date`
    AND d.`event_type` = m.`event_type`
    AND d.`track_link_id` = m.`track_link_id`
+   AND d.`scene` = m.`scene`
 SET d.`event_count` = m.`event_count`
 WHERE d.`id` IN (SELECT `id` FROM `tmp_track_daily_keep`);
 
@@ -99,4 +101,4 @@ DROP TEMPORARY TABLE `tmp_track_daily_keep`;
 DROP TEMPORARY TABLE `tmp_track_daily_merge`;
 
 ALTER TABLE `track_daily_report`
-  ADD UNIQUE KEY `uk_track_daily` (`report_date`, `event_type`, `track_link_id`);
+  ADD UNIQUE KEY `uk_track_daily` (`report_date`, `event_type`, `track_link_id`, `scene`);

Деякі файли не було показано, через те що забагато файлів було змінено