Bläddra i källkod

增加brwsimilar和tbpush

dodo hold 3 månader sedan
förälder
incheckning
c54cd5ac8e

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

@@ -44,6 +44,7 @@ namespace molilian.api.Controllers
             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);
+            var pic = form.Read("pic", string.Empty);
 
 
             //验证签名
@@ -81,7 +82,8 @@ namespace molilian.api.Controllers
                 SpecialText = special_text,
                 QueryText = query_text,
                 ClickId = clickId,
-                Type = type
+                Type = type,
+                Pic = pic,
             };
             return await UnionParseCore.UnionParseAsync(request);
         }
@@ -101,6 +103,7 @@ namespace molilian.api.Controllers
             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);
+            var pic = form.Read("pic", string.Empty);
 
 #if DEBUG
             //ip = "127.0.0.1";
@@ -119,7 +122,8 @@ namespace molilian.api.Controllers
                 SpecialText = special_text,
                 QueryText = query_text,
                 ClickId = clickId,
-                Type = type
+                Type = type,
+                Pic = pic,
             };
             return await UnionParseCore.UnionParseAsync(request);
         }
@@ -142,6 +146,7 @@ namespace molilian.api.Controllers
             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);
+            var pic = form.Read("pic", string.Empty);
 
 #if DEBUG
             //ip = "127.0.0.1";
@@ -162,7 +167,8 @@ namespace molilian.api.Controllers
                     SpecialText = special_text,
                     QueryText = query_text,
                     ClickId = clickId,
-                    Type = type
+                    Type = type,
+                    Pic = pic,
                 };
                 _ = await UnionParseCore.UnionParseAsync(request);
             }

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
molilian.api/Properties/PublishProfiles/latest.pubxml.user


+ 1 - 1
molilian.api/Properties/launchSettings.json

@@ -16,7 +16,7 @@
         "CenterDB": "",
         "CenterRedis": ""
       },
-      "environmentVariables_similar": {
+      "environmentVariables33": {
         "ASPNETCORE_ENVIRONMENT": "Development",
         "EndPoint": "sh1",
         "NtfyServer": "https://ntfy.yunhui800.com/similar",

+ 3 - 3
molilian.core/Core/TracksCore.cs

@@ -215,19 +215,19 @@ namespace molilian.core
         }
         public static string BuildPath(int trackId, TkDataDTO result)
         {
-            if (result == null || result.parse_type != "dp") return string.Empty;
+            if (result == null) return string.Empty;
             string unique_id = $"1|{result.itemId}_{result.mktId}";
             return BuildPath(trackId, unique_id);
         }
         public static string BuildPath(int trackId, JdDataDTO result)
         {
-            if (result == null || result.parse_type != "dp") return string.Empty;
+            if (result == null) return string.Empty;
             string unique_id = $"13|{result.shortLinkurl.UrlEncode()}";
             return BuildPath(trackId, unique_id);
         }
         public static string BuildPath(int trackId, PddDataDTO result)
         {
-            if (result == null || result.parse_type != "dp") return string.Empty;
+            if (result == null) return string.Empty;
             string unique_id = $"9|{result.shortLinkurl.UrlEncode()}";
             return BuildPath(trackId, unique_id);
         }

+ 47 - 2
molilian.core/Core/taoke/UnionParseCore/UnionParseCore.cs

@@ -20,6 +20,17 @@ namespace molilian.core
         /// </summary>
         public static async Task<ActionResult> UnionParseAsync(UnionParseRequest request)
         {
+
+            switch (request.Channel)
+            {
+                case "brwsimilar":
+                case "tbpush":
+                    request.RiskStrategy = request.Channel;
+                    request.LaunchScene = 0;
+                    request.Channel = "tb";
+                    break;
+            }
+
             if (request.SpecialText == 1)
             {
                 return await SpecialTextParseAsync(request);
@@ -362,7 +373,7 @@ namespace molilian.core
 
             try
             {
-                string content = request.Content[..Math.Min(1000, request.Content.Length)];
+                string content = result.content[..Math.Min(1000, result.content.Length)];
 
                 string reason = string.Empty;
 
@@ -380,6 +391,7 @@ namespace molilian.core
                     .Where(line => !string.IsNullOrWhiteSpace(line))
                     .ToList();
 
+
                 bool is_tao_url = !string.IsNullOrEmpty(result.shortLinkurl);
                 bool is_tao_token = AlimamaPlus.MatchRegexes(content, arr);
                 bool is_other = AlimamaPlus.MatchOtherInfo(content, arr2);
@@ -658,7 +670,7 @@ namespace molilian.core
                 using var cts = new CancellationTokenSource();
                 cts.CancelAfter(timeout);
 
-                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 requestTask = Task.Run(() => alimama.UnionParseAsync(request, content, result, isTaobaoUrl, cts.Token, swData), cts.Token);
                 var delayTask = Task.Delay(timeout, cts.Token);
                 var completedTask = await Task.WhenAny(requestTask, delayTask);
                 if (completedTask == requestTask)
@@ -722,6 +734,38 @@ namespace molilian.core
                     break;
             }
 
+            if ("brwsimilar".Equals(request.RiskStrategy))
+            {
+                return TaobaoParseOutput(result, swData, new
+                {
+                    success = ValidateDeeplinkIfRequired(result.success, result.deeplink_url),
+                    result.commercial,
+                    exposeTracks = TracksCore.BuildPath(TracksCore.ExposeTrackId, result),
+                    clickTracks = TracksCore.BuildPath(TracksCore.ClickTrackId, result),
+                    result.with_middle_page,
+                    result.message,
+                    sub_message = result.reason,
+                    home_page = "tbopen://m.taobao.com/tbopen/index.html".Equals(result.deeplink_url),
+                    link_type = result.link_type.ToString(),
+                    channel = result?.channel.ToString(),
+                    result.channel_type,
+                    result.itemId,
+                    result.itemName,
+                    result.pic,
+                    result.promotionPrice,
+                    result.couponAmount,
+                    result.couponEffectiveStartTime,
+                    result?.couponEffectiveEndTime,
+                    result.shortLinkurl,
+                    result.deeplink_url,
+                    result.riskStrategy,
+                    result.launchScene,
+                    result.content,
+                    result.taoToken,
+                    other_aff,
+                    promotionImg = result.PromotionImg
+                });
+            }
             return TaobaoParseOutput(result, swData, new
             {
                 success = ValidateDeeplinkIfRequired(result.success, result.deeplink_url),
@@ -750,6 +794,7 @@ namespace molilian.core
                 result.taoToken,
                 other_aff,
             });
+
         }
 
 

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

@@ -420,7 +420,7 @@ namespace molilian.core
                 using var cts = new CancellationTokenSource();
                 cts.CancelAfter(timeout);
 
-                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 requestTask = Task.Run(() => alimama.UnionParseAsync(request, content, result, isTaobaoUrl, cts.Token, swData), cts.Token);
                 var delayTask = Task.Delay(timeout, cts.Token);
                 var completedTask = await Task.WhenAny(requestTask, delayTask);
                 if (completedTask == requestTask)

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

@@ -64,5 +64,11 @@ namespace molilian.core
         /// 类型(dp/goods等)
         /// </summary>
         public string Type { get; set; } = string.Empty;
+
+
+        /// <summary>
+        /// 商品主图
+        /// </summary>
+        public string Pic { get; set; } = string.Empty;
     }
 }

+ 6 - 0
molilian.core/DTO/alimama/TkDataDTO.cs

@@ -128,6 +128,12 @@ namespace molilian.core
         public string item_deeplink_url { get; set; } = string.Empty;
         public string remote_response { get; set; } = string.Empty;
 
+
+        /// <summary>
+        /// 搜同款时可能会用到
+        /// </summary>
+        public List<PromotionQueryItemDTO> PromotionImg = [];
+
     }
 
 }

+ 129 - 9
molilian.core/Plus/Alimama/parse.cs

@@ -75,9 +75,7 @@ namespace molilian.core
             return result.link_type == LinkTypeEnum.other_aff;
         }
 
-        public async Task<TkDataDTO> UnionParseAsync(string ip, string oaid, string content, int commerceType, TkDataDTO result,
-          bool isTaobaoUrl, string riskStrategy, int launchScene,
-            CancellationToken cancellationToken = default,
+        public async Task<TkDataDTO> UnionParseAsync(UnionParseRequest request, string content, TkDataDTO result, bool isTaobaoUrl, CancellationToken cancellationToken = default,
             Dictionary<string, long> swData = null)
         {
             result.itemName = "点击打开淘宝APP";
@@ -135,7 +133,7 @@ namespace molilian.core
 
             //============================== 放弃转链-地区过滤 ==============================
 
-            bool is_ignore2 = FlowControlIgnoreRequest(ip, oaid, riskStrategy, launchScene, out string reason);
+            bool is_ignore2 = FlowControlIgnoreRequest(request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out string reason);
             string message = "放弃转链";
             if (is_ignore2)
             {
@@ -151,13 +149,13 @@ 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}";
                     result.subCode = TkSubCodeEnum.PartnersDrop;
                     return result;
             }
@@ -236,6 +234,13 @@ namespace molilian.core
             result.retry_count = try_count;
             result.commercial = result.success;
 
+            if (result.success && "brwsimilar".Equals(request.RiskStrategy))
+            {
+                // 需要搜同款才进入这个逻辑
+                result.PromotionImg = await InternalCallPromotionQuery(result.pic, request.Oaid, request.Ip);
+            }
+
+
             if (!result.success)
             {
                 result.itemName = "点击打开淘宝APP";
@@ -247,6 +252,103 @@ namespace molilian.core
             return result;
         }
 
+        private async Task<List<PromotionQueryItemDTO>> InternalCallPromotionQuery(string pic, string oaid, string ip)
+        {
+            if (string.IsNullOrWhiteSpace(pic))
+            {
+                return [];
+            }
+
+            static bool TryParseItems(JsonElement element, out List<PromotionQueryItemDTO> items)
+            {
+                items = [];
+                if (element.ValueKind == JsonValueKind.Array)
+                {
+                    items = JsonSerializer.Deserialize<List<PromotionQueryItemDTO>>(element.GetRawText()) ?? [];
+                    return true;
+                }
+
+                if (element.ValueKind != JsonValueKind.Object)
+                {
+                    return false;
+                }
+
+                if (element.TryGetProperty("promotionImg", out var promotionImg) && promotionImg.ValueKind == JsonValueKind.Array)
+                {
+                    items = JsonSerializer.Deserialize<List<PromotionQueryItemDTO>>(promotionImg.GetRawText()) ?? [];
+                    return true;
+                }
+
+                if (element.TryGetProperty("PromotionImg", out promotionImg) && promotionImg.ValueKind == JsonValueKind.Array)
+                {
+                    items = JsonSerializer.Deserialize<List<PromotionQueryItemDTO>>(promotionImg.GetRawText()) ?? [];
+                    return true;
+                }
+
+                return false;
+            }
+            static List<PromotionQueryItemDTO> RemoveFirstItem(List<PromotionQueryItemDTO> items)
+            {
+                return items.Count > 0 ? items.Skip(1).ToList() : [];
+            }
+            string requestUrl = "https://similar.molilian.com/api/unsafePromotionQuery";
+            string targetPic = pic.StartsWith("//") ? $"https:{pic}" : pic;
+            object postData = new
+            {
+                url = targetPic,
+                oaid,
+                ip,
+                recommand = false
+            };
+
+            string post = postData.Convert2Json();
+
+            try
+            {
+                var client = new WebClientUtility().SetContentType("application/json")
+                                                   .Post(post);
+                var response = await client.RequestAsync(requestUrl, "POST");
+                var body = response.Body();
+
+                if (string.IsNullOrWhiteSpace(body))
+                {
+                    return [];
+                }
+
+                var root = body.Convert2JsonElement();
+                if (TryParseItems(root, out var result))
+                {
+                    return RemoveFirstItem(result);
+                }
+
+                if (root.ValueKind == JsonValueKind.Object)
+                {
+                    if (root.TryGetProperty("data", out var data) && TryParseItems(data, out result))
+                    {
+                        return RemoveFirstItem(result);
+                    }
+
+                    if (root.TryGetProperty("result", out var resultNode) && TryParseItems(resultNode, out result))
+                    {
+                        return RemoveFirstItem(result);
+                    }
+                }
+
+                _ = new LoggerLibrary("AlimamaPlus", "InternalCallPromotionQuery")
+                    .Info(post, body)
+                    .SaveAsync();
+            }
+            catch (Exception ex)
+            {
+                _ = new LoggerLibrary("AlimamaPlus", "InternalCallPromotionQuery")
+                    .Info(requestUrl, post)
+                    .Info(ex.Message, ex.StackTrace)
+                    .SaveAsync();
+            }
+
+            return [];
+        }
+
         public static bool ContainsTaobaoId(string content, string rawContent)
         {
             var match = Regex.Match(content, @"(?<=[?&]id=)\d+(?=&|$)");
@@ -623,10 +725,27 @@ namespace molilian.core
             }
             return false;
         }
-
+        public static bool IsDigitsOnly(string? s)
+        {
+            return !string.IsNullOrEmpty(s)
+                && s.AsSpan().IndexOfAnyExceptInRange('0', '9') < 0;
+        }
         public static TkDataDTO GetFormattedObject(UnionParseRequest request)
         {
-            string shortLinkurl = GetTaobaoLink(request.Content);
+            string content = request.Content;
+
+            switch (request.RiskStrategy)
+            {
+                case "brwsimilar":
+                case "tbpush":
+                    if (IsDigitsOnly(content))
+                    {
+                        content = $"https://item.taobao.com/item.htm?id={content}";
+                    }
+                    break;
+            }
+
+            string shortLinkurl = GetTaobaoLink(content);
             string deeplink_url = GetDeeplink(shortLinkurl);
             return new TkDataDTO()
             {
@@ -635,7 +754,8 @@ namespace molilian.core
                 channel = TkChannelEnum.tb,
                 accountName = string.Empty,
                 success = false,
-                content = request.Content,
+                content = content,
+                rawContent = request.Content,
                 link_type = LinkTypeEnum.unknown,
                 ip = request.Ip,
                 oaid = request.Oaid,

Vissa filer visades inte eftersom för många filer har ändrats