浏览代码

重构 UnionParseCore.UnionParseAsync 方法使用新参数对象

dodo hold 10 月之前
父节点
当前提交
b484233e30

+ 1 - 0
.gitignore

@@ -27,3 +27,4 @@ stats.html
 **/bin/
 **/obj/
 **/obj/Debug/
+.claude/*

+ 1 - 1
molilian.api/Controllers/public/TkActivityController.cs

@@ -40,7 +40,7 @@ namespace molilian.api.Controllers
             //正文
             var page_id = form.Read("page_id", string.Empty);
             var item_id = form.Read("item_id", string.Empty);
-            var strategy_id = form.Read("strategy_id", string.Empty);
+            var strategy_id = form.Read("strategy_id", "1");
             var ip = form.Read("ip", string.Empty);
             var oaid = form.Read("oaid", string.Empty);
 

+ 51 - 3
molilian.api/Controllers/public/TkController.cs

@@ -54,6 +54,7 @@ namespace molilian.api.Controllers
             var riskStrategy = form.Read("riskStrategy", string.Empty);
             var launchScene = form.Read<int>("launchScene", -1);
             var special_text = form.Read<int>("special_text", -1);
+            var query_text = form.Read("query_text", string.Empty);
 
 
 
@@ -79,7 +80,22 @@ namespace molilian.api.Controllers
             {
                 return new APIResult(new { success = false, message = "验证错误4" }, APIResultCodeEnum.Unauthorized);
             }
-            return await UnionParseCore.UnionParseAsync(content, channel, commerceType, ip, oaid, riskStrategy, launchScene, 0, special_text, clickId, type);
+            var request = new UnionParseRequest
+            {
+                Content = content,
+                Channel = channel,
+                CommerceType = commerceType,
+                Ip = ip,
+                Oaid = oaid,
+                RiskStrategy = riskStrategy,
+                LaunchScene = launchScene,
+                AccountId = 0,
+                SpecialText = special_text,
+                QueryText = query_text,
+                ClickId = clickId,
+                Type = type
+            };
+            return await UnionParseCore.UnionParseAsync(request);
         }
 
         [HttpPost]
@@ -96,12 +112,28 @@ namespace molilian.api.Controllers
             var riskStrategy = form.Read("riskStrategy", string.Empty);
             var launchScene = form.Read<int>("launchScene", -1);
             var special_text = form.Read<int>("special_text", -1);
+            var query_text = form.Read("query_text", string.Empty);
 
 #if DEBUG
             //ip = "127.0.0.1";
             //oaid = "test-oaid";
 #endif
-            return await UnionParseCore.UnionParseAsync(content, channel, commerceType, ip, oaid, riskStrategy, launchScene, accountid, special_text, clickId, type);
+            var request = new UnionParseRequest
+            {
+                Content = content,
+                Channel = channel,
+                CommerceType = commerceType,
+                Ip = ip,
+                Oaid = oaid,
+                RiskStrategy = riskStrategy,
+                LaunchScene = launchScene,
+                AccountId = accountid,
+                SpecialText = special_text,
+                QueryText = query_text,
+                ClickId = clickId,
+                Type = type
+            };
+            return await UnionParseCore.UnionParseAsync(request);
         }
 
 
@@ -121,6 +153,7 @@ namespace molilian.api.Controllers
             var riskStrategy = form.Read("riskStrategy", string.Empty);
             var launchScene = form.Read<int>("launchScene", -1);
             var special_text = form.Read<int>("special_text", -1);
+            var query_text = form.Read("query_text", string.Empty);
 
 #if DEBUG
             //ip = "127.0.0.1";
@@ -128,7 +161,22 @@ namespace molilian.api.Controllers
 #endif
             for (int i = 0; i < count; i++)
             {
-                _ = await UnionParseCore.UnionParseAsync(content[i], channel, commerceType, ip, oaid, riskStrategy, launchScene, accountid, special_text, clickId, type);
+                var request = new UnionParseRequest
+                {
+                    Content = content[i],
+                    Channel = channel,
+                    CommerceType = commerceType,
+                    Ip = ip,
+                    Oaid = oaid,
+                    RiskStrategy = riskStrategy,
+                    LaunchScene = launchScene,
+                    AccountId = accountid,
+                    SpecialText = special_text,
+                    QueryText = query_text,
+                    ClickId = clickId,
+                    Type = type
+                };
+                _ = await UnionParseCore.UnionParseAsync(request);
             }
             return new APIResult(new { msg = "ok" });
         }

文件差异内容过多而无法显示
+ 0 - 0
molilian.api/Properties/PublishProfiles/latest.pubxml.user


+ 28 - 33
molilian.core/Core/OverrideRuleCore.cs

@@ -124,47 +124,42 @@ namespace molilian.core
                 if (item.use_special_text == 1 && special_text != 1) continue;
 
 
-                // 每小时调用次数限制
-                if (item.hourly_calls_limit > 0)
+                // 每小时调用次数统计(无论是否设置限制都要记录)
+                string hourlyKey = $":override_rule_calls:{item.id}:{DateTime.Now:yyyyMMddHH}";
+                try
                 {
-                    string hourlyKey = $":override_rule_calls:{item.id}:{DateTime.Now:yyyyMMddHH}";
-                    try
+                    long currentHourlyCalls = await RedisKit.IncrByAsync(hourlyKey);
+                    // 如果是第一次调用,设置过期时间为2小时
+                    if (currentHourlyCalls < 10)
                     {
-                        long currentHourlyCalls = await RedisKit.IncrByAsync(hourlyKey);
-                        // 如果是第一次调用,设置过期时间为2小时
-                        if (currentHourlyCalls < 10)
-                        {
-                            await RedisKit.ExpireAsync(hourlyKey, 7200); // 2小时
-                        }
-
-                        // 如果超过每小时限制,跳过该规则
-                        if (currentHourlyCalls > item.hourly_calls_limit) continue;
-                    }
-                    catch (Exception ex)
-                    {
-                        // Redis错误时记录日志但不阻塞业务
-                        _ = new LoggerLibrary("OverrideRule", "Redis").Info($"Hourly limit check failed: {ex.Message}", ex.StackTrace).SaveAsync();
+                        await RedisKit.ExpireAsync(hourlyKey, 7200); // 2小时
                     }
+
+                    // 如果设置了每小时限制且超过限制,跳过该规则
+                    if (item.hourly_calls_limit > 0 && currentHourlyCalls > item.hourly_calls_limit) continue;
+                }
+                catch (Exception ex)
+                {
+                    // Redis错误时记录日志但不阻塞业务
+                    _ = new LoggerLibrary("OverrideRule", "Redis").Info($"Hourly limit check failed: {ex.Message}", ex.StackTrace).SaveAsync();
                 }
 
-                // 每日调用次数限制
-                if (item.daily_calls_limit > 0)
+                // 每日调用次数统计(无论是否设置限制都要记录)
+                string dailyKey = $":override_rule_calls:{item.id}:{DateTime.Now:yyyyMMdd}";
+                try
                 {
-                    string dailyKey = $":override_rule_calls:{item.id}:{DateTime.Now:yyyyMMdd}";
-                    try
+                    long currentDailyCalls = await RedisKit.IncrByAsync(dailyKey);
+                    if (currentDailyCalls < 10)
                     {
-                        long currentDailyCalls = await RedisKit.IncrByAsync(dailyKey);
-                        if (currentDailyCalls < 10)
-                        {
-                            await RedisKit.ExpireAsync(dailyKey, 259200); // 3天
-                        }
-                        if (currentDailyCalls >= item.daily_calls_limit) continue;
-                    }
-                    catch (Exception ex)
-                    {
-                        // Redis错误时记录日志但不阻塞业务
-                        _ = new LoggerLibrary("OverrideRule", "Redis").Info($"Daily limit check failed: {ex.Message}", ex.StackTrace).SaveAsync();
+                        await RedisKit.ExpireAsync(dailyKey, 259200); // 3天
                     }
+                    // 如果设置了每日限制且超过限制,跳过该规则
+                    if (item.daily_calls_limit > 0 && currentDailyCalls >= item.daily_calls_limit) continue;
+                }
+                catch (Exception ex)
+                {
+                    // Redis错误时记录日志但不阻塞业务
+                    _ = new LoggerLibrary("OverrideRule", "Redis").Info($"Daily limit check failed: {ex.Message}", ex.StackTrace).SaveAsync();
                 }
                 return item;
             }

+ 87 - 74
molilian.core/Core/taoke/UnionParseCore/UnionParseCore.cs

@@ -12,31 +12,33 @@ namespace molilian.core
 {
     public partial class UnionParseCore
     {
-        public static async Task<ActionResult> UnionParseAsync(string content, string channel, int commerceType, string ip, string oaid, string riskStrategy, int launchScene, int accountid = 0, int special_text = -1, string clickId = "", string type = "")
-
+        /// <summary>
+        /// 联盟转链统一入口
+        /// </summary>
+        public static async Task<ActionResult> UnionParseAsync(UnionParseRequest request)
         {
-            content = content.Trim();
+            request.Content = request.Content.Trim();
 
-            if ("dp".Equals(type))
+            if ("dp".Equals(request.Type))
             {
-                return channel switch
+                return request.Channel switch
                 {
-                    "jd" => await DeeplinkJdParseAsync(content, commerceType, ip, oaid, riskStrategy, launchScene, accountid, special_text, clickId),
-                    "pdd" => await DeeplinkPddParseAsync(content, commerceType, ip, oaid, accountid, special_text),
-                    "tb" => await DeeplinkTaobaoParseAsync(content, commerceType, ip, oaid, riskStrategy, launchScene, accountid, special_text),
+                    "jd" => await DeeplinkJdParseAsync(request),
+                    "pdd" => await DeeplinkPddParseAsync(request),
+                    "tb" => await DeeplinkTaobaoParseAsync(request),
                 };
             }
 
-            return channel switch
+            return request.Channel switch
             {
-                //"wemeet" => await WemeetParseAsync(content, ip, oaid),
-                //"bdpan" => await PanParseAsync(content, ip, oaid),
-                "jd" => await JdParseAsync(content, type, commerceType, ip, oaid, riskStrategy, launchScene, accountid, special_text, clickId),
-                "ks" => await KsParseAsync(content, commerceType, ip, oaid, accountid, special_text),
-                "dy" => await DyParseAsync(content, commerceType, ip, oaid, special_text),
-                "pdd" => await PddParseAsync(content, type, commerceType, ip, oaid, accountid, special_text),
-                "tb" => await TaobaoParseAsync(content, commerceType, ip, oaid, riskStrategy, launchScene, accountid, special_text),
-                _ => await DeeplinkParseCore.ParseAsync(content, channel, ip, oaid, special_text),
+                //"wemeet" => await WemeetParseAsync(request),
+                //"bdpan" => await PanParseAsync(request),
+                "jd" => await JdParseAsync(request),
+                "ks" => await KsParseAsync(request),
+                "dy" => await DyParseAsync(request),
+                "pdd" => await PddParseAsync(request),
+                "tb" => await TaobaoParseAsync(request),
+                _ => await DeeplinkParseCore.ParseAsync(request),
             };
         }
         //return await DeeplinkParseCore.ParseAsync(content, channel, ip, oaid);
@@ -87,7 +89,14 @@ namespace molilian.core
             var match = regex.Match(content);
             if (match.Success)
             {
-                return await DeeplinkParseCore.ParseAsync(content, "bdpan", ip, oaid);
+                var request = new UnionParseRequest
+                {
+                    Content = content,
+                    Channel = "bdpan",
+                    Ip = ip,
+                    Oaid = oaid
+                };
+                return await DeeplinkParseCore.ParseAsync(request);
             }
 
 
@@ -143,18 +152,16 @@ namespace molilian.core
         }
 
 
-        public static async Task<APIResult> TaobaoParseAsync(string content, int commerceType,
-            string ip = "", string oaid = "", string riskStrategy = "", int launchScene = -1, int special_text = -1,
-            int accountid = 0)
+        public static async Task<APIResult> TaobaoParseAsync(UnionParseRequest request)
         {
             bool other_aff = false;
             AlimamaPlus alimama = null;
             //content = content.UrlDecode();
-            var result = AlimamaPlus.GetFormattedObject(content, ip, oaid);
+            var result = AlimamaPlus.GetFormattedObject(request.Content, request.Ip, request.Oaid);
 
-            result.riskStrategy = riskStrategy;
-            result.launchScene = launchScene;
-            result.rawContent = content;
+            result.riskStrategy = request.RiskStrategy;
+            result.launchScene = request.LaunchScene;
+            result.rawContent = request.Content;
 
             Dictionary<string, long> swData = new();
             swData.Add("StartNew", 0);
@@ -162,7 +169,7 @@ namespace molilian.core
 
             try
             {
-                content = content[..Math.Min(1000, content.Length)];
+                string content = request.Content[..Math.Min(1000, request.Content.Length)];
 
                 string reason = string.Empty;
 
@@ -185,7 +192,7 @@ namespace molilian.core
                 bool is_other = AlimamaPlus.MatchOtherInfo(content, arr2);
 
 
-                var overrideContent = await OverrideRuleCore.ProcessAsync("tb", content, ip, oaid, riskStrategy, launchScene, special_text);
+                var overrideContent = await OverrideRuleCore.ProcessAsync("tb", content, request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, request.SpecialText);
                 if (overrideContent != null)
                 {
                     result.success = true;
@@ -375,7 +382,7 @@ namespace molilian.core
                 }
                 //============================== 放弃转链-地区过滤 ==============================
 
-                bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(ip, oaid, riskStrategy, launchScene, out reason);
+                bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out reason);
 
                 if (is_ignore2)
                 {
@@ -403,9 +410,9 @@ namespace molilian.core
                 (bool isTaobaoUrl, string url) = AlimamaPlus.IsTaobaoUrl(content);
 
                 //============================== 放弃转链-没有匹配账号 ==============================
-                TkPoolDTO? account = accountid > 0 ?
-                    await TkPoolCore.GetOneAsync(accountid) :
-                    await TkPoolCore.GetOneAsync(TkPoolCore.TkAction.parse, isTaobaoUrl, riskStrategy, launchScene);
+                TkPoolDTO? account = request.AccountId > 0 ?
+                    await TkPoolCore.GetOneAsync(request.AccountId) :
+                    await TkPoolCore.GetOneAsync(TkPoolCore.TkAction.parse, isTaobaoUrl, request.RiskStrategy, request.LaunchScene);
                 if (account == null)
                 {
                     result.success = false;
@@ -444,7 +451,7 @@ namespace molilian.core
                 using var cts = new CancellationTokenSource();
                 cts.CancelAfter(timeout);
 
-                var requestTask = Task.Run(() => alimama.UnionParseAsync(ip, oaid, content, commerceType, result, isTaobaoUrl, riskStrategy, launchScene, cts.Token, swData), cts.Token);
+                var requestTask = Task.Run(() => alimama.UnionParseAsync(request.Ip, request.Oaid, content, request.CommerceType, result, isTaobaoUrl, request.RiskStrategy, request.LaunchScene, cts.Token, swData), cts.Token);
                 var delayTask = Task.Delay(timeout, cts.Token);
                 var completedTask = await Task.WhenAny(requestTask, delayTask);
                 if (completedTask == requestTask)
@@ -480,14 +487,14 @@ namespace molilian.core
                 {
                     //============================== 转链接口异常 ==============================
                     _ = new LoggerLibrary("unionParse", "tb_error")
-                        .Info(ip, oaid)
-                        .Info(content)
+                        .Info(request.Ip, request.Oaid)
+                        .Info(request.Content)
                         .Info(ex.Message, ex.StackTrace)
                         .SaveAsync();
 
                     NotifyCore.Notify(new NifyMessage
                     {
-                        message = $"【转链异常TB】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
+                        message = $"【转链异常TB】\n{request.Content}\n\n{ex.Message}\n{ex.StackTrace}",
                         priority = NifyMessagePriority.high,
                         tags = ["red_circle"]
                     });
@@ -559,21 +566,20 @@ namespace molilian.core
             }, code);
         }
 
-        public static async Task<APIResult> JdParseAsync(string content, string type, int commerceType, string ip, string oaid,
-            string riskStrategy = "", int launchScene = -1,
-            int accountid = 0, int special_text = -1, string clickId = "", CancellationToken cancellationToken = default)
+        public static async Task<APIResult> JdParseAsync(UnionParseRequest request, CancellationToken cancellationToken = default)
         {
             var config = TkConfigCore.Get();
-            var result = JdUnionPlus.GetFormattedObject(content, ip, oaid, clickId);
+            var result = JdUnionPlus.GetFormattedObject(request.Content, request.Ip, request.Oaid, request.ClickId);
 
-            result.rawContent = content;
-            result.riskStrategy = riskStrategy;
-            result.launchScene = launchScene;
+            result.rawContent = request.Content;
+            result.riskStrategy = request.RiskStrategy;
+            result.launchScene = request.LaunchScene;
             bool IfExceptional = false;
             bool is_hide = false;
+            string content = request.Content;
             try
             {
-                var overrideContent = await OverrideRuleCore.ProcessAsync("jd", content, ip, oaid, riskStrategy, launchScene, special_text);
+                var overrideContent = await OverrideRuleCore.ProcessAsync("jd", content, request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, request.SpecialText);
                 if (overrideContent != null)
                 {
                     result.success = true;
@@ -585,7 +591,7 @@ namespace molilian.core
                     return JdParseOutput(result);
                 }
 
-                switch (type)
+                switch (request.Type)
                 {
                     case "goods":
                         string pattern = "sku=(\\d+)";
@@ -604,6 +610,15 @@ namespace molilian.core
                             }
                             content = $"https://item.jd.com/{goods_id}.html";
                         }
+                        else
+                        {
+                            result.success = false;
+                            result.deeplink_url = string.Empty;
+                            result.message = "放弃转链";
+                            result.reason = "无效商品ID";
+                            _ = TkLogCore.ParseLogAsync(result, is_hide);
+                            return JdParseOutput(result);
+                        }
                         break;
                     default:
                         content = content.UrlDecode();
@@ -633,7 +648,7 @@ namespace molilian.core
                 string itemId = null;
 
                 //============================== 放弃转链-地区过滤 ==============================
-                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && accountid == 0 && JdUnionPlus.ShouldIgnoreRequest(config, ip, oaid, riskStrategy, launchScene, out string reason))
+                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && request.AccountId == 0 && JdUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out string reason))
                 {
                     result.link_type = JdUnionPlus.GetLinkType(result.shortLinkurl, out out_url, out itemId);
 
@@ -689,7 +704,7 @@ namespace molilian.core
 
                 bool is_numeric = result.shortLinkurl.Contains(itemId);
 
-                var account = accountid > 0 ? await JdPoolCore.GetOneAsync(accountid, JdPoolCore.JdAction.parse) : await JdPoolCore.GetOneAsync(JdPoolCore.JdAction.parse, riskStrategy, launchScene, is_numeric);
+                var account = request.AccountId > 0 ? await JdPoolCore.GetOneAsync(request.AccountId, JdPoolCore.JdAction.parse) : await JdPoolCore.GetOneAsync(JdPoolCore.JdAction.parse, request.RiskStrategy, request.LaunchScene, is_numeric);
                 if (account == null)
                 {
                     result.success = false;
@@ -712,7 +727,7 @@ namespace molilian.core
                 result.proxy_name = plus._proxyName;
                 result.proxy_node = plus._proxy?.Address?.Host;
 
-                result = await plus.JdParseAsync(content, commerceType, clickId, result, cancellationToken);
+                result = await plus.JdParseAsync(content, request.CommerceType, request.ClickId, result, cancellationToken);
             }
             catch (Exception ex)
             {
@@ -726,7 +741,7 @@ namespace molilian.core
                 {
                     IfExceptional = true;
                     _ = new LoggerLibrary("unionParse", "jd_error")
-                        .Info(ip, oaid)
+                        .Info(request.Ip, request.Oaid)
                         .Info(content)
                         .Info(ex.Message, ex.StackTrace)
                         .SaveAsync();
@@ -753,15 +768,15 @@ namespace molilian.core
         }
 
 
-        public static async Task<APIResult> DyParseAsync(string content, int commerceType, string ip, string oaid, int special_text = -1, CancellationToken cancellationToken = default)
+        public static async Task<APIResult> DyParseAsync(UnionParseRequest request, CancellationToken cancellationToken = default)
         {
-            var result = DyUnionPlus.GetFormattedObject(content, ip, oaid);
-            content = content.UrlDecode();
+            var result = DyUnionPlus.GetFormattedObject(request.Content, request.Ip, request.Oaid);
+            string content = request.Content.UrlDecode();
             result.rawContent = content;
             bool IfExceptional = false;
             try
             {
-                var overrideContent = await OverrideRuleCore.ProcessAsync("dy", content, ip, oaid, string.Empty, 0, special_text);
+                var overrideContent = await OverrideRuleCore.ProcessAsync("dy", content, request.Ip, request.Oaid, string.Empty, 0, request.SpecialText);
                 if (overrideContent != null)
                 {
                     result.success = true;
@@ -783,7 +798,7 @@ namespace molilian.core
 
 
 
-                if (DyUnionPlus.ShouldIgnoreRequest(ip, oaid, out string reason))
+                if (DyUnionPlus.ShouldIgnoreRequest(request.Ip, request.Oaid, out string reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";
@@ -801,7 +816,7 @@ namespace molilian.core
                     _ = TkLogCore.ParseLogAsync(result);
                     return new APIResult(result);
                 }
-                result = await DyUnionPlus.DyParseAsync(account, content, commerceType, result, cancellationToken);
+                result = await DyUnionPlus.DyParseAsync(account, content, request.CommerceType, result, cancellationToken);
             }
             catch (Exception ex)
             {
@@ -815,7 +830,7 @@ namespace molilian.core
                 {
                     IfExceptional = true;
                     _ = new LoggerLibrary("unionParse", "dy_error")
-                        .Info(ip, oaid)
+                        .Info(request.Ip, request.Oaid)
                         .Info(content)
                         .Info(ex.Message, ex.StackTrace)
                         .SaveAsync();
@@ -846,13 +861,12 @@ namespace molilian.core
             }, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK);
         }
 
-        public static async Task<APIResult> PddParseAsync(string content, string type, int commerceType, string ip, string oaid,
-            int accountid = 0, int special_text = -1, CancellationToken cancellationToken = default)
+        public static async Task<APIResult> PddParseAsync(UnionParseRequest request, CancellationToken cancellationToken = default)
         {
-            var result = PddUnionPlus.GetFormattedObject(content, ip, oaid);
+            var result = PddUnionPlus.GetFormattedObject(request.Content, request.Ip, request.Oaid);
 
 
-            var overrideContent = await OverrideRuleCore.ProcessAsync("pdd", content, ip, oaid, string.Empty, 0, special_text);
+            var overrideContent = await OverrideRuleCore.ProcessAsync("pdd", request.Content, request.Ip, request.Oaid, string.Empty, 0, request.SpecialText);
             if (overrideContent != null)
             {
                 result.success = true;
@@ -863,8 +877,8 @@ namespace molilian.core
                 return PddParseOutput(result);
             }
 
-
-            switch (type)
+            string content = request.Content;
+            switch (request.Type)
             {
                 case "goods":
                     string pattern = "goods_id=(\\d+)";
@@ -926,7 +940,7 @@ namespace molilian.core
                     }
                 }
                 //============================== 放弃转链-地区过滤 ==============================
-                if (accountid == 0 && PddUnionPlus.ShouldIgnoreRequest(config, ip, oaid, out string reason))
+                if (request.AccountId == 0 && PddUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, out string reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";
@@ -943,7 +957,7 @@ namespace molilian.core
                 {
                     for (int j = 0; j < 3; j++)
                     {
-                        account = PddPoolCore.GetOne(PddUnionWorkMode.All, accountid);
+                        account = PddPoolCore.GetOne(PddUnionWorkMode.All, request.AccountId);
                         if (account == null) continue;
 
                         if (account.cis_limit > 0)
@@ -1005,7 +1019,7 @@ namespace molilian.core
                     }
                 }
                 var plus = new PddUnionPlus(account);
-                result = await plus.PddParseAsync(content, commerceType, result, cancellationToken);
+                result = await plus.PddParseAsync(content, request.CommerceType, result, cancellationToken);
             }
             catch (Exception ex)
             {
@@ -1019,7 +1033,7 @@ namespace molilian.core
                 {
                     IfExceptional = true;
                     _ = new LoggerLibrary("unionParse", "pdd_error")
-                        .Info(ip, oaid)
+                        .Info(request.Ip, request.Oaid)
                         .Info(content)
                         .Info(ex.Message, ex.StackTrace)
                         .SaveAsync();
@@ -1057,11 +1071,10 @@ namespace molilian.core
 
 
 
-        public static async Task<APIResult> KsParseAsync(string content, int commerceType, string ip, string oaid,
-            int accountid = 0, int special_text = -1, CancellationToken cancellationToken = default)
+        public static async Task<APIResult> KsParseAsync(UnionParseRequest request, CancellationToken cancellationToken = default)
         {
-            var result = KsUnionPlus.GetFormattedObject(content, ip, oaid);
-            content = content.UrlDecode();
+            var result = KsUnionPlus.GetFormattedObject(request.Content, request.Ip, request.Oaid);
+            string content = request.Content.UrlDecode();
             result.rawContent = content;
             bool IfExceptional = false;
             try
@@ -1069,7 +1082,7 @@ namespace molilian.core
                 var config = TkConfigCore.Get();
 
 
-                var overrideContent = await OverrideRuleCore.ProcessAsync("ks", content, ip, oaid, string.Empty, 0, special_text);
+                var overrideContent = await OverrideRuleCore.ProcessAsync("ks", content, request.Ip, request.Oaid, string.Empty, 0, request.SpecialText);
                 if (overrideContent != null)
                 {
                     result.success = true;
@@ -1105,7 +1118,7 @@ namespace molilian.core
 
 
                 //============================== 放弃转链-地区过滤 ==============================
-                if (accountid == 0 && KsUnionPlus.ShouldIgnoreRequest(config, ip, oaid, out string reason))
+                if (request.AccountId == 0 && KsUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, out string reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";
@@ -1114,7 +1127,7 @@ namespace molilian.core
                     _ = TkLogCore.ParseLogAsync(result);
                     return KsParseOutput(result);
                 }
-                var account = accountid > 0 ? KsPoolCore.GetOne(accountid, KsPoolCore.KsAction.parse) : KsPoolCore.GetOne(KsPoolCore.KsAction.parse);
+                var account = request.AccountId > 0 ? KsPoolCore.GetOne(request.AccountId, KsPoolCore.KsAction.parse) : KsPoolCore.GetOne(KsPoolCore.KsAction.parse);
                 if (account == null)
                 {
                     result.success = false;
@@ -1129,7 +1142,7 @@ namespace molilian.core
 
                 var plus = new KsUnionPlus(account);
 
-                result = await plus.KsParseAsync(content, commerceType, result, cancellationToken);
+                result = await plus.KsParseAsync(content, request.CommerceType, result, cancellationToken);
             }
             catch (Exception ex)
             {
@@ -1143,7 +1156,7 @@ namespace molilian.core
                 {
                     IfExceptional = true;
                     _ = new LoggerLibrary("unionParse", "jd_error")
-                        .Info(ip, oaid)
+                        .Info(request.Ip, request.Oaid)
                         .Info(content)
                         .Info(ex.Message, ex.StackTrace)
                         .SaveAsync();

+ 60 - 40
molilian.core/Core/taoke/UnionParseCore/dp2dp.cs

@@ -16,26 +16,49 @@ namespace molilian.core
     }
     public partial class UnionParseCore
     {
-        public static async Task<APIResult> DeeplinkTaobaoParseAsync(string content, int commerceType,
-            string ip = "", string oaid = "", string riskStrategy = "", int launchScene = -1,
-            int accountid = 0, int special_text = -1)
+        public static async Task<APIResult> DeeplinkTaobaoParseAsync(UnionParseRequest request)
         {
             bool other_aff = false;
             AlimamaPlus alimama = null;
-            var result = AlimamaPlus.GetFormattedObject(content, ip, oaid);
+            var result = AlimamaPlus.GetFormattedObject(request.Content, request.Ip, request.Oaid);
 
-            result.riskStrategy = riskStrategy;
-            result.launchScene = launchScene;
-            result.rawContent = content;
+            result.riskStrategy = request.RiskStrategy;
+            result.launchScene = request.LaunchScene;
+            result.rawContent = request.Content;
             result.parse_type = "dp";
 
             Dictionary<string, long> swData = new();
             swData.Add("StartNew", 0);
             Stopwatch stopwatch = Stopwatch.StartNew();
 
+            string content = request.Content;
             try
             {
-                var parseResult = parseTaobaoDeeplinkInput(content);
+                var parseResult = parseTaobaoDeeplinkInput(request.Content);
+
+                var overrideContent = await OverrideRuleCore.ProcessAsync("tb", request.Content, request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, request.SpecialText);
+                if (overrideContent != null)
+                {
+                    result.success = true;
+                    result.deeplink_url = overrideContent.output_text;
+
+                    _ = TkLogCore.ParseLogAsync(result);
+                    return TaobaoParseOutput(result, swData, new
+                    {
+                        result.success,
+                        result.commercial,
+                        result.message,
+                        sub_message = result.reason,
+                        home_page = "tbopen://m.taobao.com/tbopen/index.html".Equals(result.deeplink_url),
+                        result.content,
+                        result.itemName,
+                        other_aff,
+                        result.deeplink_url,
+                    });
+                }
+
+
+
                 if (!parseResult.success)
                 {
                     result.channel = TkChannelEnum.tb;
@@ -309,7 +332,7 @@ namespace molilian.core
                 }
                 //============================== 放弃转链-地区过滤 ==============================
 
-                bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(ip, oaid, riskStrategy, launchScene, out reason);
+                bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out reason);
 
                 if (is_ignore2)
                 {
@@ -341,9 +364,9 @@ namespace molilian.core
                 (bool isTaobaoUrl, string url) = AlimamaPlus.IsTaobaoUrl(content);
 
                 //============================== 放弃转链-没有匹配账号 ==============================
-                TkPoolDTO? account = accountid > 0 ?
-                    await TkPoolCore.GetOneAsync(accountid) :
-                    await TkPoolCore.GetOneAsync(TkPoolCore.TkAction.parse, isTaobaoUrl, riskStrategy, launchScene, "dp");
+                TkPoolDTO? account = request.AccountId > 0 ?
+                    await TkPoolCore.GetOneAsync(request.AccountId) :
+                    await TkPoolCore.GetOneAsync(TkPoolCore.TkAction.parse, isTaobaoUrl, request.RiskStrategy, request.LaunchScene, "dp");
                 if (account == null)
                 {
                     result.success = false;
@@ -385,7 +408,7 @@ namespace molilian.core
                 using var cts = new CancellationTokenSource();
                 cts.CancelAfter(timeout);
 
-                var requestTask = Task.Run(() => alimama.UnionParseAsync(ip, oaid, content, commerceType, result, isTaobaoUrl, riskStrategy, launchScene, cts.Token, swData), cts.Token);
+                var requestTask = Task.Run(() => alimama.UnionParseAsync(request.Ip, request.Oaid, content, request.CommerceType, result, isTaobaoUrl, request.RiskStrategy, request.LaunchScene, cts.Token, swData), cts.Token);
                 var delayTask = Task.Delay(timeout, cts.Token);
                 var completedTask = await Task.WhenAny(requestTask, delayTask);
                 if (completedTask == requestTask)
@@ -421,7 +444,7 @@ namespace molilian.core
                 {
                     //============================== 转链接口异常 ==============================
                     _ = new LoggerLibrary("unionParse", "tb_error")
-                        .Info(ip, oaid)
+                        .Info(request.Ip, request.Oaid)
                         .Info(content)
                         .Info(ex.Message, ex.StackTrace)
                         .SaveAsync();
@@ -482,21 +505,19 @@ namespace molilian.core
         }
 
 
-        public static async Task<APIResult> DeeplinkJdParseAsync(string content, int commerceType, string ip, string oaid,
-            string riskStrategy = "", int launchScene = -1,
-            int accountid = 0, int special_text = -1, string clickId = "", CancellationToken cancellationToken = default)
+        public static async Task<APIResult> DeeplinkJdParseAsync(UnionParseRequest request, CancellationToken cancellationToken = default)
         {
             var config = TkConfigCore.Get();
-            var result = JdUnionPlus.GetFormattedObject(content, ip, oaid, clickId);
+            var result = JdUnionPlus.GetFormattedObject(request.Content, request.Ip, request.Oaid, request.ClickId);
 
-            result.rawContent = content;
+            result.rawContent = request.Content;
             result.parse_type = "dp";
-            result.riskStrategy = riskStrategy;
-            result.launchScene = launchScene;
+            result.riskStrategy = request.RiskStrategy;
+            result.launchScene = request.LaunchScene;
             bool IfExceptional = false;
             try
             {
-                var overrideContent = await OverrideRuleCore.ProcessAsync("jd", content, ip, oaid, riskStrategy, launchScene, special_text);
+                var overrideContent = await OverrideRuleCore.ProcessAsync("jd", request.Content, request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, request.SpecialText);
                 if (overrideContent != null)
                 {
                     result.success = true;
@@ -508,7 +529,7 @@ namespace molilian.core
                     return JdParseOutput(result);
                 }
 
-                var parseResult = parseJdDeeplinkInput(content);
+                var parseResult = parseJdDeeplinkInput(request.Content);
 
 
                 if (!parseResult.success)
@@ -520,7 +541,7 @@ namespace molilian.core
                     result.message = "放弃转链";
                     result.reason = parseResult.reason;
                     result.accountName = string.Empty;
-                    result.content = content;
+                    result.content = request.Content;
                     result.deeplink_url = string.Empty;
 
                     _ = TkLogCore.ParseLogAsync(result, false);
@@ -530,7 +551,7 @@ namespace molilian.core
                 result.shortLinkurl = parseResult.url;
                 result.content = parseResult.url;
                 result.deeplink_url = string.Empty;
-                content = parseResult.url;
+                var content = parseResult.url;
 
                 if (!string.IsNullOrEmpty(config.jd_blacklist_regular))
                 {
@@ -556,7 +577,7 @@ namespace molilian.core
                 string itemId = null;
 
                 //============================== 放弃转链-地区过滤 ==============================
-                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && accountid == 0 && JdUnionPlus.ShouldIgnoreRequest(config, ip, oaid, riskStrategy, launchScene, out string reason))
+                if (!TestParseCore.InWhitelist(result.ip, result.oaid) && request.AccountId == 0 && JdUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out string reason))
                 {
                     result.link_type = JdUnionPlus.GetLinkType(result.shortLinkurl, out out_url, out itemId);
 
@@ -589,7 +610,7 @@ namespace molilian.core
 
                 bool is_numeric = result.shortLinkurl.Contains(itemId);
 
-                var account = accountid > 0 ? await JdPoolCore.GetOneAsync(accountid, JdPoolCore.JdAction.parse) : await JdPoolCore.GetOneAsync(JdPoolCore.JdAction.parse, riskStrategy, launchScene, is_numeric, "dp");
+                var account = request.AccountId > 0 ? await JdPoolCore.GetOneAsync(request.AccountId, JdPoolCore.JdAction.parse) : await JdPoolCore.GetOneAsync(JdPoolCore.JdAction.parse, request.RiskStrategy, request.LaunchScene, is_numeric, "dp");
                 if (account == null)
                 {
                     result.success = false;
@@ -616,7 +637,7 @@ namespace molilian.core
                 result.proxy_name = plus._proxyName;
                 result.proxy_node = plus._proxy?.Address?.Host;
 
-                result = await plus.JdParseAsync(content, commerceType, clickId, result, cancellationToken);
+                result = await plus.JdParseAsync(content, request.CommerceType, request.ClickId, result, cancellationToken);
             }
             catch (Exception ex)
             {
@@ -630,13 +651,13 @@ namespace molilian.core
                 {
                     IfExceptional = true;
                     _ = new LoggerLibrary("unionParse", "jd_error")
-                        .Info(ip, oaid)
-                        .Info(content)
+                        .Info(request.Ip, request.Oaid)
+                        .Info(request.Content)
                         .Info(ex.Message, ex.StackTrace)
                         .SaveAsync();
                     NotifyCore.Notify(new NifyMessage
                     {
-                        message = $"【转链异常JD】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
+                        message = $"【转链异常JD】\n{request.Content}\n\n{ex.Message}\n{ex.StackTrace}",
                         priority = NifyMessagePriority.high,
                         tags = ["red_circle"]
                     });
@@ -662,11 +683,10 @@ namespace molilian.core
 
 
 
-        public static async Task<APIResult> DeeplinkPddParseAsync(string content, int commerceType, string ip, string oaid,
-            int accountid = 0, int special_text = -1, CancellationToken cancellationToken = default)
+        public static async Task<APIResult> DeeplinkPddParseAsync(UnionParseRequest request, CancellationToken cancellationToken = default)
         {
-            var result = PddUnionPlus.GetFormattedObject(content, ip, oaid);
-            content = content.UrlDecode();
+            var result = PddUnionPlus.GetFormattedObject(request.Content, request.Ip, request.Oaid);
+            var content = request.Content.UrlDecode();
             result.rawContent = content;
             result.parse_type = "dp";
             bool IfExceptional = false;
@@ -674,7 +694,7 @@ namespace molilian.core
             {
                 var config = TkConfigCore.Get();
 
-                var overrideContent = await OverrideRuleCore.ProcessAsync("pdd", content, ip, oaid, string.Empty, 0, special_text);
+                var overrideContent = await OverrideRuleCore.ProcessAsync("pdd", content, request.Ip, request.Oaid, string.Empty, 0, request.SpecialText);
                 if (overrideContent != null)
                 {
                     result.success = true;
@@ -708,7 +728,7 @@ namespace molilian.core
 
 
                 //============================== 放弃转链-地区过滤 ==============================
-                if (accountid == 0 && PddUnionPlus.ShouldIgnoreRequest(config, ip, oaid, out string reason))
+                if (request.AccountId == 0 && PddUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, out string reason))
                 {
                     result.success = false;
                     result.message = "放弃转链";
@@ -725,7 +745,7 @@ namespace molilian.core
                 {
                     for (int j = 0; j < 3; j++)
                     {
-                        account = PddPoolCore.GetOne(PddUnionWorkMode.All, accountid, "dp");
+                        account = PddPoolCore.GetOne(PddUnionWorkMode.All, request.AccountId, "dp");
                         if (account == null) continue;
 
                         if (account.cis_limit > 0)
@@ -788,7 +808,7 @@ namespace molilian.core
                 }
                 var plus = new PddUnionPlus(account);
 
-                result = await plus.PddParseAsync(content, commerceType, result, cancellationToken);
+                result = await plus.PddParseAsync(content, request.CommerceType, result, cancellationToken);
             }
             catch (Exception ex)
             {
@@ -802,7 +822,7 @@ namespace molilian.core
                 {
                     IfExceptional = true;
                     _ = new LoggerLibrary("unionParse", "pdd_error")
-                        .Info(ip, oaid)
+                        .Info(request.Ip, request.Oaid)
                         .Info(content)
                         .Info(ex.Message, ex.StackTrace)
                         .SaveAsync();

+ 11 - 11
molilian.core/Core/tool/DeeplinkParseCore.cs

@@ -20,27 +20,27 @@ namespace molilian.core
         }
 
 
-        public static DeeplinkParseDataDTO GetFormattedObject(string content, string channel, string ip = "", string oaid = "")
+        public static DeeplinkParseDataDTO GetFormattedObject(UnionParseRequest request)
         {
             return new DeeplinkParseDataDTO()
             {
                 message = string.Empty,
                 success = false,
-                content = content,
-                ip = ip,
-                oaid = oaid,
+                content = request.Content,
+                ip = request.Ip,
+                oaid = request.Oaid,
                 elapsedTime = 0,
                 create_time = DateTime.Now,
                 end_point = _end_point,
             };
         }
 
-        public static async Task<ActionResult> ParseAsync(string content, string channel, string ip, string oaid, int special_text = -1)
+        public static async Task<ActionResult> ParseAsync(UnionParseRequest request)
         {
-            var result = GetFormattedObject(content, channel, ip, oaid);
-            content = content.Trim();
+            var result = GetFormattedObject(request);
+            request.Content = request.Content.Trim();
 
-            var rule = DeeplinkParseRuleCore.GetOne(channel);
+            var rule = DeeplinkParseRuleCore.GetOne(request.Channel);
             if (rule == null)
             {
                 result.success = false;
@@ -60,7 +60,7 @@ namespace molilian.core
             result.channel_name = rule.channel_name;
 
 
-            var overrideContent = await OverrideRuleCore.ProcessAsync(channel, content, ip, oaid, string.Empty, 0, special_text);
+            var overrideContent = await OverrideRuleCore.ProcessAsync(request.Channel, request.Content, request.Ip, request.Oaid, string.Empty, 0, request.SpecialText);
             if (overrideContent != null)
             {
                 result.success = true;
@@ -79,7 +79,7 @@ namespace molilian.core
 
 
 
-            if (ShouldIgnoreRequest(rule.IgnorePercentageCity, ip, oaid, out string reason))
+            if (ShouldIgnoreRequest(rule.IgnorePercentageCity, request.Ip, request.Oaid, out string reason))
             {
                 result.success = false;
                 result.message = "放弃转链";
@@ -93,7 +93,7 @@ namespace molilian.core
                     result.reason,
                 });
             }
-            result = await GenerateDeeplink(content, rule, result);
+            result = await GenerateDeeplink(request.Content, rule, result);
 
             _ = TkLogCore.ParseLogAsync(result);
             return new APIResult(new

+ 68 - 0
molilian.core/DTO/UnionParseRequest.cs

@@ -0,0 +1,68 @@
+namespace molilian.core
+{
+    /// <summary>
+    /// 联盟转链请求参数对象
+    /// </summary>
+    public class UnionParseRequest
+    {
+        /// <summary>
+        /// 待转链内容
+        /// </summary>
+        public string Content { get; set; } = string.Empty;
+
+        /// <summary>
+        /// 渠道(tb/jd/pdd/ks/dy等)
+        /// </summary>
+        public string Channel { get; set; } = string.Empty;
+
+        /// <summary>
+        /// 商业类型
+        /// </summary>
+        public int CommerceType { get; set; }
+
+        /// <summary>
+        /// IP地址
+        /// </summary>
+        public string Ip { get; set; } = string.Empty;
+
+        /// <summary>
+        /// OAID标识
+        /// </summary>
+        public string Oaid { get; set; } = string.Empty;
+
+        /// <summary>
+        /// 风控策略
+        /// </summary>
+        public string RiskStrategy { get; set; } = string.Empty;
+
+        /// <summary>
+        /// 启动场景
+        /// </summary>
+        public int LaunchScene { get; set; } = -1;
+
+        /// <summary>
+        /// 账号ID
+        /// </summary>
+        public int AccountId { get; set; } = 0;
+
+        /// <summary>
+        /// 特殊文本标识(-1:不限制, 1:特殊文本)
+        /// </summary>
+        public int SpecialText { get; set; } = -1;
+
+        /// <summary>
+        /// 查询文本
+        /// </summary>
+        public string QueryText { get; set; } = string.Empty;
+
+        /// <summary>
+        /// 点击ID
+        /// </summary>
+        public string ClickId { get; set; } = string.Empty;
+
+        /// <summary>
+        /// 类型(dp/goods等)
+        /// </summary>
+        public string Type { get; set; } = string.Empty;
+    }
+}

二进制
oss_1755199393923_null_e25c9I8m.zip


二进制
taobao-sdk-netcore-auto_1719572210878-20240628-source.zip


部分文件因为文件数量过多而无法显示