Forráskód Böngészése

feat(隐藏号): 仅提交到上游接口的转链写日志,上报统计排除隐藏号

- 隐藏号提交到上游接口(任意 endpoint / PDD 联盟接口 / Deepleaper)后写入转链日志,前置放弃不写
- 选号时在结果上标记 hidden_account,不再依赖 accountId(PDD 前置放弃会清空 accountId)
- PDD 增加 endpoint_called 标记
- 隐藏号仍不写 Redis 统计
- FillLinkTypeDataAsync 统计链接类型时排除隐藏号日志,避免进入上报数据
dodo hold 1 hete
szülő
commit
a9a7243b4f

+ 1 - 1
molilian.core/Core/HiddenAccountCore.cs

@@ -4,7 +4,7 @@ using dodohold.core;
 namespace molilian.core
 {
     /// <summary>
-    /// 隐藏号判断:隐藏号命中的转链只返回 deeplink,不产生任何日志、统计、上报数据
+    /// 隐藏号判断:隐藏号命中的转链只返回 deeplink,照常写转链日志,但不产生任何统计、上报数据
     /// </summary>
     public static class HiddenAccountCore
     {

+ 11 - 10
molilian.core/Core/log/pdd.cs

@@ -121,20 +121,21 @@ namespace molilian.core
                 var ts = DateTime.Now - response.create_time;
                 response.elapsedTime = (int)ts.TotalMilliseconds;
 
-                bool is_hide = await HiddenAccountCore.IsHiddenAsync(TkChannelEnum.pdd, response.accountId);
+                bool is_hide = response.hidden_account
+                    || await HiddenAccountCore.IsHiddenAsync(TkChannelEnum.pdd, response.accountId);
 
-                // 隐藏号不产生任何日志、统计数据,只保留账号调用限额和账号状态处理
-                if (!is_hide)
+                // 隐藏号只记录真正提交到上游接口的转链日志,且不产生任何统计数据,只保留账号调用限额和账号状态处理
+                if (!is_hide || response.endpoint_called)
                 {
                     _ = RedisKit.RPushAsync(queue_parse_pdd_key, response);
+                }
 
-                    if (!TestParseCore.InWhitelist(response.ip, response.oaid))
-                    {
-                        await RecordParseMetricsAsync(
-                            response.channel.ToString(), response.accountId, response.accountName,
-                            response.success, response.message, response.reason, response.deeplink_url,
-                            response.riskStrategy, response.launchScene);
-                    }
+                if (!is_hide && !TestParseCore.InWhitelist(response.ip, response.oaid))
+                {
+                    await RecordParseMetricsAsync(
+                        response.channel.ToString(), response.accountId, response.accountName,
+                        response.success, response.message, response.reason, response.deeplink_url,
+                        response.riskStrategy, response.launchScene);
                 }
 
                 //if (response.success) saveClientRequestTotal(response.channel, response.ip, response.oaid);

+ 11 - 11
molilian.core/Core/log/taobao.cs

@@ -102,21 +102,21 @@ namespace molilian.core
                 response.elapsedTime = (int)ts.TotalMilliseconds;
 
                 var account = await TkPoolCore.ALLGetOneAsync(response.accountId);
-                bool is_hide = false;
-                if (account != null) is_hide = account.is_hide;
+                bool is_hide = response.hidden_account;
+                if (account != null && account.is_hide) is_hide = true;
 
-                // 隐藏号不产生任何日志、统计数据,只保留账号调用限额和账号状态处理
-                if (!is_hide)
+                // 隐藏号只记录真正提交到上游接口的转链日志,且不产生任何统计数据,只保留账号调用限额和账号状态处理
+                if (!is_hide || response.endpoint_called)
                 {
                     _ = RedisKit.RPushAsync(queue_parse_tb_key, response);
+                }
 
-                    if (!TestParseCore.InWhitelist(response.ip, response.oaid))
-                    {
-                        await RecordParseMetricsAsync(
-                            response.channel.ToString(), response.accountId, response.accountName,
-                            response.success, response.message, response.reason, response.deeplink_url,
-                            response.riskStrategy, response.launchScene);
-                    }
+                if (!is_hide && !TestParseCore.InWhitelist(response.ip, response.oaid))
+                {
+                    await RecordParseMetricsAsync(
+                        response.channel.ToString(), response.accountId, response.accountName,
+                        response.success, response.message, response.reason, response.deeplink_url,
+                        response.riskStrategy, response.launchScene);
                 }
 
                 if (response.success || response.message.Equals("转链失败") || response.message.Equals("放弃转链"))

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

@@ -253,7 +253,7 @@ namespace molilian.core
         {
             if (!result.success || hiddenAccountFailure == null) return result;
 
-            // 只替换对外响应;隐藏号的日志、统计由 TkLogCore.ParseLogAsync 统一跳过。
+            // 只替换对外响应;日志记录真实结果,隐藏号的统计由 TkLogCore.ParseLogAsync 统一跳过。
             hiddenAccountFailure.deeplink_url = result.deeplink_url;
             return hiddenAccountFailure;
         }
@@ -356,6 +356,7 @@ namespace molilian.core
 
                 DeepleaperPlus deepleaperPlus = new(account.nodeName);
 
+                result.endpoint_called = true;
                 var requestTask = Task.Run(async () => result = await deepleaperPlus.UnionParseAsync(result), cts.Token);
                 var delayTask = Task.Delay(timeout, cts.Token);
                 var completedTask = await Task.WhenAny(requestTask, delayTask);
@@ -765,6 +766,8 @@ namespace molilian.core
                         request.LaunchScene,
                         result.accountId);
                 }
+
+                result.hidden_account = account.is_hide;
 
                 //============================== 放弃转链-隐藏号同 ip/oaid 当天只转一次 ==============================
                 if (account.is_hide)
@@ -1592,6 +1595,8 @@ namespace molilian.core
                         result.accountId);
                 }
 
+                result.hidden_account = account.is_hide;
+
                 //============================== 放弃转链-隐藏号同 ip/oaid 当天只转一次 ==============================
                 if (account.is_hide)
                 {
@@ -1816,6 +1821,8 @@ namespace molilian.core
                         result.accountId);
                 }
 
+                result.hidden_account = account.is_hide;
+
                 //============================== 放弃转链-隐藏号同 ip/oaid 当天只转一次 ==============================
                 if (account.is_hide)
                 {
@@ -1906,7 +1913,7 @@ namespace molilian.core
             bool hiddenAccount = hiddenAccountFailure != null;
             if (result.success && hiddenAccountFailure != null)
             {
-                // 只替换对外响应;隐藏号的日志、统计由 TkLogCore.ParseLogAsync 统一跳过。
+                // 只替换对外响应;日志记录真实结果,隐藏号的统计由 TkLogCore.ParseLogAsync 统一跳过。
                 hiddenAccountFailure.deeplink_url = result.deeplink_url;
                 result = hiddenAccountFailure;
             }

+ 4 - 0
molilian.core/Core/taoke/UnionParseCore/dp2dp.cs

@@ -416,6 +416,8 @@ namespace molilian.core
                 result.accountName = account.company;
                 if (account.is_hide) _ = TracksCore.RevertParseRequestAsync(request);
 
+                result.hidden_account = account.is_hide;
+
                 //============================== 放弃转链-隐藏号同 ip/oaid 当天只转一次 ==============================
                 if (account.is_hide)
                 {
@@ -889,6 +891,8 @@ namespace molilian.core
                 result.proxy_node = account.nodeName;
                 if (account.is_hide) _ = TracksCore.RevertParseRequestAsync(request);
 
+                result.hidden_account = account.is_hide;
+
                 //============================== 放弃转链-隐藏号同 ip/oaid 当天只转一次 ==============================
                 if (account.is_hide)
                 {

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

@@ -142,6 +142,12 @@ namespace molilian.core
         [IgnoreInsert, IgnoreUpdate]
         public bool endpoint_called { get; set; } = false;
 
+        /// <summary>
+        /// 本次转链分配到的是否为隐藏号(选号时设置,不依赖 accountId 是否被清空)
+        /// </summary>
+        [IgnoreInsert, IgnoreUpdate]
+        public bool hidden_account { get; set; } = false;
+
 
         /// <summary>
         /// 搜同款时可能会用到

+ 10 - 0
molilian.core/DTO/pdd/PddDataDTO.cs

@@ -17,6 +17,16 @@
         public string taoToken { get; set; } = string.Empty;
         public string rawContent { get; set; } = string.Empty;
         public string rawContent2 { get; set; } = string.Empty;
+
+        /// <summary>
+        /// 是否已提交到上游转链接口(隐藏号只记录真正提交上游的日志)
+        /// </summary>
+        public bool endpoint_called { get; set; } = false;
+
+        /// <summary>
+        /// 本次转链分配到的是否为隐藏号(选号时设置,不依赖 accountId 是否被清空)
+        /// </summary>
+        public bool hidden_account { get; set; } = false;
         public string ip { get; set; } = string.Empty;
         public string oaid { get; set; } = string.Empty;
 

+ 2 - 0
molilian.core/Plus/Alimama/crawler.cs

@@ -271,8 +271,10 @@ namespace molilian.core
                         int exist_table = DBContext.ExecuteScalar<int>(exist_sql);
                         if (exist_table == 1)
                         {
+                            // 隐藏号的转链日志不计入上报数据
                             var linkTypeTotal = new DBContext.Table(tableName)
                                             .Fields("linkType, count(*) AS total")
+                                            .Where("accountId NOT IN (SELECT id FROM tk_pool WHERE is_hide=1)", null)
                                             .GroupBy("linkType")
                                             .Select<dynamic>();
 

+ 1 - 0
molilian.core/Plus/pdd/PddUnionPlus.cs

@@ -505,6 +505,7 @@ namespace molilian.core
             Stopwatch stopwatch2 = Stopwatch.StartNew();
             stopwatch2.Start();
 
+            result.endpoint_called = true;
             result = _account.work_mode switch
             {
                 PddUnionWorkMode.SiteApi => await UnionGeneratelink(result, url, cancellationToken),