Jelajahi Sumber

腾讯会议不配的记录唤起app并打开url;
百度链接支持http协议,另外处理一下中文句号;
联盟增加“非标准链接”;

dodo hold 2 tahun lalu
induk
melakukan
7c1319ee05

+ 75 - 7
molilian.api/Controllers/admin/TaobaoController.cs

@@ -3,6 +3,7 @@ using dodohold.core;
 using Microsoft.AspNetCore.Mvc;
 using System.Text.Json;
 using System.Net;
+using static QRCoder.PayloadGenerator;
 namespace molilian.api.Controllers
 {
     [ApiController]
@@ -184,16 +185,16 @@ namespace molilian.api.Controllers
 
             var result = new DBContext.Table("v_tk_report_dailys")
                 .LeftJoin("daily_logs",
-                "B.log_date = A.report_date AND B.accountId=@dailys_accountId",
+                "B.log_date = A.report_date AND B.channel=0 AND B.accountId=@dailys_accountId",
                 "total_count, B.abandon_count, B.success_count, B.abandon_percentage, B.success_percentage," +
                 "B.parse_total_count, B.parse_abandon_count, B.parse_success_count, B.parse_abandon_percentage, B.parse_success_percentage," +
-                "B.coupon_total_count, B.coupon_abandon_count, B.coupon_success_count, B.coupon_abandon_percentage, B.coupon_success_percentage")
+                "B.coupon_total_count, B.coupon_abandon_count, B.coupon_success_count, B.coupon_abandon_percentage, B.coupon_success_percentage," +
+                "B.tool_total_count, B.tool_abandon_count, B.tool_success_count, B.tool_abandon_percentage, B.tool_success_percentage")
                 .Where(filter, new { dailys_accountId, dailys_accountName, stime, etime })
                 .Page(size, page)
                 .Order(orderBy)
                 .PageList<TkReportDTO>(getTotal);
 
-
             foreach (var item in result.List)
             {
                 if (item.report_date.Date < DateTime.Now.Date) continue;
@@ -235,6 +236,19 @@ namespace molilian.api.Controllers
                         item.coupon_abandon_percentage = $"{item.coupon_abandon_count / (double)item.coupon_total_count * 100:f2}%";
                     }
                 }
+
+                if (item.tool_total_count == 0)
+                {
+                    item.tool_total_count = TkLogCore.GetTotal($":tool_total:tb:{item.report_date:yyyyMMdd}");
+                    if (item.tool_total_count == 0) continue;
+                    item.tool_success_count = TkLogCore.GetTotal($":tool_total:tb:success:{item.report_date:yyyyMMdd}");
+                    item.tool_abandon_count = TkLogCore.GetTotal($":tool_total:tb:放弃转链:{item.report_date:yyyyMMdd}");
+                    if (item.tool_total_count > 0)
+                    {
+                        item.tool_success_percentage = $"{item.tool_success_count / (double)item.tool_total_count * 100:f2}%";
+                        item.tool_abandon_percentage = $"{item.tool_abandon_count / (double)item.tool_total_count * 100:f2}%";
+                    }
+                }
             }
             return new APIResult(new { data = result });
         }
@@ -282,10 +296,11 @@ namespace molilian.api.Controllers
 
             var result = new DBContext.Table("tk_report")
                 .LeftJoin("daily_logs",
-                "B.log_date = A.report_date AND B.accountId=A.accountId",
+                "B.log_date = A.report_date AND B.channel=0 AND B.accountId=A.accountId",
                 "total_count, B.abandon_count, B.success_count, B.abandon_percentage, B.success_percentage," +
                 "B.parse_total_count, B.parse_abandon_count, B.parse_success_count, B.parse_abandon_percentage, B.parse_success_percentage," +
-                "B.coupon_total_count, B.coupon_abandon_count, B.coupon_success_count, B.coupon_abandon_percentage, B.coupon_success_percentage")
+                "B.coupon_total_count, B.coupon_abandon_count, B.coupon_success_count, B.coupon_abandon_percentage, B.coupon_success_percentage," +
+                "B.tool_total_count, B.tool_abandon_count, B.tool_success_count, B.tool_abandon_percentage, B.tool_success_percentage")
                 .Where(filter, new { accountId, stime, etime })
                 .Page(size, page)
                 .Order(orderBy)
@@ -295,7 +310,10 @@ namespace molilian.api.Controllers
 
             foreach (var item in result.List)
             {
+#if DEBUG
+#else
                 if (item.report_date.Date < DateTime.Now.Date) continue;
+#endif
                 //var tk = TkPoolCore.GetOne(item.accountId);
                 //if (tk != null) item.accountName = tk.company;
                 string accountName = $"{TkChannelEnum.tb}_{item.accountId}";
@@ -347,6 +365,20 @@ namespace molilian.api.Controllers
                         item.coupon_abandon_percentage = $"{item.coupon_abandon_count / (double)item.coupon_total_count * 100:f2}%";
                     }
                 }
+
+                if (item.tool_total_count == 0)
+                {
+                    item.tool_total_count = TkLogCore.GetTotal($":tool_total:{accountName}:{item.report_date:yyyyMMdd}");
+                    if (item.tool_total_count == 0) continue;
+                    item.tool_success_count = TkLogCore.GetTotal($":tool_total:{accountName}:success:{item.report_date:yyyyMMdd}");
+                    item.tool_abandon_count = TkLogCore.GetTotal($":tool_total:{accountName}:放弃转链:{item.report_date:yyyyMMdd}");
+
+                    if (item.tool_total_count > 0)
+                    {
+                        item.tool_success_percentage = $"{item.tool_success_count / (double)item.tool_total_count * 100:f2}%";
+                        item.tool_abandon_percentage = $"{item.tool_abandon_count / (double)item.tool_total_count * 100:f2}%";
+                    }
+                }
             }
             return new APIResult(new { data = result });
         }
@@ -402,7 +434,11 @@ namespace molilian.api.Controllers
 
             foreach (var item in result.List)
             {
+
+#if DEBUG
+#else
                 if (item.report_date.Date < DateTime.Now.Date) continue;
+#endif
                 string accountName = $"{TkChannelEnum.tb}_{item.accountId}";
                 if (item.total_count == 0)
                 {
@@ -452,6 +488,21 @@ namespace molilian.api.Controllers
                         item.coupon_abandon_percentage = $"{item.coupon_abandon_count / (double)item.coupon_total_count * 100:f2}%";
                     }
                 }
+
+                if (item.tool_total_count == 0)
+                {
+                    item.tool_total_count = TkLogCore.GetTotal($":tool_total:{accountName}:{item.report_date:yyyyMMddHH}");
+
+                    if (item.tool_total_count == 0) continue;
+                    item.tool_success_count = TkLogCore.GetTotal($":tool_total:{item.accountName}:success:{item.report_date:yyyyMMddHH}");
+                    item.tool_abandon_count = TkLogCore.GetTotal($":tool_total:{item.accountName}:放弃转链:{item.report_date:yyyyMMddHH}");
+
+                    if (item.tool_total_count > 0)
+                    {
+                        item.tool_success_percentage = $"{item.tool_success_count / (double)item.tool_total_count * 100:f2}%";
+                        item.tool_abandon_percentage = $"{item.tool_abandon_count / (double)item.tool_total_count * 100:f2}%";
+                    }
+                }
             }
             return new APIResult(new { data = result });
         }
@@ -468,7 +519,12 @@ namespace molilian.api.Controllers
             var isHourtrend = form.Read<bool>("isLeaf", false);
             var total_key = form.Read("total_key", "total");
 
-            if (string.IsNullOrEmpty(accountName)) accountName = "all";
+            if (string.IsNullOrEmpty(accountName)) accountName = "tb";
+            //if (total_key == "tool_total")
+            //{
+            //    accountName = "tool";
+            //    total_key = "parse_total";
+            //}
 
             DateTime stime = DateTime.MinValue;
             if (!DateTime.TryParse(report_date[0], out stime)) return new APIResult(new { data = result, data2 = reason_result });
@@ -481,14 +537,26 @@ namespace molilian.api.Controllers
             if (total > 0)
             {
                 string[] keys = ["success"];
+                //if (accountName == "tool")
+                //{
+                //    keys = ["success", "bdpan", "wemeet"];
+                //}
+
                 cacheKey = $":{total_key}:{accountName}:message:{_report_date}";
                 string[] message_keys = TkLogCore.GetTotalKeys(cacheKey);
 
-                string[] combinedKeys = keys.Union(message_keys).ToArray();
+                var combinedKeys = keys.Union(message_keys).ToList();
+                combinedKeys.RemoveAll(item => item == "fail");
+
 
                 foreach (var keyname in combinedKeys)
                 {
                     cacheKey = $":{total_key}:{accountName}:{keyname}:{_report_date}";
+                    //if (accountName == "tool")
+                    //{
+                    //    cacheKey = $":{total_key}:{keyname}:{_report_date}";
+                    //}
+
                     int value = TkLogCore.GetTotal(cacheKey);
                     if (value == 0) continue;
                     result.Add(new { name = keyname, value, increases = Math.Round(value / total * 100, 2) });

+ 38 - 2
molilian.api/Controllers/public/TaskController.cs

@@ -5,6 +5,7 @@ using Org.BouncyCastle.Ocsp;
 using System.Text.Json;
 using System.Runtime.InteropServices;
 using System.Net;
+using System.Threading.Channels;
 
 namespace molilian.api.Controllers
 {
@@ -164,9 +165,13 @@ namespace molilian.api.Controllers
         {
             try
             {
+                //第三方老的统计
                 AlimamaPlus.DailyLogs(intervalDay);
-                AlimamaPlus.DailyLogs(intervalDay, "parse_");
-                AlimamaPlus.DailyLogs(intervalDay, "coupon_");
+
+                //产商统计
+                AlimamaPlus.DailyLogs(intervalDay, "parse_", "tb");
+                AlimamaPlus.DailyLogs(intervalDay, "coupon_", "tb");
+                AlimamaPlus.DailyLogs(intervalDay, "parse_", "tool");
             }
             catch (Exception ex)
             {
@@ -182,6 +187,37 @@ namespace molilian.api.Controllers
         }
 
 
+        [HttpGet]
+
+        public async Task<ActionResult> ApiCallStatistics(int intervalDay = 1)
+        {
+            try
+            {
+                AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.tb);
+                AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.tb, "parse_");
+                AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.tb, "coupon_");
+
+                AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.wemeet, "parse_");
+                AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.bdpan, "parse_");
+
+                AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.dy, "parse_");
+                AlimamaPlus.ApiCallStatistics(intervalDay, TkChannelEnum.jd, "parse_");
+
+            }
+            catch (Exception ex)
+            {
+                string message = $"【报表接口异常】ApiCallStatistics\n{ex.Message}\n{ex.StackTrace}";
+                NotifyCore.Notify(new NifyMessage
+                {
+                    message = message,
+                    priority = NifyMessagePriority.high,
+                    tags = ["red_circle"]
+                });
+            }
+            return new APIResult(new { success = true, message = "ok" });
+        }
+
+
         [HttpGet]
         public async Task<ActionResult> GetDrawBalance()
         {

+ 45 - 20
molilian.api/Controllers/public/TestController.cs

@@ -32,42 +32,67 @@ namespace molilian.api.Controllers
                 message = result
             });
         }
+
         [HttpGet]
         public async Task<ActionResult> testTask()
         {
             string url = "https://www.taobao.com";
             TkDataDTO result = new TkDataDTO();
-            WebClientUtility client = new WebClientUtility();
-            client.Timeout = TimeSpan.FromMilliseconds(100);
+            result.message = "init";
+            result.success = true;
 
 
+            int timeout = 1000;
             using var cts = new CancellationTokenSource();
-            cts.CancelAfter(1000);
-
+            cts.CancelAfter(timeout);
 
 
-            //var requestTask = alimama.UnionParse2Async(content, result, cts.Token, swData);
-            //var delayTask = Task.Delay(timeout, cts.Token);
-            //var completedTask = await Task.WhenAny(requestTask, delayTask);
-            //if (completedTask == requestTask)
-            //{
-            //    result = await requestTask;
-            //}
-            //else
-            //{
-            //    cts.Cancel();
-            //    result.success = false;
-            //    result.message = "放弃转链";
-            //    result.reason = "请求超时";
-            //    result.itemName = "点击打开淘宝APP";
-            //}
+            var requestTask = Task.Run(() => AlimamaPlus.testTaskAsync(result, cts.Token), cts.Token);
 
 
+            var delayTask = Task.Delay(timeout, cts.Token);
+            var completedTask = await Task.WhenAny(requestTask, delayTask);
+            if (completedTask == requestTask)
+            {
+                result = await requestTask;
+            }
+            else
+            {
+                cts.Cancel();
+                result.success = false;
+                result.message = "放弃转链";
+                result.reason = "请求超时";
+                result.itemName = "点击打开淘宝APP";
+            }
 
             return new APIResult(new
             {
                 success = true,
-                message = "ok"
+                message = "ok",
+                result,
+            });
+        }
+
+        [HttpGet]
+        public async Task<ActionResult> testThread()
+        {
+            // 查看默认的最小和最大线程数
+            ThreadPool.GetMinThreads(out int defaultMinWorker, out int defaultMinIOC);
+            ThreadPool.GetMaxThreads(out int defaultMaxWorker, out int defaultMaxIOC);
+            string tmp = $"Default Min worker threads: {defaultMinWorker}, Min I/O completion threads: {defaultMinIOC}";
+            string tmp2 = $"Default Max worker threads: {defaultMaxWorker}, Max I/O completion threads: {defaultMaxIOC}";
+
+
+
+            // 获取当前线程池中可用的工作线程数和 I/O 完成端口线程数
+            ThreadPool.GetAvailableThreads(out int availableWorkerThreads, out int availableIOCompletionThreads);
+            string tmp3 = $"Current available worker threads: {availableWorkerThreads}, available I/O completion threads: {availableIOCompletionThreads}";
+
+            return new APIResult(new
+            {
+                tmp,
+                tmp2,
+                tmp3,
             });
         }
 

File diff ditekan karena terlalu besar
+ 0 - 0
molilian.api/Properties/PublishProfiles/https___ccr.ccs.tencentyun.com_shaobin.pubxml.user


+ 106 - 88
molilian.core/Core/taoke/TkLogCore.cs

@@ -54,33 +54,7 @@ namespace molilian.core
                 {
                     var data = redis.LPop<TkDataDTO>(queue_tb_key);
                     if (data == null) break;
-                    data.id = new DBContext.Table(connection, "tk_logs")
-                        .Add("end_point", data.end_point)
-                        .Add("channel", (int)data.channel)
-                        .Add("accountId", data.accountId)
-                        .Add("accountName", data.accountName)
-                        .Add("rawContent", data.rawContent)
-                        .Add("rawContent2", data.rawContent2)
-                        .Add("success", data.success)
-                        .Add("message", data.message)
-                        .Add("reason", data.reason)
-                        .Add("content", data.content)
-                        .Add("couponAmount", data.couponAmount)
-                        .Add("itemId", data.itemId)
-                        .Add("itemName", data.itemName)
-                        .Add("pic", data.pic)
-                        .Add("promotionPrice", data.promotionPrice)
-                        .Add("taoToken", data.taoToken)
-                        .Add("shortLinkurl", data.shortLinkurl)
-                        .Add("deeplink_url", data.deeplink_url)
-                        .Add("num_iid", data.num_iid)
-                        .Add("elapsedTime", data.elapsedTime)
-                        .Add("ip", data.ip)
-                        .Add("oaid", data.oaid)
-                        .Add("create_time", data.create_time)
-                        .Create(DBContext.InsertType.NORMAL, transaction);
-
-                    if (data.elapsedTime > 1000)
+                    if ("127.0.0.1".Equals(data.ip))
                     {
                         new DBContext.Table(connection, "tk_logs_test")
                             .Add("end_point", data.end_point)
@@ -108,9 +82,9 @@ namespace molilian.core
                             .Add("create_time", data.create_time)
                             .Create(DBContext.InsertType.NORMAL, transaction);
                     }
-                    if (data.success)
+                    else
                     {
-                        new DBContext.Table(connection, "tk_success_logs")
+                        data.id = new DBContext.Table(connection, "tk_logs")
                             .Add("end_point", data.end_point)
                             .Add("channel", (int)data.channel)
                             .Add("accountId", data.accountId)
@@ -135,8 +109,38 @@ namespace molilian.core
                             .Add("oaid", data.oaid)
                             .Add("create_time", data.create_time)
                             .Create(DBContext.InsertType.NORMAL, transaction);
+
+                        if (data.success)
+                        {
+                            new DBContext.Table(connection, "tk_success_logs")
+                                .Add("end_point", data.end_point)
+                                .Add("channel", (int)data.channel)
+                                .Add("accountId", data.accountId)
+                                .Add("accountName", data.accountName)
+                                .Add("rawContent", data.rawContent)
+                                .Add("rawContent2", data.rawContent2)
+                                .Add("success", data.success)
+                                .Add("message", data.message)
+                                .Add("reason", data.reason)
+                                .Add("content", data.content)
+                                .Add("couponAmount", data.couponAmount)
+                                .Add("itemId", data.itemId)
+                                .Add("itemName", data.itemName)
+                                .Add("pic", data.pic)
+                                .Add("promotionPrice", data.promotionPrice)
+                                .Add("taoToken", data.taoToken)
+                                .Add("shortLinkurl", data.shortLinkurl)
+                                .Add("deeplink_url", data.deeplink_url)
+                                .Add("num_iid", data.num_iid)
+                                .Add("elapsedTime", data.elapsedTime)
+                                .Add("ip", data.ip)
+                                .Add("oaid", data.oaid)
+                                .Add("create_time", data.create_time)
+                                .Create(DBContext.InsertType.NORMAL, transaction);
+                        }
+                        if (!string.IsNullOrEmpty(data.itemId)) TkOrderTrackingCore.SaveLinkSummary(data);
                     }
-                    if (!string.IsNullOrEmpty(data.itemId)) TkOrderTrackingCore.SaveLinkSummary(data);
+
                     total++;
                 }
 
@@ -169,34 +173,7 @@ namespace molilian.core
                     var data = redis.LPop<TkDataDTO>(queue_parse_tb_key);
                     if (data == null) break;
 
-                    data.id = new DBContext.Table(connection, "tk_parse_logs")
-                        .Add("end_point", data.end_point)
-                        .Add("channel", (int)data.channel)
-                        .Add("accountId", data.accountId)
-                        .Add("accountName", data.accountName)
-                        .Add("rawContent", data.rawContent)
-                        .Add("success", data.success)
-                        .Add("message", data.message)
-                        .Add("reason", data.reason)
-                        .Add("content", data.content)
-                        .Add("itemId", data.itemId)
-                        .Add("itemName", data.itemName)
-                        .Add("pic", data.pic)
-                        .Add("couponAmount", data.couponAmount)
-                        .Add("promotionPrice", data.promotionPrice)
-                        .Add("taoToken", data.taoToken)
-                        .Add("shortLinkurl", data.shortLinkurl)
-                        .Add("deeplink_url", data.deeplink_url)
-                        .Add("num_iid", data.num_iid)
-                        .Add("elapsedTime", data.elapsedTime)
-                        .Add("elapsedTime2", data.elapsedTime2)
-                        .Add("elapsedTime3", data.elapsedTime3)
-                        .Add("ip", data.ip)
-                        .Add("oaid", data.oaid)
-                        .Add("create_time", data.create_time)
-                        .Create(DBContext.InsertType.NORMAL, transaction);
-
-                    if (data.elapsedTime > 1000)
+                    if ("127.0.0.1".Equals(data.ip))
                     {
                         new DBContext.Table(connection, "tk_parse_logs_test")
                             .Add("end_point", data.end_point)
@@ -224,39 +201,69 @@ namespace molilian.core
                             .Add("oaid", data.oaid)
                             .Add("create_time", data.create_time)
                             .Create(DBContext.InsertType.NORMAL, transaction);
-                    }
 
-                    if (data.success)
-                    {
-                        new DBContext.Table(connection, "tk_success_parse_logs")
-                            .Add("end_point", data.end_point)
-                            .Add("channel", (int)data.channel)
-                            .Add("accountId", data.accountId)
-                            .Add("accountName", data.accountName)
-                            .Add("rawContent", data.rawContent)
-                            .Add("success", data.success)
-                            .Add("message", data.message)
-                            .Add("reason", data.reason)
-                            .Add("content", data.content)
-                            .Add("itemId", data.itemId)
-                            .Add("itemName", data.itemName)
-                            .Add("pic", data.pic)
-                            .Add("couponAmount", data.couponAmount)
-                            .Add("promotionPrice", data.promotionPrice)
-                            .Add("taoToken", data.taoToken)
-                            .Add("shortLinkurl", data.shortLinkurl)
-                            .Add("deeplink_url", data.deeplink_url)
-                            .Add("num_iid", data.num_iid)
-                            .Add("elapsedTime", data.elapsedTime)
-                            .Add("elapsedTime2", data.elapsedTime2)
-                            .Add("elapsedTime3", data.elapsedTime3)
-                            .Add("ip", data.ip)
-                            .Add("oaid", data.oaid)
-                            .Add("create_time", data.create_time)
-                            .Create(DBContext.InsertType.NORMAL, transaction);
                     }
+                    else
+                    {
 
-                    if (!string.IsNullOrEmpty(data.itemId)) TkOrderTrackingCore.SaveLinkSummary(data);
+                        data.id = new DBContext.Table(connection, "tk_parse_logs")
+                        .Add("end_point", data.end_point)
+                        .Add("channel", (int)data.channel)
+                        .Add("accountId", data.accountId)
+                        .Add("accountName", data.accountName)
+                        .Add("rawContent", data.rawContent)
+                        .Add("success", data.success)
+                        .Add("message", data.message)
+                        .Add("reason", data.reason)
+                        .Add("content", data.content)
+                        .Add("itemId", data.itemId)
+                        .Add("itemName", data.itemName)
+                        .Add("pic", data.pic)
+                        .Add("couponAmount", data.couponAmount)
+                        .Add("promotionPrice", data.promotionPrice)
+                        .Add("taoToken", data.taoToken)
+                        .Add("shortLinkurl", data.shortLinkurl)
+                        .Add("deeplink_url", data.deeplink_url)
+                        .Add("num_iid", data.num_iid)
+                        .Add("elapsedTime", data.elapsedTime)
+                        .Add("elapsedTime2", data.elapsedTime2)
+                        .Add("elapsedTime3", data.elapsedTime3)
+                        .Add("ip", data.ip)
+                        .Add("oaid", data.oaid)
+                        .Add("create_time", data.create_time)
+                        .Create(DBContext.InsertType.NORMAL, transaction);
+
+                        if (data.success)
+                        {
+                            new DBContext.Table(connection, "tk_success_parse_logs")
+                                .Add("end_point", data.end_point)
+                                .Add("channel", (int)data.channel)
+                                .Add("accountId", data.accountId)
+                                .Add("accountName", data.accountName)
+                                .Add("rawContent", data.rawContent)
+                                .Add("success", data.success)
+                                .Add("message", data.message)
+                                .Add("reason", data.reason)
+                                .Add("content", data.content)
+                                .Add("itemId", data.itemId)
+                                .Add("itemName", data.itemName)
+                                .Add("pic", data.pic)
+                                .Add("couponAmount", data.couponAmount)
+                                .Add("promotionPrice", data.promotionPrice)
+                                .Add("taoToken", data.taoToken)
+                                .Add("shortLinkurl", data.shortLinkurl)
+                                .Add("deeplink_url", data.deeplink_url)
+                                .Add("num_iid", data.num_iid)
+                                .Add("elapsedTime", data.elapsedTime)
+                                .Add("elapsedTime2", data.elapsedTime2)
+                                .Add("elapsedTime3", data.elapsedTime3)
+                                .Add("ip", data.ip)
+                                .Add("oaid", data.oaid)
+                                .Add("create_time", data.create_time)
+                                .Create(DBContext.InsertType.NORMAL, transaction);
+                        }
+                        if (!string.IsNullOrEmpty(data.itemId)) TkOrderTrackingCore.SaveLinkSummary(data);
+                    }
                     total++;
                 }
 
@@ -688,6 +695,17 @@ namespace molilian.core
             var result = EndPointCore.ProcessEndPointNodes<int>(node =>
             {
                 if (!node.is_public_api) return 0;
+#if DEBUG
+                switch (node.name) {
+
+                    case "bj":
+                        node.redis_server = "101.200.46.46:6379,password=pKBiS4ka2IpXayIdcx00,defaultDatabase=0,idleTimeout=20000,preheat=3,tryit=2,ssl=false,prefix=webhook";
+                        break;
+                    case "gz":
+                        node.redis_server = "8.138.110.158:6379,password=pKBiS4ka2IpXayIdcx00,defaultDatabase=0,idleTimeout=20000,preheat=3,tryit=2,ssl=false,prefix=webhook";
+                        break; 
+                }
+#endif
                 var redis = RedisClientManager.GetRedisClient(node.redis_server);
                 return redis.Get<int>(keyname);
             });

+ 6 - 7
molilian.core/Core/taoke/UnionParseCore.cs

@@ -73,7 +73,7 @@ namespace molilian.core
                 result.shortLinkurl,
                 result.deeplink_url,
                 result.itemName,
-            }, result.success ? APIResultCodeEnum.OK : APIResultCodeEnum.NotAcceptable);
+            });
         }
 
         public static APIResult PanParse(string content, string ip, string oaid)
@@ -250,6 +250,8 @@ namespace molilian.core
                 stopwatch.Reset();
                 stopwatch.Start();
                 alimama = new AlimamaPlus(account);
+                result.accountName = account.company;
+
                 stopwatch.Stop();
                 swData.Add("AlimamaPlus", stopwatch.ElapsedMilliseconds);
 
@@ -260,9 +262,7 @@ namespace molilian.core
                 stopwatch.Reset();
                 stopwatch.Start();
 
-
-
-                var requestTask = alimama.UnionParse2Async(content, result, cts.Token, swData);
+                var requestTask = Task.Run(() => alimama.UnionParse2Async(content, result, cts.Token, swData), cts.Token);
                 var delayTask = Task.Delay(timeout, cts.Token);
                 var completedTask = await Task.WhenAny(requestTask, delayTask);
                 if (completedTask == requestTask)
@@ -280,9 +280,8 @@ namespace molilian.core
 
                 stopwatch.Stop();
                 swData.Add("UnionParse2Async", stopwatch.ElapsedMilliseconds);
-
-                //result = await alimama.UnionParse2Async(content, result);
                 result.accountName = account.company;
+                //result = await alimama.UnionParse2Async(content, result);
             }
             catch (Exception ex)
             {
@@ -431,7 +430,7 @@ namespace molilian.core
 
                 using var cts = new CancellationTokenSource();
                 cts.CancelAfter(timeout);
-                var requestTask = alimama.UnionParse2Async(content, result, cts.Token);
+                var requestTask = Task.Run(() => alimama.UnionParse2Async(content, result, cts.Token), cts.Token);
                 var delayTask = Task.Delay(timeout, cts.Token);
                 var completedTask = await Task.WhenAny(requestTask, delayTask);
                 if (completedTask == requestTask)

+ 5 - 0
molilian.core/DTO/alimama/TkReportDTO.cs

@@ -137,6 +137,11 @@
         public string coupon_abandon_percentage { get; set; } = string.Empty;
         public string coupon_success_percentage { get; set; } = string.Empty;
 
+        public int tool_total_count { get; set; } = 0;
+        public int tool_abandon_count { get; set; } = 0;
+        public int tool_success_count { get; set; } = 0;
+        public string tool_abandon_percentage { get; set; } = string.Empty;
+        public string tool_success_percentage { get; set; } = string.Empty;
     }
 
 }

+ 117 - 14
molilian.core/Plus/Alimama/crawler.cs

@@ -29,9 +29,15 @@ namespace molilian.core
         /// 更新API调用日志(1天一次)
         /// </summary>
         /// <param name="intervalDay"></param>
-        public static void DailyLogs(int intervalDay, string prefix = "")
+        public static void DailyLogs(int intervalDay, string prefix = "", string channel = "all")
         {
 
+            var db_prefix = prefix;
+            if (channel == "tool")
+            {
+                db_prefix = "tool_";
+            }
+
             DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
 
             var accounts = TkPoolCore.List();
@@ -62,13 +68,14 @@ namespace molilian.core
                      .Fields("id,log_date")
                      .Get<dynamic>("log_date=@log_date AND accountId=@accountId", new { log_date, accountId });
 
+
                 var createArgs = new DBContext.Table("daily_logs")
 
-                    .Add($"{prefix}total_count", total_count)
-                    .Add($"{prefix}abandon_count", abandon_count)
-                    .Add($"{prefix}abandon_percentage", abandon_percentage)
-                    .Add($"{prefix}success_count", success_count)
-                    .Add($"{prefix}success_percentage", success_percentage)
+                    .Add($"{db_prefix}total_count", total_count)
+                    .Add($"{db_prefix}abandon_count", abandon_count)
+                    .Add($"{db_prefix}abandon_percentage", abandon_percentage)
+                    .Add($"{db_prefix}success_count", success_count)
+                    .Add($"{db_prefix}success_percentage", success_percentage)
                     .Add("last_time", DateTime.Now);
 
                 if (exist == null)
@@ -87,9 +94,9 @@ namespace molilian.core
             }
 
 
-            int all_total_count = TkLogCore.GetTotal($":{prefix}total:all:{log_date:yyyyMMdd}");
-            var all_success_count = TkLogCore.GetTotal($":{prefix}total:all:success:{log_date:yyyyMMdd}");
-            var all_abandon_count = TkLogCore.GetTotal($":{prefix}total:all:放弃转链:{log_date:yyyyMMdd}");
+            int all_total_count = TkLogCore.GetTotal($":{prefix}total:{channel}:{log_date:yyyyMMdd}");
+            var all_success_count = TkLogCore.GetTotal($":{prefix}total:{channel}:success:{log_date:yyyyMMdd}");
+            var all_abandon_count = TkLogCore.GetTotal($":{prefix}total:{channel}:放弃转链:{log_date:yyyyMMdd}");
 
             string all_success_percentage = string.Empty;
             string all_abandon_percentage = string.Empty;
@@ -104,11 +111,11 @@ namespace molilian.core
                  .Get<dynamic>("log_date=@log_date AND accountId=@accountId", new { log_date, accountId = 0 });
 
             var createArgs2 = new DBContext.Table("daily_logs")
-                .Add($"{prefix}total_count", all_total_count)
-                .Add($"{prefix}abandon_count", all_abandon_count)
-                .Add($"{prefix}abandon_percentage", all_abandon_percentage)
-                .Add($"{prefix}success_count", all_success_count)
-                .Add($"{prefix}success_percentage", all_success_percentage)
+                .Add($"{db_prefix}total_count", all_total_count)
+                .Add($"{db_prefix}abandon_count", all_abandon_count)
+                .Add($"{db_prefix}abandon_percentage", all_abandon_percentage)
+                .Add($"{db_prefix}success_count", all_success_count)
+                .Add($"{db_prefix}success_percentage", all_success_percentage)
                 .Add("last_time", DateTime.Now);
 
             if (exist2 == null)
@@ -178,6 +185,102 @@ ON DUPLICATE KEY UPDATE
             //DBContext.Execute(sql2, new { });
         }
 
+        public static void ApiCallStatistics(int intervalDay, TkChannelEnum channel, string prefix = "")
+        {
+
+            DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
+
+            var accounts = TkPoolCore.List();
+
+            foreach (var account in accounts)
+            {
+                int accountId = account.id;
+                string accountName = $"{channel}_{account.id}";
+
+                int total_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:{log_date:yyyyMMdd}");
+                if (total_count == 0) continue;
+
+                var success_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:success:{log_date:yyyyMMdd}");
+                var abandon_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:放弃转链:{log_date:yyyyMMdd}");
+                string success_percentage = string.Empty;
+                string abandon_percentage = string.Empty;
+
+                if (total_count > 0)
+                {
+                    success_percentage = $"{success_count / (double)total_count * 100:f2}%";
+                    abandon_percentage = $"{abandon_count / (double)total_count * 100:f2}%";
+                }
+
+                var exist = new DBContext.Table("api_call_statistics")
+                     .Fields("id,log_date")
+                     .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId",
+                     new { log_date, channel, accountId });
+
+                var createArgs = new DBContext.Table("api_call_statistics")
+
+                    .Add($"{prefix}total_count", total_count)
+                    .Add($"{prefix}abandon_count", abandon_count)
+                    .Add($"{prefix}abandon_percentage", abandon_percentage)
+                    .Add($"{prefix}success_count", success_count)
+                    .Add($"{prefix}success_percentage", success_percentage)
+                    .Add("last_time", DateTime.Now);
+
+                if (exist == null)
+                {
+                    createArgs.Add("channel", channel)
+                        .Add("accountId", accountId)
+                        .Add("accountName", account.company)
+                        .Add("log_date", log_date)
+                        .Add("create_time", DateTime.Now)
+                        .Create();
+                }
+                else
+                {
+                    createArgs.Where("id=@id", new { exist.id }).Update();
+                }
+            }
+
+
+            int all_total_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:{log_date:yyyyMMdd}");
+            var all_success_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:success:{log_date:yyyyMMdd}");
+            var all_abandon_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:放弃转链:{log_date:yyyyMMdd}");
+
+            string all_success_percentage = string.Empty;
+            string all_abandon_percentage = string.Empty;
+            if (all_total_count > 0)
+            {
+                all_success_percentage = $"{all_success_count / (double)all_total_count * 100:f2}%";
+                all_abandon_percentage = $"{all_abandon_count / (double)all_total_count * 100:f2}%";
+            }
+
+            var exist2 = new DBContext.Table("api_call_statistics")
+                 .Fields("id,log_date")
+                 .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId",
+                 new { log_date, channel, accountId = 0 });
+
+            var createArgs2 = new DBContext.Table("api_call_statistics")
+                .Add($"{prefix}total_count", all_total_count)
+                .Add($"{prefix}abandon_count", all_abandon_count)
+                .Add($"{prefix}abandon_percentage", all_abandon_percentage)
+                .Add($"{prefix}success_count", all_success_count)
+                .Add($"{prefix}success_percentage", all_success_percentage)
+                .Add("last_time", DateTime.Now);
+
+            if (exist2 == null)
+            {
+                createArgs2.Add("channel", channel)
+                    .Add("accountId", 0)
+                    .Add("accountName", "all")
+                    .Add("log_date", log_date)
+                    .Add("create_time", DateTime.Now)
+                    .Create();
+            }
+            else
+            {
+                createArgs2.Where("id=@id", new { exist2.id }).Update();
+            }
+
+        }
 
         /// <summary>
         /// 事实动态接口(5分钟一次)

+ 3 - 1
molilian.core/Plus/Alimama/parse.cs

@@ -125,6 +125,7 @@ namespace molilian.core
                 if (!result.success)
                 {
                     result.content = content;
+                    result.itemName = "点击打开淘宝APP";
                     return result;
                 }
 
@@ -167,7 +168,8 @@ namespace molilian.core
             foreach (Match m in matches.Cast<Match>())
             {
                 string url = m.Value;
-                if (url.Contains("https://m.tb.cn/"))
+                if (url.Contains("https://m.tb.cn/") ||
+                    url.Contains("http://m.tb.cn/"))
                 {
                     result = result.Replace(url, shortLink);
                 }

+ 21 - 32
molilian.core/Plus/Alimama/parse_2.cs

@@ -8,40 +8,30 @@ using MySqlX.XDevAPI;
 using static dodohold.core.ZTOExpress.CreateOrderArgs;
 using System.Threading;
 using TencentCloud.Tcm.V20210413.Models;
+using COSXML.Network;
 
 namespace molilian.core
 {
     public partial class AlimamaPlus
     {
-        public async Task<TkDataDTO> testTaskAsync()
+        public static async Task<TkDataDTO> testTaskAsync(TkDataDTO result, CancellationToken token)
         {
             string url = "https://www.taobao.com";
-            TkDataDTO result = new TkDataDTO();
-            WebClientUtility client = new WebClientUtility();
-            client.Timeout = TimeSpan.FromMilliseconds(100);
-
-
-
-
-            //var requestTask = alimama.UnionParse2Async(content, result, cts.Token, swData);
-            //var delayTask = Task.Delay(timeout, cts.Token);
-            //var completedTask = await Task.WhenAny(requestTask, delayTask);
-            //if (completedTask == requestTask)
-            //{
-            //    result = await requestTask;
-            //}
-            //else
-            //{
-            //    cts.Cancel();
-            //    result.success = false;
-            //    result.message = "放弃转链";
-            //    result.reason = "请求超时";
-            //    result.itemName = "点击打开淘宝APP";
-            //}
-
-            return null;
-
-
+            try
+            {
+                WebClientUtility client = new WebClientUtility();
+                Thread.Sleep(5000);
+                //await Task.Delay(5000, token); // 使用Task.Delay代替Thread.Sleep
+                client.Timeout = TimeSpan.FromMilliseconds(3000);
+                var response = await client.RequestAsync(url);
+                var body = response.Body();
+            }
+            catch
+            {
+                result.success = false;
+                result.message = "Error";
+            }
+            return result;
         }
 
         public void UnionParse2(string content, ref TkDataDTO result)
@@ -241,6 +231,7 @@ namespace molilian.core
             }
             catch (Exception ex)
             {
+                _ = new LoggerLibrary("api_error", "desiredUrl_error").Info(ex.Message, ex.StackTrace).SaveAsync();
                 result = $"{ex.Message}\n{ex.StackTrace}";
             }
             return (false, result);
@@ -488,7 +479,7 @@ namespace molilian.core
                 }
 
 
-                if (result.elapsedTime2 >= _config.rt_max)
+                if (result.elapsedTime2 >= _config.rt_max || (!success && resultText.Contains("was canceled")))
                 {
                     result.success = false;
                     result.message = "放弃转链";
@@ -496,12 +487,9 @@ namespace molilian.core
                     result.itemName = "点击打开淘宝APP";
                     return result;
                     //cancellationToken.ThrowIfCancellationRequested();
-
                 }
 
 
-
-
                 if (success)
                 {
                     //排除已知的淘客链接
@@ -558,11 +546,12 @@ namespace molilian.core
                 }
 
                 result.success = false;
+                result.message= "非标准链接";
                 result.content = resultText;
                 result.link_type = link_type;
                 result.shortLinkurl = url;
-                return result;
 
+                return result;
                 //return (false, result, link_type, url);
             }
 

+ 17 - 6
molilian.core/Plus/JDUnion/JdUnionPlus.cs

@@ -50,7 +50,7 @@ namespace molilian.core
             if (string.IsNullOrEmpty(url)) return string.Empty;
 
             // 定义正则表达式模式,使用捕获组提取数字ID
-            string pattern = @"https://item(?:\.m)?\.jd\.com/(?:product/)?(\d+)\.html(?:\?.*)?";
+            string pattern = @"https?://item(?:\.m)?\.jd\.com/(?:product/)?(\d+)\.html(?:\?.*)?";
 
             // 使用正则表达式进行匹配
             Match match = Regex.Match(url, pattern);
@@ -131,12 +131,23 @@ namespace molilian.core
             itemId = string.Empty;
 
             if (string.IsNullOrEmpty(url)) return LinkTypeEnum.unknown;
-            if (url.StartsWith("https://u.jd.com")) return LinkTypeEnum.other_aff;
-            if (url.StartsWith("https://lives.jd.com/")) return LinkTypeEnum.live;
-            if (url.StartsWith("https://h5.m.jd.com/active/faxian/video/index.html")) return LinkTypeEnum.video;
-            if (url.StartsWith("https://eco.m.jd.com/content/dr_home/index.html")) return LinkTypeEnum.profile;
+            if (url.StartsWith("https://u.jd.com") ||
+                url.StartsWith("http://u.jd.com"))
+                return LinkTypeEnum.other_aff;
 
-            if (url.StartsWith("https://3.cn"))
+            if (url.StartsWith("https://lives.jd.com/") ||
+                url.StartsWith("http://lives.jd.com/"))
+                return LinkTypeEnum.live;
+
+            if (url.StartsWith("https://h5.m.jd.com/active/faxian/video/index.html") ||
+                url.StartsWith("http://h5.m.jd.com/active/faxian/video/index.html"))
+                return LinkTypeEnum.video;
+
+            if (url.StartsWith("https://eco.m.jd.com/content/dr_home/index.html") ||
+                url.StartsWith("http://eco.m.jd.com/content/dr_home/index.html")) return LinkTypeEnum.profile;
+
+            if (url.StartsWith("https://3.cn") ||
+                url.StartsWith("http://3.cn"))
             {
                 var target_url = GetDesiredUrl(url);
                 return GetLinkType(target_url, out desiredUrl, out itemId);

+ 0 - 0
molilian.core/Plus/DyUnion/DyUnionPlus.cs → molilian.core/Plus/Pangolin/DyUnion/DyUnionPlus.cs


+ 0 - 0
molilian.core/Plus/DyUnion/base.cs → molilian.core/Plus/Pangolin/DyUnion/base.cs


+ 47 - 20
molilian.core/Plus/Tool/ToolParsePlus.cs

@@ -80,13 +80,14 @@ namespace molilian.core
             surl = string.Empty;
             pwd = string.Empty;
 
+            text = text.Replace("pan。baidu。com", "pan.baidu.com");
+
             string result = string.Empty;
-            string linkPattern = @"(https://pan\.baidu\.com/s/[A-Za-z0-9?\-_=]+)";
+            string linkPattern = @"(https?://pan\.baidu\.com/s/[A-Za-z0-9?\-_=]+)";
             string codePattern = @"提取码[::]\s*([A-Za-z0-9]{4})";
             Regex linkRegex = new(linkPattern);
             Regex codeRegex = new(codePattern);
 
-
             Match linkMatch = linkRegex.Match(text);
             if (linkMatch.Success)
             {
@@ -119,6 +120,9 @@ namespace molilian.core
             string message = "OK";
             string surl = string.Empty, pwd = string.Empty;
             string shortLinkurl = GetPanLink(content, ref surl, ref pwd);
+            var deeplink_url = $"bdnetdisk://n/action.SHARE_LINK?surl={surl}&pwd={pwd}";
+            result.shortLinkurl = shortLinkurl;
+            result.deeplink_url = deeplink_url;
             if (string.IsNullOrEmpty(surl))
             {
                 result.channel = TkChannelEnum.bdpan;
@@ -129,39 +133,62 @@ namespace molilian.core
                 return;
             }
 
-            var deeplink_url = $"bdnetdisk://n/action.SHARE_LINK?surl={surl}&pwd={pwd}";
-
             result.channel = TkChannelEnum.bdpan;
             result.content = content;
             result.success = true;
             result.message = message;
-            result.shortLinkurl = shortLinkurl;
-            result.deeplink_url = deeplink_url;
         }
 
-        public static async Task<ToolParseDataDTO> WemeetParseAsync(string content,  ToolParseDataDTO result, CancellationToken cancellationToken = default)
+        public static async Task<ToolParseDataDTO> WemeetParseAsync(string content, ToolParseDataDTO result, CancellationToken cancellationToken = default)
         {
             string message = "OK";
-            string wemeetId =await GetWemeetIdAsync(content);
-            if (string.IsNullOrEmpty(wemeetId))
+            string wemeetId = await GetWemeetIdAsync(content);
+            var deeplink_url = "wemeet://launch";
+            result.deeplink_url = deeplink_url;
+            if (!string.IsNullOrEmpty(wemeetId))
             {
+                result.deeplink_url = $"wemeet://page/inmeeting?meeting_code={wemeetId}";
                 result.channel = TkChannelEnum.wemeet;
-                result.content = content;
-                result.success = false;
-                result.message = "转链失败";
-                result.reason = "内容不匹配";
+                result.content = wemeetId;
+                result.success = true;
+                result.message = message;
                 return result;
             }
 
-            var deeplink_url = $"wemeet://page/inmeeting?meeting_code={wemeetId}";
+            var url = await GetWemeetUrlAsync(content);
+            if (!string.IsNullOrEmpty(url))
+            {
+                result.deeplink_url = $"wemeet://page/external_link?url={url.UrlEncode()}";
+                result.channel = TkChannelEnum.wemeet;
+                result.content = wemeetId;
+                result.success = true;
+                result.message = message;
+                return result;
+            }
 
             result.channel = TkChannelEnum.wemeet;
-            result.content = wemeetId;
-            result.success = true;
-            result.message = message;
-            result.deeplink_url = deeplink_url;
+            result.content = content;
+            result.success = false;
+            result.message = "转链失败";
+            result.reason = "内容不匹配";
             return result;
         }
+        public static async Task<string> GetWemeetUrlAsync(string content)
+        {
+            string pattern = @"https?:\/\/meeting\.tencent\.com[^\s]*";
+
+
+            Regex regex = new Regex(pattern);
+            Match match = regex.Match(content);
+            string url = string.Empty;
+            // 判断是否匹配成功
+            if (match.Success)
+            {
+                // 提取会议编码
+                url = match.Groups[0].Value;
+            }
+            return url;
+        }
         public static async Task<string> GetWemeetIdAsync(string content)
         {
             string pattern = @"#腾讯会议:(\d{3}-\d{3}-\d{3})";
@@ -230,7 +257,7 @@ namespace molilian.core
         public static async Task<string> GetWemeetIdFromUrlAsync(string content)
         {
             {
-                string pattern = @"https:\/\/meeting\.tencent\.com\/p\/([0-9]+)";
+                string pattern = @"https?:\/\/meeting\.tencent\.com\/p\/([0-9]+)";
 
                 Regex regex = new Regex(pattern);
                 Match match = regex.Match(content);
@@ -246,7 +273,7 @@ namespace molilian.core
 
             {
                 content = content.Replace("meeting.tencent.com/dw/", "meeting.tencent.com/dm/");
-                string pattern = @"https:\/\/meeting\.tencent\.com\/dm\/[a-zA-Z0-9]+";
+                string pattern = @"https?:\/\/meeting\.tencent\.com\/dm\/[a-zA-Z0-9]+";
 
                 Regex regex = new Regex(pattern);
                 Match match = regex.Match(content);

+ 9 - 1
molilian.core/middleware/CustomToken.cs

@@ -9,8 +9,16 @@ namespace molilian.core
     {
         public static IServiceCollection Init(this IServiceCollection services)
         {
-            //注入验证 provider
+            //int minWorkerThreads = 128;  // 工作线程数的建议设置
+            //int minIOCompletionThreads = 512;  // I/O 完成端口线程数的建议设置
+            //ThreadPool.SetMinThreads(minWorkerThreads, minIOCompletionThreads);
+
 
+            //int newMaxWorker = 65535;  // 新的最大工作线程数
+            //int newMaxIOC = 2000;      // 新的最大I/O完成端口线程数
+            //ThreadPool.SetMaxThreads(newMaxWorker, newMaxIOC);
+
+            //注入验证 provider
             MyAuthorizationFactory.Register(new AdminProvider());
             MyAuthorizationFactory.Register(new AppProvider());
             MyAuthorizationFactory.Register(new APIProvider(), true);

+ 0 - 4
molilian.core/molilian.core.csproj

@@ -20,8 +20,4 @@
     <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.5.0" />
   </ItemGroup>
 
-  <ItemGroup>
-    <Folder Include="Plus\Pangolin\" />
-  </ItemGroup>
-
 </Project>

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini