Explorar el Código

增加爬虫:推广效果数据表;
增加爬虫:预估结算收入明细;

dodo hold hace 2 años
padre
commit
75ef398205
Se han modificado 31 ficheros con 1331 adiciones y 585 borrados
  1. 5 1
      molilian.api/Controllers/admin/JdUnionController.cs
  2. 2 1
      molilian.api/Controllers/public/ApiController.cs
  3. 0 77
      molilian.api/Controllers/public/ForwardController.cs
  4. 0 51
      molilian.api/Controllers/public/ImgController.cs
  5. 150 45
      molilian.api/Controllers/public/TaskController.cs
  6. 95 16
      molilian.api/Controllers/public/TestController.cs
  7. 86 114
      molilian.api/Controllers/public/TkController.cs
  8. 0 0
      molilian.api/Properties/PublishProfiles/https___ccr.ccs.tencentyun.com_shaobin.pubxml.user
  9. 1 1
      molilian.api/Properties/launchSettings.json
  10. 1 0
      molilian.core/Core/API/ApiAccountCore.cs
  11. 124 0
      molilian.core/Core/API/ApiReportCore.cs
  12. 0 25
      molilian.core/Core/ConfigCore.cs
  13. 41 0
      molilian.core/Core/EndPointCore.cs
  14. 10 2
      molilian.core/Core/taoke/JdPoolCore.cs
  15. 24 11
      molilian.core/Core/taoke/TaokeOpenCore.cs
  16. 5 1
      molilian.core/Core/taoke/TkLogCore.cs
  17. 48 6
      molilian.core/Core/taoke/UnionCouponCore.cs
  18. 1 1
      molilian.core/DTO/EndPointDTO.cs
  19. 1 0
      molilian.core/DTO/alimama/UnionCouponDTO.cs
  20. 9 0
      molilian.core/DTO/jd/JdPoolDTO.cs
  21. 149 74
      molilian.core/Plus/Alimama/crawler.cs
  22. 11 1
      molilian.core/Plus/Alimama/parse.cs
  23. 27 3
      molilian.core/Plus/Alimama/parse_2.cs
  24. 143 0
      molilian.core/Plus/JDUnion/EstimateComm.cs
  25. 1 0
      molilian.core/Plus/JDUnion/JdUnionPlus.cs
  26. 115 0
      molilian.core/Plus/JDUnion/SpreadEffect.cs
  27. 92 0
      molilian.core/Plus/JDUnion/amount.cs
  28. 49 34
      molilian.core/Plus/JDUnion/goods.cs
  29. 100 0
      molilian.core/Plus/JDUnion/order.cs
  30. 41 7
      molilian.core/Plus/TaobaoOpen/TaobaoOpenPlus.cs
  31. 0 114
      molilian.core/Plus/UploadFile/ImageHostingPlus.cs

+ 5 - 1
molilian.api/Controllers/admin/JdUnionController.cs

@@ -6,6 +6,7 @@ using System.Net;
 using static QRCoder.PayloadGenerator;
 using MySqlX.XDevAPI;
 using OfficeOpenXml.FormulaParsing.LexicalAnalysis;
+using WebSocketSharp.Net;
 namespace molilian.api.Controllers
 {
 
@@ -32,6 +33,9 @@ namespace molilian.api.Controllers
 
 
             string cookie = form.Read<string>("cookie", string.Empty);
+            cookie = cookie.Replace("\r", "").Replace("\n", "").Trim();
+            if (!cookie.EndsWith(";")) cookie += ";";
+
             var accountId = JdPoolCore.UpdateCookies(cookie, user_agent);
             bool success = accountId > 0;
             if (success)
@@ -71,7 +75,7 @@ namespace molilian.api.Controllers
             string sort = form.Read<string>("sort");
             string order = form.Read<string>("order");
 
-            string filter = string.Empty;
+            string filter = " is_hide=0";
             if (!string.IsNullOrEmpty(keyword))
             {
                 filter += $" AND (`name` LIKE @keyword OR `description` LIKE @keyword)";

+ 2 - 1
molilian.api/Controllers/public/ApiController.cs

@@ -77,6 +77,7 @@ namespace molilian.api.Controllers
             var ip = form.Read("ip", string.Empty);
             var oaid = form.Read("oaid", string.Empty);
             var recommand = form.Read("recommand", true);
+            var debug = form.Read("debug", false);
 
             if (!string.IsNullOrEmpty(url))
             {
@@ -90,7 +91,7 @@ namespace molilian.api.Controllers
                 oaid = $"{rand.Next(100000, 999999)}-{rand.Next(100000, 999999)}-{rand.Next(100000, 999999)}";
             }
 
-            return await core.PromotionQueryAsync(img, oaid, ip, recommand);
+            return await core.PromotionQueryAsync(img, oaid, ip, recommand, debug);
         }
 
 

+ 0 - 77
molilian.api/Controllers/public/ForwardController.cs

@@ -1,77 +0,0 @@
-using molilian.core;
-using dodohold.core;
-using Microsoft.AspNetCore.Mvc;
-using System.Text.Json;
-
-namespace molilian.api.Controllers
-{
-    [ApiController]
-    [Route("[controller]/[action]")]
-    public class ForwardController : ControllerBase
-    {
-
-        protected IHttpContextAccessor _accessor;
-        public ForwardController(IHttpContextAccessor accessor)
-        {
-            _accessor = accessor;
-        }
-
-        //https://api.molilian.vip/forward/qyapi2ntfy/5Sq9BytXXM5WDY3G
-
-        [HttpPost]
-        public ActionResult qyapi2ntfy(string url, [FromBody] JsonElement form)
-        {
-            int errcode = 0;
-            string errmsg = "ok";
-
-            string publish_url = string.Empty, topic = string.Empty;
-            if (string.IsNullOrEmpty(url))
-            {
-                errcode = 93000;
-                errmsg = "Invalid ntfy server or topic";
-                return new APIResult(new { errmsg, errcode });
-            }
-
-            string msgtype = form.Read("msgtype", string.Empty);
-            switch (msgtype)
-            {
-                case "text":
-                    {
-                        string content = form.PathRead("text.content", string.Empty);
-                        NifyPlus.Send(url, new NifyMessage
-                        {
-                            message = content,
-                        });
-                        break;
-                    }
-                case "markdown":
-                    {
-                        string content = form.PathRead("markdown.content", string.Empty);
-                        NifyPlus.Send(url, new NifyMessage
-                        {
-                            markdown = true,
-                            message = content,
-                        });
-
-                        /*
-{
-	"topic": "sTXE2kwKp9u8tgnM",
-	"message": "#### \u6D88\u606F\u901A\u9053\u914D\u7F6E\u63D0\u9192\n \u003E\u670D\u52A1\u5668\uFF1A\u5B9D\u5854Linux\u9762\u677F\n \u003EIP\u5730\u5740\uFF1A127.0.0.1(\u5916) 89.58.28.154(\u5185)\n \u003E\u53D1\u9001\u65F6\u95F4\uFF1A2024-04-07 12:58:42\n \u003E\u914D\u7F6E\u72B6\u6001\uFF1A\u003Cfont color=#20a53a\u003E\u6210\u529F\u003C/font\u003E",
-	"title": "",
-	"tags": [],
-	"priority": 3,
-	"click": "",
-	"attach": "",
-	"markdown": true,
-	"icon": ""
-}                         
-                         */
-                        break;
-                    }
-            }
-            _ = new LoggerLibrary("forward", "qyapi2ntfy").Info(form.Convert2Json()).SaveAsync();
-            return new APIResult(new { errmsg, errcode });
-        }
-
-    }
-}

+ 0 - 51
molilian.api/Controllers/public/ImgController.cs

@@ -1,51 +0,0 @@
-using molilian.core;
-using dodohold.core;
-using Microsoft.AspNetCore.Mvc;
-using System.Text.Json;
-
-namespace molilian.api.Controllers
-{
-    [ApiController]
-    [Route("[controller]/[action]")]
-    public class ImgController : ControllerBase
-    {
-
-        protected IHttpContextAccessor _accessor;
-        public ImgController(IHttpContextAccessor accessor)
-        {
-            _accessor = accessor;
-        }
-
-
-        [HttpPost("{tokenString}")]
-        public async Task<ActionResult> Upfile(string tokenString, IFormFile file)
-        {
-            if (string.IsNullOrEmpty(tokenString) || file == null || file.Length == 0)
-                return new APIResult(new { msg = "参数提交不正确", status = -1 });
-
-            var token = ApiTokenCore.GetOne(tokenString);
-
-            if (token == null)
-                return new APIResult(new { msg = "key不正确", status = -2 });
-            if (!token.status)
-                return new APIResult(new { msg = "账号已经禁用", status = -3 });
-
-            if (token.last_time < DateTime.Now)
-                return new APIResult(new { msg = "授权已到期", status = -3 });
-
-            string lockKey = $"lock:{tokenString}";
-
-            if (RedisHelper.Exists(lockKey))
-                return new APIResult(new { msg = "请求频率过高", status = -4 });
-
-            using MemoryStream stream = new();
-            file.CopyTo(stream);
-            var bytes = stream.ToArray();
-
-            var result = await ImageHostingPlus.Dianping(file.FileName, bytes);
-            return new APIResult(new { data = result });
-
-        }
-
-    }
-}

+ 150 - 45
molilian.api/Controllers/public/TaskController.cs

@@ -6,6 +6,7 @@ using System.Text.Json;
 using System.Runtime.InteropServices;
 using System.Net;
 using System.Threading.Channels;
+using TencentCloud.Cdwch.V20200915.Models;
 
 namespace molilian.api.Controllers
 {
@@ -20,6 +21,8 @@ namespace molilian.api.Controllers
             _accessor = accessor;
         }
 
+
+
         [HttpGet]
         public ActionResult BatchInsertLogDB(int limit = 100)
         {
@@ -263,16 +266,6 @@ namespace molilian.api.Controllers
                     AlimamaPlus.AllDailyLogs(intervalDay);
                 }
             }
-
-            //tool_total
-            //jd_parse_total
-            //total
-            //coupon_total
-            //parse_total
-
-
-
-
             catch (Exception ex)
             {
                 string message = $"【报表接口异常】DailyLogs\n{ex.Message}\n{ex.StackTrace}";
@@ -283,6 +276,25 @@ namespace molilian.api.Controllers
                     tags = ["red_circle"]
                 });
             }
+
+            if (intervalDay > 0)
+            {
+                try
+                {
+                    AlimamaPlus.ApiCallStatistics(1, intervalDay, TkChannelEnum.tb);
+                    AlimamaPlus.ApiCallStatistics(2, intervalDay, TkChannelEnum.tb);
+                }
+                catch (Exception ex)
+                {
+                    string message = $"【API报表更新异常】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" });
         }
 
@@ -293,20 +305,12 @@ namespace molilian.api.Controllers
         {
             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_");
-
+                AlimamaPlus.ApiCallStatistics(1, intervalDay, TkChannelEnum.tb);
+                AlimamaPlus.ApiCallStatistics(2, intervalDay, TkChannelEnum.tb);
             }
             catch (Exception ex)
             {
-                string message = $"【报表接口异常】ApiCallStatistics\n{ex.Message}\n{ex.StackTrace}";
+                string message = $"【API报表更新异常】ApiCallStatistics\n{ex.Message}\n{ex.StackTrace}";
                 NotifyCore.Notify(new NifyMessage
                 {
                     message = message,
@@ -317,6 +321,36 @@ namespace molilian.api.Controllers
             return new APIResult(new { success = true, message = "ok" });
         }
 
+        //[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()
@@ -378,13 +412,16 @@ namespace molilian.api.Controllers
             var jd_list = new DBContext.Table("jd_pool").Where("", null).Select<JdPoolDTO>();
             if (jd_list != null)
             {
+                bool any_jd_changed = false;
                 foreach (var account in jd_list)
                 {
+                    bool changed = false;
                     try
                     {
                         account.current_daily_calls = JdPoolCore.SaveCalls(account.id, DateTime.Now.ToString("yyyyMMdd"));
                         account.current_hourly_calls = JdPoolCore.SaveCalls(account.id, DateTime.Now.ToString("yyyyMMddHH"));
-                        JdPoolCore.Update(account);
+                        changed = true;
+                        any_jd_changed = true;
                     }
                     catch (Exception ex)
                     {
@@ -397,8 +434,39 @@ namespace molilian.api.Controllers
                         });
                         continue;
                     }
+                    if (!account.status) continue;
+                    if (!string.IsNullOrEmpty(account.cookies))
+                    {
+                        try
+                        {
+                            var plus = new JdUnionPlus(account);
+                            var data = await plus.queryTodaySpreadEffectData();
+                            account.today_clickNum = data.clickNum;
+                            account.today_cosFee = data.cosFee;
+                            account.today_cosPrice = data.cosPrice;
+                            account.today_finishCosFee = data.finishCosFee;
+                            account.today_finishCosPrice = data.finishCosPrice;
+                            account.today_finishOrderNum = data.finishOrderNum;
+                            account.today_orderNum = data.orderNum;
+
+                            changed = true;
+                            any_jd_changed = true;
+                        }
+                        catch (Exception ex)
+                        {
+                            message = $"【JD报表接口异常】{account.id}:{account.name}\tqueryTodaySpreadEffectData\n{ex.Message}\n{ex.StackTrace}";
+                            NotifyCore.Notify(new NifyMessage
+                            {
+                                message = message,
+                                priority = NifyMessagePriority.high,
+                                tags = ["red_circle"]
+                            });
+                            continue;
+                        }
+                    }
+                    if (changed) JdPoolCore.Update(account);
                 }
-                JdPoolCore.Refresh();
+                if (any_jd_changed) JdPoolCore.Refresh();
             }
 
             await EndPointCore.NotifyReload(true);
@@ -408,38 +476,75 @@ namespace molilian.api.Controllers
         [HttpGet]
         public async Task<ActionResult> SaveReport()
         {
-
-            var list = TkPoolCore.List();
-            if (list == null) return new APIResult(new { success = false, message = "没有有效账号", });
             string message = string.Empty;
-            foreach (var account in list)
+
+            var jd_list = new DBContext.Table("jd_pool").Where("", null).Select<JdPoolDTO>();
+            if (jd_list != null)
             {
-                if (!account.enable_sync_order) continue;
+                foreach (var account in jd_list)
+                {
+                    if (!account.status) continue;
 #if DEBUG
-                if (account.id != 5) continue;
+                    if (account.id != 10) continue;
 #endif
-                try
-                {
-                    var alimama = new AlimamaPlus(account);
-                    alimama.SaveReportHourtrend(DateTime.Now.AddDays(-1));
-                    alimama.SaveReportHourtrend(DateTime.Now);
 
-                    if (DateTime.Now.Hour >= 12 && DateTime.Now.Hour < 16)
+
+                    if (!string.IsNullOrEmpty(account.cookies))
                     {
-                        DateTime date = DateTime.Now.AddDays(-1);
-                        alimama.FixReport(date);
+                        try
+                        {
+                            var plus = new JdUnionPlus(account);
+                            _ = await plus.querySpreadEffectData(DateTime.Now.AddDays(-1));
+                            _ = await plus.queryEstimateCommList();
+                        }
+                        catch (Exception ex)
+                        {
+                            message = $"【JD报表接口异常】{account.id}:{account.name}\tquerySpreadEffectData\n{ex.Message}\n{ex.StackTrace}";
+                            NotifyCore.Notify(new NifyMessage
+                            {
+                                message = message,
+                                priority = NifyMessagePriority.high,
+                                tags = ["red_circle"]
+                            });
+                            continue;
+                        }
                     }
                 }
-                catch (Exception ex)
+            }
+
+
+            var list = TkPoolCore.List();
+            if (list != null)
+            {
+                foreach (var account in list)
                 {
-                    message = $"【报表接口异常】SaveReport\n{ex.Message}\n{ex.StackTrace}";
-                    NotifyCore.Notify(new NifyMessage
+                    if (!account.enable_sync_order) continue;
+#if DEBUG
+                    if (account.id != 5) continue;
+#endif
+                    try
                     {
-                        message = message,
-                        priority = NifyMessagePriority.high,
-                        tags = ["red_circle"]
-                    });
-                    continue;
+                        var alimama = new AlimamaPlus(account);
+                        alimama.SaveReportHourtrend(DateTime.Now.AddDays(-1));
+                        alimama.SaveReportHourtrend(DateTime.Now);
+
+                        if (DateTime.Now.Hour >= 12 && DateTime.Now.Hour < 16)
+                        {
+                            DateTime date = DateTime.Now.AddDays(-1);
+                            alimama.FixReport(date);
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        message = $"【报表接口异常】SaveReport\n{ex.Message}\n{ex.StackTrace}";
+                        NotifyCore.Notify(new NifyMessage
+                        {
+                            message = message,
+                            priority = NifyMessagePriority.high,
+                            tags = ["red_circle"]
+                        });
+                        continue;
+                    }
                 }
             }
             return new APIResult(new { success = true, message = "ok" });

+ 95 - 16
molilian.api/Controllers/public/TestController.cs

@@ -13,6 +13,7 @@ using static Spire.Xls.Core.Spreadsheet.HTMLOptions;
 using System.Net.Http.Json;
 using System.Text.RegularExpressions;
 using System.Text;
+using TencentCloud.Oceanus.V20190422.Models;
 
 namespace molilian.api.Controllers
 {
@@ -26,6 +27,100 @@ namespace molilian.api.Controllers
         {
             _accessor = accessor;
         }
+
+
+        //[HttpGet]
+        //public async Task<ActionResult> test(string table = "tk_parse_logs_shop", int count = 100)
+        //{
+        //    //table = "tk_parse_logs_shop";
+        //    //table = "tk_parse_logs_live";
+        //    //table = "tk_parse_logs_video";
+
+        //    string filter = "success=0 AND message='放弃转链' AND reason='非标准链接'";
+
+        //    for (int i = 0; i < 100; i++)
+        //    {
+        //        try
+        //        {
+        //            var list = new DBContext.Table(table)
+        //                .Where(filter, new { })
+        //                .Limit(count).Select<TkDataDTO>();
+        //            if (!list.Any())
+        //            {
+
+        //                return new APIResult(new
+        //                {
+        //                    success = false,
+        //                    message = "所有任务完成"
+        //                });
+
+        //            }
+        //            foreach (var item in list)
+        //            {
+        //                TkPoolDTO? account = TkPoolCore.GetOne(TkPoolCore.TkAction.parse);
+        //                if (account == null)
+        //                {
+        //                    return new APIResult(new
+        //                    {
+        //                        success = false,
+        //                        message = "没有工作账号"
+        //                    });
+        //                }
+
+        //                var result = item.Convert2Json().Convert2Object<TkDataDTO>();
+
+        //                result.accountId = account.id;
+        //                result.accountName = account.company;
+
+        //                var alimama = new AlimamaPlus(account);
+
+
+        //                int timeout = alimama._config.rt_max;
+        //                using var cts = new CancellationTokenSource();
+        //                cts.CancelAfter(timeout);
+
+        //                result = await alimama.UnionParseAsync(item.content, result);
+        //                string reason = "非标准链接".Equals(result.reason) ? "非标准链接ok" : result.reason;
+
+        //                new DBContext.Table(table)
+        //                    .Add("linkType", (int)result.link_type)
+        //                    .Add("rawContent", result.rawContent)
+        //                    .Add("success", result.success)
+        //                    .Add("message", result.message)
+        //                    .Add("reason", reason)
+        //                    .Add("content", result.content)
+        //                    .Add("itemId", result.itemId)
+        //                    .Add("itemName", result.itemName)
+        //                    .Add("pic", result.pic)
+        //                    .Add("couponAmount", result.couponAmount)
+        //                    .Add("promotionPrice", result.promotionPrice)
+        //                    .Add("taoToken", result.taoToken)
+        //                    .Add("shortLinkurl", result.shortLinkurl)
+        //                    .Add("deeplink_url", result.deeplink_url)
+        //                    .Add("num_iid", result.num_iid)
+        //                    .Add("elapsedTime", result.elapsedTime)
+        //                    .Add("elapsedTime2", result.elapsedTime2)
+        //                    .Add("elapsedTime3", result.elapsedTime3)
+        //                    .Add("subCode", result.subCode)
+        //                    .Where("id=@id", new { item.id })
+        //                    .Update();
+        //            }
+        //        }
+        //        catch
+        //        {
+        //        }
+        //    }
+
+        //    return new APIResult(new
+        //    {
+        //        success = true,
+        //        message = "ok"
+        //    });
+
+
+        //}
+
+
         [HttpPost]
         public async Task<ActionResult> test([FromForm] string jsonContent, [FromForm] string testText)
         {
@@ -286,22 +381,6 @@ namespace molilian.api.Controllers
             return new APIResult(new { success = true, message = "ok" });
         }
 
-        [HttpPost]
-        public async Task<ActionResult> Upfile(IFormFile file, [FromQuery] string dir = "")
-        {
-            // 检查文件是否为空
-            if (file == null || file.Length == 0) throw new APIException("无效文件");
-
-            using MemoryStream stream = new();
-            file.CopyTo(stream);
-            var bytes = stream.ToArray();
-
-            var result = await ImageHostingPlus.Dianping(file.FileName, bytes);
-            //result = ImageHostingPlus.Dianping2(file);
-
-            return new APIResult(new { data = result });
-        }
-
 
 
     }

+ 86 - 114
molilian.api/Controllers/public/TkController.cs

@@ -11,6 +11,7 @@ using TencentCloud.Ecm.V20190719.Models;
 using COSXML.Network;
 using System.Linq;
 using static dodohold.core.ZTOExpress.CreateOrderArgs;
+using MySqlX.XDevAPI;
 
 namespace molilian.api.Controllers
 {
@@ -103,60 +104,13 @@ namespace molilian.api.Controllers
         }
 
 
-        //[HttpGet]
-        //public async Task<ActionResult> testParse()
-        //{
-        //    var ip = "127.0.0.1";
-        //    var oaid = "test-oaid";
-
-        //    var list = new DBContext.Table("tk_parse_logs")
-        //        .Where("success=1", null)
-        //        .Order("ID DESC")
-        //        .Limit(1000)
-        //        .Select<TkDataDTO>();
-
-        //    int success_total = 0, error_total = 0;
-        //    foreach (var item in list)
-        //    {
-        //        var result = UnionParseCore.testTaobaoParseAsync(item.rawContent, ip, oaid);
-        //        if (result.success)
-        //        {
-        //            success_total++;
-        //        }
-        //        else
-        //        {
-        //            Console.Write(result);
-        //        }
-        //    }
-
-        //    var list2 = new DBContext.Table("tk_parse_logs")
-        //        .Where("success=0", null)
-        //        .Order("ID DESC")
-        //        .Limit(100)
-        //        .Select<TkDataDTO>();
-
-        //    foreach (var item in list2)
-        //    {
-        //        var result = UnionParseCore.testTaobaoParseAsync(item.rawContent, ip, oaid);
-        //        if (result.success)
-        //        {
-        //            Console.Write(result);
-        //        }
-        //        else
-        //        {
-        //            error_total++;
-
-        //        }
-        //    }
-        //    return new APIResult(new { success_total, error_total });
-        //}
-
 
         [HttpPost]
         public async Task<ActionResult> unionCoupon([FromBody] JsonElement form, [FromQuery] string a = "", [FromQuery] int t = 0, [FromQuery] string sign = "")
         {
             //正文
             var content = form.Read("s", string.Empty);
+            var dplink = form.Read("dp", string.Empty);
             var channel = form.Read("c", string.Empty);
             var ip = form.Read("ip", string.Empty);
             var oaid = form.Read("oaid", string.Empty);
@@ -183,7 +137,7 @@ namespace molilian.api.Controllers
             {
                 return new APIResult(new { success = false, message = "验证错误4" }, APIResultCodeEnum.Unauthorized);
             }
-            return await UnionCouponCore.UnionCouponAsync(content, channel, ip, oaid);
+            return await UnionCouponCore.UnionCouponAsync(content, dplink, channel, ip, oaid);
         }
 
 
@@ -191,6 +145,7 @@ namespace molilian.api.Controllers
         public async Task<ActionResult> unsafeCoupon([FromBody] JsonElement form)
         {
             var content = form.Read("s", string.Empty);
+            var dplink = form.Read("dp", string.Empty);
             var channel = form.Read("c", string.Empty);
             var ip = form.Read("ip", string.Empty);
             var oaid = form.Read("oaid", string.Empty);
@@ -198,10 +153,9 @@ namespace molilian.api.Controllers
             ip = "127.0.0.1";
             oaid = "test-oaid";
 #endif
-            return await UnionCouponCore.UnionCouponAsync(content, channel, ip, oaid);
+            return await UnionCouponCore.UnionCouponAsync(content, dplink, channel, ip, oaid);
         }
 
-
         /// <summary>
         /// 第三方调用
         /// </summary>
@@ -514,65 +468,6 @@ namespace molilian.api.Controllers
             });
         }
 
-        //[HttpGet]
-        //public Task<ActionResult> parse3(string s, string s2, string ip = "", string oaid = "")
-        //{
-        //    var result = AlimamaPlus.GetFormattedObject(s, ip, oaid);
-        //    string body = "";
-        //    string content = s.UrlDecode();
-        //    string content2 = s2.UrlDecode();
-        //    try
-        //    {
-        //        if (AlimamaPlus.ShouldIgnoreRequest("", ""))
-        //        {
-        //            result.success = false;
-        //            result.message = "放弃转链";
-        //        }
-        //        else
-        //        {
-        //            var account = VeapiPoolCore.GetOne();
-        //            if (account == null)
-        //            {
-        //                result.success = false;
-        //                result.message = "内部错误(500)";
-        //            }
-        //            else
-        //            {
-        //                var core = new VeapiPlus(account.name, account.key, account.sessionKey);
-        //                result = core.UnionParse(content);
-        //            }
-        //        }
-        //    }
-        //    catch (Exception ex)
-        //    {
-        //        NotifyCore.Notify(new NifyMessage
-        //        {
-        //            message = $"【转链接口异常】\n{body}",
-        //            priority = NifyMessagePriority.high,
-        //            tags = ["red_circle"]
-        //        });
-        //        result.success = false;
-        //        result.message = "转链接口异常";
-        //    }
-        //    _ = TkLogCore.Log(content, content2, result);
-        //    return Task.FromResult<ActionResult>(new APIResult(result));
-        //}
-
-
-        [HttpGet("{ignorePercentage}")]
-        public ActionResult set_ignore(int ignorePercentage = 0)
-        {
-            TkConfigCore.Update(ignorePercentage);
-            return new APIResult(new { success = true, message = "ok" });
-        }
-
-        [HttpGet("{ignorePercentage}")]
-        public ActionResult set_jd_ignore(int ignorePercentage = 0)
-        {
-            TkConfigCore.JdUpdate(ignorePercentage);
-            return new APIResult(new { success = true, message = "ok" });
-        }
-
 
         [HttpGet]
         public async Task<ActionResult> Reload()
@@ -585,7 +480,6 @@ namespace molilian.api.Controllers
             });
         }
 
-
         [HttpGet]
         public async Task<ActionResult> dplist([FromQuery] string query = "", [FromQuery] string a = "", [FromQuery] int t = 0, [FromQuery] string sign = "")
         {
@@ -658,9 +552,6 @@ namespace molilian.api.Controllers
         }
 
 
-
-
-
         [HttpGet]
         public async Task<ActionResult> unsafeParseDpList([FromQuery] string query = "")
         {
@@ -700,5 +591,86 @@ namespace molilian.api.Controllers
                 data = list,
             });
         }
+
+
+
+        [HttpPost]
+        public async Task<ActionResult> dataReport([FromBody] JsonElement form, [FromQuery] string a = "", [FromQuery] int t = 0, [FromQuery] string sign = "")
+        {
+            bool debug = form.Read("debug", false);
+            var clientIp = _accessor.HttpContext.GetUserIp();
+            var log = new LoggerLibrary("ApiReportCore", "dataReport");
+            log.Info(clientIp);
+
+            //验证签名
+            if (string.IsNullOrEmpty(a) || string.IsNullOrEmpty(sign))
+            {
+                _ = log.Info($"a:{a}\tt:{t}\tsign:{sign}\t", $"message:验证错误")
+                    .Info(form.GetRawText())
+                    .SaveAsync();
+                return new APIResult(new { success = false, message = "验证错误" }, APIResultCodeEnum.Unauthorized);
+            }
+
+            DateTime time1 = t.Convert2Datetime();
+            if (time1 < DateTime.Now.AddMinutes(-10))
+            {
+                _ = log.Info($"a:{a}\tt:{t}\tsign:{sign}\t", $"message:验证错误2")
+                    .Info(form.GetRawText())
+                    .SaveAsync();
+                return new APIResult(new { success = false, message = "验证错误2" }, APIResultCodeEnum.Unauthorized);
+            }
+
+            var account = ApiAccountCore.GetOne(a);
+            if (account == null || !account.enable_report)
+            {
+                _ = log.Info($"a:{a}\tt:{t}\tsign:{sign}\t", $"message:验证错误3")
+                    .Info(form.GetRawText())
+                    .SaveAsync();
+                return new APIResult(new { success = false, message = "验证错误3" }, APIResultCodeEnum.Unauthorized);
+            }
+            string app_sign = $"{account.api_secret}@{t}".MD5();
+            if (sign != app_sign)
+            {
+                _ = log.Info($"a:{a}\tt:{t}\tsign:{sign}\tapp_sign:{app_sign}", $"message:验证错误4")
+                    .Info(form.GetRawText())
+                    .SaveAsync();
+                return new APIResult(new { success = false, message = "验证错误4" }, APIResultCodeEnum.Unauthorized);
+            }
+
+            try
+            {
+                var data = await ApiReportCore.ReportDailysAsync(form, clientIp, debug);
+                _ = log.Info(form.GetRawText(), data.Convert2Json()).SaveAsync();
+                return new APIResult(new { success = true, data });
+            }
+            catch (Exception ex)
+            {
+                _ = log.Info(form.GetRawText()).Info(ex.Message, ex.StackTrace).SaveAsync();
+                return new APIResult(new { success = false, message = "内部错误" });
+            }
+        }
+
+
+        [HttpPost]
+        public async Task<ActionResult> unsafeDataReport([FromBody] JsonElement form)
+        {
+            bool debug = form.Read("debug", false);
+            var clientIp = _accessor.HttpContext.GetUserIp();
+            var log = new LoggerLibrary("ApiReportCore", "unsafeDataReport");
+            log.Info(clientIp);
+
+            try
+            {
+                var data = await ApiReportCore.ReportDailysAsync(form, clientIp, debug);
+                _ = log.Info(form.GetRawText(), data.Convert2Json()).SaveAsync();
+                return new APIResult(new { success = true, data });
+            }
+            catch (Exception ex)
+            {
+                _ = log.Info(form.GetRawText()).Info(ex.Message, ex.StackTrace).SaveAsync();
+                return new APIResult(new { success = false, message = "内部错误" });
+            }
+        }
+
     }
 }

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
molilian.api/Properties/PublishProfiles/https___ccr.ccs.tencentyun.com_shaobin.pubxml.user


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

@@ -15,7 +15,7 @@
         "CenterDB": "",
         "CenterRedis": "",
       },
-      "environmentVariables1": {
+      "environmentVariables2": {
         "ASPNETCORE_ENVIRONMENT": "Development",
         "EndPoint": "cadmin",
         "NtfyServer": "https://ntfy.yunhui800.com/5Sq9BytXXM5WDY3G",

+ 1 - 0
molilian.core/Core/ApiAccountCore.cs → molilian.core/Core/API/ApiAccountCore.cs

@@ -22,6 +22,7 @@ namespace molilian.core
         public DateTime last_time { get; set; }
         public bool status { get; set; }
         public int interval { get; set; }
+        public bool enable_report { get; set; } = false;
     }
 
     public partial class ApiAccountCore

+ 124 - 0
molilian.core/Core/API/ApiReportCore.cs

@@ -0,0 +1,124 @@
+
+
+using dodohold.core;
+using System.Text.Json;
+
+namespace molilian.core
+{
+    public partial class ApiReportCore
+    {
+        public class RecordDTO
+        {
+            public int id { get; set; }
+            public int data_type { get; set; }
+            public DateTime report_date { get; set; }
+            public int uclk_uv { get; set; }
+            public int uclk_pv { get; set; }
+            public int pay_ord_num { get; set; }
+            public int order_ord_num { get; set; }
+            public decimal pay_ord_amt { get; set; }
+            public decimal pay_tk_disp_tfee { get; set; }
+            public int pay_ord_uv { get; set; }
+            public int eff_ord_num { get; set; }
+            public decimal eff_ord_amt { get; set; }
+            public decimal eff_tk_disp_tfee { get; set; }
+            public int total_count { get; set; }
+            public int abandon_count { get; set; }
+            public int success_count { get; set; }
+        }
+
+
+
+        public static async Task<List<dynamic>> ReportDailysAsync(JsonElement form, string clientIp, bool debug = false)
+        {
+            List<dynamic> list = [];
+            //那就是入参日期和type
+            //我们给出指定日期的:点击 付款 有效付款  转链API调用
+            //type可以不入参,留空就两个场景的数据都显示就行了
+            //先只要成功的就行了,,到时候他们要明细再加就行了
+
+            int data_type = form.Read("type", 0);
+            var report_date = form.PathReadArray<string>("query_date[]");
+
+            DateTime stime = DateTime.Now.AddDays(-1).Date, etime = stime;
+            if (report_date.Count == 2)
+            {
+                if (DateTime.TryParse(report_date[0], out stime) && DateTime.TryParse(report_date[1], out etime))
+                {
+                    stime = stime.Date;
+                    etime = etime.Date;
+                }
+            }
+            switch (data_type)
+            {
+                case 1:
+                case 2:
+                    {
+                        var data = await DataTypeReportDailysAsync(data_type, stime, etime, clientIp, debug);
+                        list.AddRange(data);
+
+                    }
+                    break;
+                default:
+                    {
+                        int[] types = { 1, 2 };
+                        foreach (var type in types)
+                        {
+                            var data = await DataTypeReportDailysAsync(type, stime, etime, clientIp, debug);
+                            list.AddRange(data);
+                        }
+                    }
+                    break;
+            }
+            return list;
+        }
+
+        public static async Task<List<dynamic>> DataTypeReportDailysAsync(int data_type, DateTime stime, DateTime etime, string clientIp, bool debug = false)
+        {
+            string filter = "`is_show`=@is_show AND data_type=@data_type AND report_date>=@stime AND report_date<=@etime";
+            string orderBy = "report_date DESC";
+
+            var list = new DBContext.Table("api_call_report_dailys")
+                        .Where(filter, new { is_show = true, data_type, stime, etime })
+                        .Order(orderBy)
+                        .Select<RecordDTO>().ToList();
+
+            if (!debug)
+            {
+                if (list.Count != 0)
+                {
+                    var ids = list.Select(o => o.id).ToList();
+
+                    new DBContext.Table("api_call_report_dailys")
+                        .Add("read_num:", "read_num+1")
+                        .Where("id IN @ids", new { ids })
+                        .Update();
+                }
+            }
+
+            List<dynamic> data = list.Select(e => new
+            {
+                report_date = e.report_date.ToString("yyyy-MM-dd"),
+                type = e.data_type,
+                e.uclk_uv,
+                e.uclk_pv,
+                e.pay_ord_num,
+                e.order_ord_num,
+                e.pay_ord_amt,
+                e.pay_tk_disp_tfee,
+                e.pay_ord_uv,
+                e.eff_ord_num,
+                e.eff_ord_amt,
+                e.eff_tk_disp_tfee,
+
+                e.total_count,
+                //e.abandon_count,
+                e.success_count
+            }).ToList<dynamic>();
+            return data;
+        }
+
+    }
+
+
+}

+ 0 - 25
molilian.core/Core/ConfigCore.cs

@@ -38,31 +38,6 @@ namespace molilian.core
             _cached = item;
             return item;
         }
-        public static void Update(string ignorePercentageCity)
-        {
-            using var conn = CenterHub.GetOpenConnection();
-            new DBContext.Table(conn, "tk_config")
-                .Add("ignorePercentageCity", ignorePercentageCity)
-                .Update();
-            _ = Get(true);
-        }
-        public static void Update(int ignorePercentage)
-        {
-            using var conn = CenterHub.GetOpenConnection();
-            new DBContext.Table(conn, "tk_config")
-                .Add("ignorePercentage", ignorePercentage)
-                .Update();
-            _ = Get(true);
-        }
-        public static void JdUpdate(int ignorePercentage)
-        {
-            using var conn = CenterHub.GetOpenConnection();
-            new DBContext.Table(conn, "tk_config")
-                .Add("jdIgnorePercentage", ignorePercentage)
-                .Update();
-            _ = Get(true);
-        }
-
         public static void Refresh()
         {
             _ = Get(true);

+ 41 - 0
molilian.core/Core/EndPointCore.cs

@@ -12,6 +12,8 @@ using System.Net;
 using TencentCloud.Mrs.V20200910.Models;
 using static molilian.core.TkPoolCore;
 using Org.BouncyCastle.Tls;
+using MySql.Data.MySqlClient;
+using System.Data;
 
 
 namespace molilian.core
@@ -20,6 +22,12 @@ namespace molilian.core
     {
         private static readonly object _lockObj = new();
         private static IEnumerable<EndPointDTO> _cached;
+        public static IDbConnection GetDbConnection(string connString)
+        {
+            var conn = new MySqlConnection(connString);
+            return conn;
+        }
+
         public static EndPointDTO GetOne(string node)
         {
             var list = List();
@@ -28,6 +36,39 @@ namespace molilian.core
             return item;
         }
 
+
+        public static EndPointDTO GetCouponAdmin()
+        {
+            var list = List();
+            if (!list.Any()) return null;
+            var item = list.Where(s => s.is_coupon_api && !s.is_public_api).FirstOrDefault();
+
+
+#if DEBUG
+            item.db_server = "Server=rm-2ze74506m3gfsqe7mco.rwlb.rds.aliyuncs.com; Port=3306; Database=coupon; Uid=coupon; Pwd=67ktWBmw5G4yMs4J;SslMode=None;CharSet=utf8mb4;ConnectionTimeout=60;";
+#endif
+            /*
+Server=rm-2zey1jqxnoqy9mcc0zo.rwlb.rds.aliyuncs.com; Port=3306; Database=taoke; Uid=taoke; Pwd=67ktWBmw5G4yMs4J;SslMode=None;CharSet=utf8mb4;ConnectionTimeout=60
+Server=rm-2zey1jqxnoqy9mcc0zo.rwlb.rds.aliyuncs.com; Port=3306; Database=taoke; Uid=taoke; Pwd=67ktWBmw5G4yMs4J;SslMode=None;CharSet=utf8mb4;ConnectionTimeout=60
+Server=rm-2zey1jqxnoqy9mcc0zo.rwlb.rds.aliyuncs.com; Port=3306; Database=taoke; Uid=taoke; Pwd=67ktWBmw5G4yMs4J;SslMode=None;CharSet=utf8mb4;ConnectionTimeout=60
+Server=rm-2ze74506m3gfsqe7mco.rwlb.rds.aliyuncs.com; Port=3306; Database=coupon; Uid=coupon; Pwd=67ktWBmw5G4yMs4J;SslMode=None;CharSet=utf8mb4;ConnectionTimeout=60;
+             
+             */
+            return item;
+        }
+
+        public static EndPointDTO GetParseAdmin()
+        {
+            var list = List();
+            if (!list.Any()) return null;
+            var item = list.Where(s => !s.is_coupon_api && !s.is_public_api).FirstOrDefault();
+
+#if DEBUG
+            item.db_server = "Server=rm-2zey1jqxnoqy9mcc0zo.rwlb.rds.aliyuncs.com; Port=3306; Database=taoke; Uid=taoke; Pwd=67ktWBmw5G4yMs4J;SslMode=None;CharSet=utf8mb4;ConnectionTimeout=60;";
+#endif
+            return item;
+        }
+
         public static IEnumerable<EndPointDTO> List(bool force = false)
         {
             if (!force && _cached != null) return _cached;

+ 10 - 2
molilian.core/Core/taoke/JdPoolCore.cs

@@ -230,12 +230,21 @@ namespace molilian.core
             _ = List(true);
         }
 
-
         public static int Update(JdPoolDTO account)
         {
             return new DBContext.Table("jd_pool")
                 .Add("current_hourly_calls", account.current_hourly_calls)
                 .Add("current_daily_calls", account.current_daily_calls)
+
+                .Add("today_clickNum", account.today_clickNum)
+                .Add("today_cosFee", account.today_cosFee)
+                .Add("today_cosPrice", account.today_cosPrice)
+                .Add("today_finishCosFee", account.today_finishCosFee)
+                .Add("today_finishCosPrice", account.today_finishCosPrice)
+                .Add("today_finishOrderNum", account.today_finishOrderNum)
+                .Add("today_orderNum", account.today_orderNum)
+
+
                 .Where("id=@id", new { account.id })
                 .Update();
         }
@@ -245,7 +254,6 @@ namespace molilian.core
         public static int UpdateCookies(string cookies, string user_agent)
         {
             if (string.IsNullOrEmpty(cookies)) return 0;
-            cookies += ";";
             string pin = cookies.GetContentPart("pin=", ";");
             pin = pin.UrlDecode();
 

+ 24 - 11
molilian.core/Core/taoke/TaokeOpenCore.cs

@@ -1,5 +1,6 @@
 using dodohold.core;
 using System.Text.Json;
+using System.Threading;
 using Top.Api.Response;
 
 
@@ -22,7 +23,7 @@ namespace molilian.core
         }
 
 
-        public async Task<APIResult> PromotionQueryAsync(string img, string oaid = "", string ip = "", bool recommand = true)
+        public async Task<APIResult> PromotionQueryAsync(string img, string oaid = "", string ip = "", bool recommand = true, bool debug = false)
         {
             PromotionQueryDTO result = new()
             {
@@ -85,7 +86,7 @@ namespace molilian.core
                 }
 
 
-                TaobaoOpenPlus taobao = new(account.appkey, account.appSecret, account.open_pid);
+                TaobaoOpenPlus taobao = new(account.appkey, account.appSecret, account.open_pid, debug);
                 int timeout = _config.similar_timeout;
 #if DEBUG
                 timeout = 5000;
@@ -93,8 +94,6 @@ namespace molilian.core
                 using var cts = new CancellationTokenSource();
                 cts.CancelAfter(timeout);
 
-
-
                 DateTime stime = DateTime.Now;
 
                 var apiDelayTask = Task.Delay(500, cts.Token);
@@ -142,6 +141,18 @@ namespace molilian.core
                         });
                     }
                 }
+                else
+                {
+
+                }
+
+
+                //500ms后再提交一次
+                _ = Task.Run(() =>
+                {
+                    return taobao.PromotionQueryRequest(img, oaid);
+                });
+
 
                 var ts = DateTime.Now - stime;
                 result.elapsedTime2 = (int)ts.TotalMilliseconds;
@@ -155,6 +166,10 @@ namespace molilian.core
                 {
                     if (recommand)
                     {
+                        //DateTime stime = DateTime.Now;
+                        //(result.PromotionImg, cookies) = await taobao.GetRecommendData(TaobaoOpenPlus.RecommendRequestType.ori, oaid, cookies, cts.Token);
+                        //var ts = DateTime.Now - stime;
+                        //result.elapsedTime4 = (int)ts.TotalMilliseconds;
 
                         var similarPromotionTask = taobao.GetRecommendDataWithRetry(TaobaoOpenPlus.RecommendRequestType.first, oaid, cookies, cts.Token);
                         var promotionImgTask = taobao.GetRecommendDataWithRetry(TaobaoOpenPlus.RecommendRequestType.ori, oaid, cookies, cts.Token);
@@ -163,18 +178,14 @@ namespace molilian.core
 
                         (result.SimilarPromotion, cookies, result.elapsedTime3) = await similarPromotionTask;
                         (result.PromotionImg, cookies, result.elapsedTime4) = await promotionImgTask;
-                        result.similarPromotion = result.SimilarPromotion.Convert2Json();
-                        result.promotionImg = result.PromotionImg.Convert2Json();
-
                     }
                     else
                     {
-                        //(result.SimilarPromotion, cookies) = await taobao.GetRecommendDataWithRetry(TaobaoOpenPlus.RecommendRequestType.first, oaid, cookies, cts.Token);
+                        result.elapsedTime3 = 1;
                         (result.PromotionImg, cookies, result.elapsedTime4) = await taobao.GetRecommendDataWithRetry(TaobaoOpenPlus.RecommendRequestType.ori, oaid, cookies, cts.Token);
-                        result.similarPromotion = result.SimilarPromotion.Convert2Json();
-                        result.promotionImg = result.PromotionImg.Convert2Json();
-                        return result;
                     }
+                    result.similarPromotion = result.SimilarPromotion.Convert2Json();
+                    result.promotionImg = result.PromotionImg.Convert2Json();
                     return result;
 
 
@@ -193,6 +204,8 @@ namespace molilian.core
                     result.success = false;
                     result.message = "调用失败";
                     result.reason = "请求超时";
+                    if (!recommand) result.elapsedTime3 = 1;
+
                     _ = TkLogCore.PromotionImgLogAsync(result);
                     return new APIResult(new
                     {

+ 5 - 1
molilian.core/Core/taoke/TkLogCore.cs

@@ -92,6 +92,7 @@ namespace molilian.core
             return new DBContext.Table(connection, tablename)
                 .Add("end_point", data.end_point)
                 .Add("channel", (int)data.channel)
+                .Add("linkType", (int)data.link_type)
                 .Add("accountId", data.accountId)
                 .Add("accountName", data.accountName)
                 .Add("rawContent", data.rawContent)
@@ -115,6 +116,7 @@ namespace molilian.core
                 .Add("ip", data.ip)
                 .Add("oaid", data.oaid)
                 .Add("create_time", data.create_time)
+
                 .Create(DBContext.InsertType.NORMAL, transaction);
         }
         private static int save_jd_parse_logs(JdDataDTO data, string tablename, IDbConnection connection, IDbTransaction transaction)
@@ -567,7 +569,9 @@ namespace molilian.core
 
                 if (response.success) saveClientRequestTotal(response.channel, response.ip, response.oaid);
 
-                if (!response.success && ("nologin".Equals(response.reason) || "未登录".Equals(response.reason)))
+                if (!response.success && ("nologin".Equals(response.reason) ||
+                    "方法不存在".Equals(response.reason) ||
+                    "未登录".Equals(response.reason)))
                 {
                     await Task.Run(() =>
                     {

+ 48 - 6
molilian.core/Core/taoke/UnionCouponCore.cs

@@ -30,28 +30,49 @@ namespace molilian.core
             _end_point = Environment.GetEnvironmentVariable("EndPoint");
         }
 
-        public static async Task<ActionResult> UnionCouponAsync(string content, string channel, string ip, string oaid)
+        public static async Task<ActionResult> UnionCouponAsync(string content, string dplink, string channel, string ip, string oaid)
         {
             return channel switch
             {
-                "jd" => await JdCouponAsync(content, ip, oaid),
-                _ => await TaobaoCouponAsync(content, ip, oaid),
+                "jd" => await JdCouponAsync(content, dplink, ip, oaid),
+                _ => await TaobaoCouponAsync(content, dplink, ip, oaid),
             };
         }
 
-        public static async Task<APIResult> TaobaoCouponAsync(string content, string ip = "", string oaid = "")
+        public static async Task<APIResult> TaobaoCouponAsync(string content, string dplink, string ip = "", string oaid = "")
         {
             AlimamaPlus alimama = null;
             content = content.UrlDecode();
+            dplink = dplink.UrlDecode();
             UnionCouponDTO result = new()
             {
                 channel = TkChannelEnum.tb,
                 rawContent = content,
+                rawContent2 = dplink,
                 end_point = _end_point,
                 ip = ip,
                 oaid = oaid
             };
-            content = content.Replace("taobao://","https://");
+            if (string.IsNullOrEmpty(content))
+            {
+                content = dplink.Replace("taobao://", "https://");
+            }
+            if (string.IsNullOrEmpty(content))
+            {
+                result.success = false;
+                result.message = "放弃转链";
+                result.reason = "无效的参数";
+                result.rawContent = content;
+                _ = TkLogCore.CouponLogAsync(result);
+                return new APIResult(new
+                {
+                    result.success,
+                    result.reason,
+                    result.message,
+                    channel = result.channel.ToString(),
+                });
+            }
+
             try
             {
                 string reason;
@@ -144,15 +165,36 @@ namespace molilian.core
             });
         }
 
-        public static async Task<APIResult> JdCouponAsync(string content, string ip, string oaid)
+        public static async Task<APIResult> JdCouponAsync(string content, string dplink, string ip, string oaid)
         {
             content = content.UrlDecode();
+            dplink = dplink.UrlDecode();
             UnionCouponDTO result = new()
             {
                 channel = TkChannelEnum.jd,
                 rawContent = content,
+                rawContent2 = dplink,
                 end_point = _end_point,
             };
+            if (string.IsNullOrEmpty(content))
+            {
+                content = dplink.Replace("taobao://", "https://");
+            }
+            if (string.IsNullOrEmpty(content))
+            {
+                result.success = false;
+                result.message = "放弃转链";
+                result.reason = "无效的参数";
+                result.rawContent = content;
+                _ = TkLogCore.CouponLogAsync(result);
+                return new APIResult(new
+                {
+                    result.success,
+                    result.reason,
+                    result.message,
+                    channel = result.channel.ToString(),
+                });
+            }
 
             try
             {

+ 1 - 1
molilian.core/DTO/EndPointDTO.cs

@@ -10,7 +10,7 @@ namespace molilian.core
         public string name { get; set; } = string.Empty;
         public string description { get; set; } = string.Empty;
         public string redis_server { get; set; } = string.Empty;
-
+        public string db_server { get; set; } = string.Empty;
         public string api_server { get; set; } = string.Empty;
         public DateTime create_time { get; set; }
         public DateTime last_time { get; set; }

+ 1 - 0
molilian.core/DTO/alimama/UnionCouponDTO.cs

@@ -24,6 +24,7 @@ namespace molilian.core
         public int accountId { get; set; } = 0;
         public string accountName { get; set; } = string.Empty;
         public string rawContent { get; set; } = string.Empty;
+        public string rawContent2 { get; set; } = string.Empty;
         public bool success { get; set; } = false;
         public string reason { get; set; } = string.Empty;
         public string message { get; set; } = string.Empty;

+ 9 - 0
molilian.core/DTO/jd/JdPoolDTO.cs

@@ -41,5 +41,14 @@
         public bool enable_sync_order { get; set; } = false;
         public int time_range { get; set; } = 0;
 
+
+        public int today_clickNum { get; set; } = 0;
+        public decimal today_cosFee { get; set; } = 0;
+        public decimal today_cosPrice { get; set; } = 0;
+        public decimal today_finishCosFee { get; set; } = 0;
+        public decimal today_finishCosPrice { get; set; } = 0;
+        public int today_finishOrderNum { get; set; } = 0;
+        public int today_orderNum { get; set; } = 0;
+
     }
 }

+ 149 - 74
molilian.core/Plus/Alimama/crawler.cs

@@ -1,5 +1,6 @@
 using dodohold.core;
 using System.Text.Json;
+using TencentCloud.Cdn.V20180606.Models;
 
 
 namespace molilian.core
@@ -246,103 +247,177 @@ namespace molilian.core
 
         }
 
-        public static void ApiCallStatistics(int intervalDay, TkChannelEnum channel, string prefix = "")
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="data_type">1转链 2优惠券</param>
+        /// <param name="intervalDay"></param>
+        /// <param name="channel"></param>
+        public static void ApiCallStatistics(int data_type, int intervalDay, TkChannelEnum channel)
         {
-
             DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
 
-            var accounts = TkPoolCore.List();
+            var endpoint = data_type == 1 ? EndPointCore.GetParseAdmin () : EndPointCore.GetCouponAdmin();
+            if (string.IsNullOrEmpty(endpoint.db_server)) return;
 
-            foreach (var account in accounts)
-            {
-                int accountId = account.id;
-                string accountName = $"{channel}_{account.id}";
+            using var conn = EndPointCore.GetDbConnection(endpoint.db_server);
+            using var center_conn = CenterHub.GetOpenConnection();
 
-                int total_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:{log_date:yyyyMMdd}");
-                if (total_count == 0) continue;
+            var exist_report_dailys = new DBContext.Table(conn, "v_tk_report_dailys")
+                 .Get<dynamic>("report_date=@log_date", new { log_date });
 
-                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 record = new DBContext.Table(center_conn, "api_call_report_dailys")
+                 .Fields("id, report_date, read_num")
+                 .Get<dynamic>("report_date=@log_date AND data_type=@data_type", new { log_date, data_type });
 
-                var createArgs = new DBContext.Table("api_call_statistics")
+            var update = new DBContext.Table(center_conn, "api_call_report_dailys")
+                .Add("data_type", data_type)
+                .Add("is_show", 0)
+                .Add("report_date", log_date)
+                .Add("last_time", DateTime.Now);
 
-                    .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_report_dailys != null)
+            {
+                update.Add("uclk_uv", exist_report_dailys.uclk_uv_56)
+                    .Add("uclk_pv", exist_report_dailys.uclk_pv_56)
+                    .Add("pay_ord_num", exist_report_dailys.pay_ord_num_56)
+                    .Add("order_ord_num", exist_report_dailys.order_ord_num)
+                    .Add("pay_ord_amt", exist_report_dailys.pay_ord_amt_56)
+                    .Add("pay_tk_disp_tfee", exist_report_dailys.pay_tk_disp_tfee_56)
+                    .Add("pay_ord_uv", exist_report_dailys.pay_ord_uv_56)
+                    .Add("eff_ord_num", exist_report_dailys.eff_ord_num)
+                    .Add("eff_ord_amt", exist_report_dailys.eff_ord_amt)
+                    .Add("eff_tk_disp_tfee", exist_report_dailys.eff_tk_disp_tfee);
+            }
 
-                if (exist == null)
+            var exist = new DBContext.Table(center_conn, "center_daily_logs")
+                 .Get<dynamic>("log_date=@log_date AND accountId=@accountId",
+                 new { log_date, channel, accountId = 0 });
+            if (exist != null)
+            {
+                if (data_type == 1)
                 {
-                    createArgs.Add("channel", channel)
-                        .Add("accountId", accountId)
-                        .Add("accountName", account.company)
-                        .Add("log_date", log_date)
-                        .Add("create_time", DateTime.Now)
-                        .Create();
+                    update.Add("total_count", exist.parse_total_count)
+                        .Add("abandon_count", exist.parse_abandon_count)
+                        .Add("success_count", exist.parse_success_count);
                 }
-                else
+                if (data_type == 2)
                 {
-                    createArgs.Where("id=@id", new { exist.id }).Update();
+                    update.Add("total_count", exist.coupon_total_count)
+                        .Add("abandon_count", exist.coupon_abandon_count)
+                        .Add("success_count", exist.coupon_success_count);
                 }
             }
 
-
-            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)
+            if (record == null)
             {
-                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();
+                update.Add("read_num", 0).Add("create_time", DateTime.Now).Create();
             }
             else
             {
-                createArgs2.Where("id=@id", new { exist2.id }).Update();
+                update.Add("read_num", record.read_num).Where("id=@id", new { record.id }).Update();
             }
-
         }
 
+
+        //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分钟一次)
         /// </summary>

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

@@ -124,7 +124,17 @@ namespace molilian.core
             //处理过后的正文 用于转链
             if (!result.success)
             {
-                return result;
+                switch (result.link_type)
+                {
+                    case LinkTypeEnum.profile:
+                    case LinkTypeEnum.live:
+                    case LinkTypeEnum.video:
+                    case LinkTypeEnum.note:
+                    case LinkTypeEnum.goods:
+                        break;
+                    default:
+                        return result;
+                }
             }
 
             //============================== 放弃转链-地区过滤 ==============================

+ 27 - 3
molilian.core/Plus/Alimama/parse_2.cs

@@ -469,6 +469,11 @@ namespace molilian.core
                         result.shortLinkurl = desiredUrl;
                         return result;
                     }
+                    link_type = GetLinkType(desiredUrl);
+                }
+                else
+                {
+                    link_type = GetLinkType(url);
                 }
 
                 if ((result.content.Contains("霸下通用 web 页面-验证码")))
@@ -476,7 +481,6 @@ namespace molilian.core
                     result.reason = "霸下验证码";
                 }
 
-                link_type = GetLinkType(url);
 
                 result.success = false;
                 result.message = "放弃转链";
@@ -518,16 +522,19 @@ namespace molilian.core
 
             if (url.StartsWith("https://huodong.m.taobao.com/act/talent/live.html")) return LinkTypeEnum.live;
             if (url.StartsWith("https://web.m.taobao.com/app/tnode/web/index")) return LinkTypeEnum.video;
+            if (url.StartsWith("https://shop.m.taobao.com/shop/shopIndex.htm")) return LinkTypeEnum.profile;
 
             string pattern = @"^https://shop\d+\.m\.taobao\.com";
             if (Regex.IsMatch(url, pattern))
             {
                 return LinkTypeEnum.profile;
             }
+            //https://shop.m.taobao.com/shop/shopIndex.htm?
+
             return LinkTypeEnum.unknown;
         }
 
-        private async Task<TkDataDTO> alimamaParseAsync(string content, TkDataDTO result, CancellationToken cancellationToken = default)
+        public async Task<TkDataDTO> alimamaParseAsync(string content, TkDataDTO result, CancellationToken cancellationToken = default)
         {
             string t = $"{DateTime.Now.Convert2UnixTimestamp(true)}";
 
@@ -696,7 +703,22 @@ namespace molilian.core
                 string deeplink_url = GetDeeplink(shortLinkurl);
 
                 result.channel = TkChannelEnum.tb;
-                result.link_type = success ? LinkTypeEnum.goods : result.link_type;
+
+                if (success)
+                {
+                    switch (result.link_type)
+                    {
+                        case LinkTypeEnum.profile:
+                        case LinkTypeEnum.goods:
+                        case LinkTypeEnum.video:
+                        case LinkTypeEnum.live:
+                            break;
+                        default:
+                            result.link_type = LinkTypeEnum.goods;
+                            break;
+                    }
+                }
+
                 result.success = success;
                 result.message = message;
                 result.content = content;
@@ -909,6 +931,8 @@ namespace molilian.core
                     {
                         case LinkTypeEnum.profile:
                         case LinkTypeEnum.goods:
+                        case LinkTypeEnum.video:
+                        case LinkTypeEnum.live:
                             break;
                         default:
                             result.link_type = LinkTypeEnum.goods;

+ 143 - 0
molilian.core/Plus/JDUnion/EstimateComm.cs

@@ -0,0 +1,143 @@
+using dodohold.core;
+using Sayaka.Common;
+
+
+namespace molilian.core
+{
+    public partial class JdUnionPlus
+    {
+
+        public class EstimateCommDTO
+        {
+            public int id { get; set; } = 0;
+            public int accountId { get; set; } = 0;
+            public string accountName { get; set; } = string.Empty;
+            public DateTime report_date { get; set; } = DateTime.MinValue;
+            public DateTime create_time { get; set; } = DateTime.Now;
+            public DateTime last_time { get; set; } = DateTime.MinValue;
+
+
+            public decimal cosFee { get; set; }
+            public int downloadDetail { get; set; }
+            public int feeType { get; set; }
+            public string feeTypeStr { get; set; } = string.Empty;
+            public string payMonth { get; set; } = string.Empty;
+            public int platform { get; set; }
+            public string platformStr { get; set; } = string.Empty;
+            public int showDetail { get; set; }
+            public int status { get; set; }
+            public int unionType { get; set; }
+            public string unionTypeStr { get; set; } = string.Empty;
+        }
+
+
+        public async Task<List<DateTime>> queryEstimateCommList(CancellationToken cancellationToken = default)
+        {
+            List<DateTime> changed_dates = new List<DateTime>();
+
+            var ts = DateTime.Now.Convert2UnixTimestamp(true);
+            string cookies = _account.cookies;
+
+            string useragent = _account.user_agent;
+            if (string.IsNullOrEmpty(useragent)) useragent = ProviderFakeUserAgent.RandomComputer;
+
+            bool hasNext = true;
+            int pageNo = 1;
+            while (hasNext)
+            {
+                var args = new
+                {
+                    funName = "queryEstimateCommList",
+                    param = new
+                    {
+                        startTime = "",
+                        endTime = "",
+                        unionType = "",
+                        status = "",
+                        pageNo,
+                        pageSize = 20
+                    },
+                    //,"param":{"endTime":"","startTime":"","unionType":"","status":null,"pageNo":1,"pageSize":20}}
+
+                };
+
+                string data = args.Convert2Json().UrlEncode();
+                string url = $"https://api.m.jd.com/api?functionId=union_balance_service&appid=unionpc&loginType=3&body={data}";
+
+                WebClientUtility client = new WebClientUtility();
+                client.Proxy = _proxy;
+#if DEBUG
+                client.Proxy = null;
+#endif
+                client.SetContentType("application/x-www-form-urlencoded");
+                client.AddHeaders("X-Referer-Page", "https://union.jd.com/proManager/index");
+                client.AddHeaders("X-Rp-Client", "h5_1.0.0");
+                client.AddHeaders("Referer", "https://union.jd.com/");
+                client.AddHeaders("Origin", "https://union.jd.com");
+                client.UserAgent = useragent;
+                client.AddHeaders("Cookie", cookies);
+                client.Post($"body={data}");
+                var response = await client.RequestAsync(url, "POST", cancellationToken);
+
+                string body = response.Body();
+                var root = body.Convert2JsonElement();
+                int code = root.Read<int>("code");
+                string message = root.Read<string>("message");
+                hasNext = root.Read<bool>("hasNext", false);
+                if (code == 200 && "success".Equals(message))
+                {
+                    var list = root.ElementRead("result");
+                    string filter = "report_date=@report_date AND accountId=@accountId" +
+                        " AND unionType=@unionType AND feeType=@feeType AND platform=@platform";
+
+                    foreach (var item in list.EnumerateArray())
+                    {
+                        var report = item.GetRawText().Convert2Object<EstimateCommDTO>();
+
+                        if (DateTime.TryParseExact(report.payMonth, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out DateTime report_date))
+                        {
+                            changed_dates.Add(report_date.Date);
+
+                            var exist = new DBContext.Table("jd_estimate_comm")
+                                .Fields("id")
+                                .Get<dynamic>(filter,
+                                    new { report_date = report_date.Date, accountId = _account.id, report.unionType, report.feeType, report.platform }
+                                    );
+
+
+                            var update = new DBContext.Table("jd_estimate_comm")
+                                .Add("accountId", _account.id)
+                                .Add("accountName", _account.name)
+                                .Add("cosFee", report.cosFee)
+                                .Add("feeType", report.feeType)
+                                .Add("feeTypeStr", report.feeTypeStr)
+                                .Add("platform", report.platform)
+                                .Add("platformStr", report.platformStr)
+                                .Add("status", report.status)
+                                .Add("unionType", report.unionType)
+                                .Add("unionTypeStr", report.unionTypeStr)
+                                .Add("last_time", DateTime.Now);
+
+                            if (exist == null)
+                            {
+                                update.Add("report_date", report_date.Date)
+                                .Add("create_time", DateTime.Now)
+                                .Create();
+                            }
+                            else
+                            {
+                                update.Where("id=@id", new { exist.id }).Update();
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    throw new APIException(body);
+                }
+            }
+            return changed_dates;
+        }
+
+    }
+}

+ 1 - 0
molilian.core/Plus/JDUnion/JdUnionPlus.cs

@@ -297,6 +297,7 @@ namespace molilian.core
                 case JdUnionWorkMode.Crawler:
                 default:
                     result = await GetPromotionByCrawlerAsync(result, url, cancellationToken);
+
                     break;
             }
             return result;

+ 115 - 0
molilian.core/Plus/JDUnion/SpreadEffect.cs

@@ -0,0 +1,115 @@
+using dodohold.core;
+using Sayaka.Common;
+
+
+namespace molilian.core
+{
+    public partial class JdUnionPlus
+    {
+        public async Task<List<DateTime>> querySpreadEffectData(DateTime query_date, CancellationToken cancellationToken = default)
+        {
+            List<DateTime> changed_dates = new List<DateTime>();
+
+            var ts = DateTime.Now.Convert2UnixTimestamp(true);
+            string cookies = _account.cookies;
+
+            string useragent = _account.user_agent;
+            if (string.IsNullOrEmpty(useragent)) useragent = ProviderFakeUserAgent.RandomComputer;
+
+            bool hasNext = true;
+            int pageNo = 1;
+            while (hasNext)
+            {
+                var args = new
+                {
+                    funName = "querySpreadEffectData",
+                    param = new
+                    {
+                        startDate = query_date.AddMonths(-1).ToString("yyyy-MM-dd"),
+                        endDate = query_date.ToString("yyyy-MM-dd"),
+                        mediaId = "",
+                        proCont = "",
+                        promotionId = "",
+                        sourceEmt = "",
+                        pageNo,
+                        pageSize = 20
+                    },
+                };
+
+                string data = args.Convert2Json().UrlEncode();
+                string url = $"https://api.m.jd.com/api?functionId=union_report&appid=unionpc&loginType=3&body={data}";
+
+                WebClientUtility client = new WebClientUtility();
+                client.Proxy = _proxy;
+#if DEBUG
+                client.Proxy = null;
+#endif
+                client.SetContentType("application/x-www-form-urlencoded");
+                client.AddHeaders("X-Referer-Page", "https://union.jd.com/proManager/index");
+                client.AddHeaders("X-Rp-Client", "h5_1.0.0");
+                client.AddHeaders("Referer", "https://union.jd.com/");
+                client.AddHeaders("Origin", "https://union.jd.com");
+                client.UserAgent = useragent;
+                client.AddHeaders("Cookie", cookies);
+                client.Post($"body={data}");
+                var response = await client.RequestAsync(url, "POST", cancellationToken);
+
+                string body = response.Body();
+                var root = body.Convert2JsonElement();
+                int code = root.Read<int>("code");
+                string message = root.Read<string>("message");
+                hasNext = root.Read<bool>("hasNext", false);
+                if (code == 200 && "success".Equals(message))
+                {
+                    var list = root.ElementRead("result").ElementRead("spreadReportInfoChatList");
+
+                    foreach (var item in list.EnumerateArray())
+                    {
+                        var report = item.GetRawText().Convert2Object<SpreadReportInfoDTO>();
+                        if (report.clickNum == 0 && report.orderNum == 0 &&
+                            report.cosFee == 0 && report.finishOrderNum == 0) continue;
+
+                        if (DateTime.TryParse(report.accountDate, out DateTime report_date))
+                        {
+                            changed_dates.Add(report_date.Date);
+
+                            var exist = new DBContext.Table("jd_spread_report")
+                                .Fields("id")
+                                .Get<dynamic>("report_date=@report_date AND accountId=@accountId",
+                                    new { report_date = report_date.Date, accountId = _account.id });
+
+                            var update = new DBContext.Table("jd_spread_report")
+                                .Add("accountId", _account.id)
+                                .Add("accountName", _account.name)
+                                .Add("clickNum", report.clickNum)
+                                .Add("cosFee", report.cosFee)
+                                .Add("cosPrice", report.cosPrice)
+                                .Add("finishCosFee", report.finishCosFee)
+                                .Add("finishCosPrice", report.finishCosPrice)
+                                .Add("finishOrderNum", report.finishOrderNum)
+                                .Add("orderNum", report.orderNum)
+                                .Add("last_time", DateTime.Now);
+
+                            if (exist == null)
+                            {
+                                update.Add("report_date", report_date.Date)
+                                .Add("create_time", DateTime.Now)
+                                .Create();
+                            }
+                            else
+                            {
+                                update.Where("id=@id", new { exist.id }).Update();
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    throw new APIException(body);
+                }
+            }
+            return changed_dates;
+        }
+
+    }
+}

+ 92 - 0
molilian.core/Plus/JDUnion/amount.cs

@@ -0,0 +1,92 @@
+using dodohold.core;
+using Sayaka.Common;
+
+
+namespace molilian.core
+{
+    public partial class JdUnionPlus
+    {
+
+
+        public class SpreadReportInfoDTO
+        {
+            public int id { get; set; } = 0;
+            public int accountId { get; set; } = 0;
+            public string accountName { get; set; } = string.Empty;
+            public DateTime report_date { get; set; } = DateTime.MinValue;
+            public DateTime create_time { get; set; } = DateTime.Now;
+            public DateTime last_time { get; set; } = DateTime.MinValue;
+
+            public string accountDate { get; set; } = string.Empty;
+            public int clickNum { get; set; } = 0;
+            public decimal cosFee { get; set; } = 0;
+            public decimal cosPrice { get; set; } = 0;
+            public decimal finishCosFee { get; set; } = 0;
+            public decimal finishCosPrice { get; set; } = 0;
+            public int finishOrderNum { get; set; } = 0;
+            public int orderNum { get; set; } = 0;
+        }
+
+        public async Task<SpreadReportInfoDTO> queryTodaySpreadEffectData(CancellationToken cancellationToken = default)
+        {
+            SpreadReportInfoDTO result = null;
+            var ts = DateTime.Now.Convert2UnixTimestamp(true);
+            string cookies = _account.cookies;
+
+            string useragent = _account.user_agent;
+            if (string.IsNullOrEmpty(useragent)) useragent = ProviderFakeUserAgent.RandomComputer;
+
+            var args = new
+            {
+                funName = "querySpreadEffectData",
+                param = new
+                {
+                    startDate = DateTime.Now.ToString("yyyy-MM-dd"),
+                    endDate = DateTime.Now.ToString("yyyy-MM-dd"),
+                    mediaId = "",
+                    proCont = "",
+                    promotionId = "",
+                    sourceEmt = "",
+                    pageNo = 0,
+                    pageSize = 20
+                },
+            };
+
+
+            string data = args.Convert2Json().UrlEncode();
+            string url = $"https://api.m.jd.com/api?functionId=union_report&appid=unionpc&loginType=3&body={data}";
+
+            WebClientUtility client = new WebClientUtility();
+            client.Proxy = _proxy;
+#if DEBUG
+            client.Proxy = null;
+#endif
+            client.SetContentType("application/x-www-form-urlencoded");
+            client.AddHeaders("X-Referer-Page", "https://union.jd.com/proManager/index");
+            client.AddHeaders("X-Rp-Client", "h5_1.0.0");
+            client.AddHeaders("Referer", "https://union.jd.com/");
+            client.AddHeaders("Origin", "https://union.jd.com");
+            client.UserAgent = useragent;
+            client.AddHeaders("Cookie", cookies);
+            client.Post($"body={data}");
+            var response = await client.RequestAsync(url, "POST", cancellationToken);
+
+            string body = response.Body();
+            var root = body.Convert2JsonElement();
+            int code = root.Read<int>("code");
+            string message = root.Read<string>("message");
+            if (code == 200 && "success".Equals(message))
+            {
+                var list = root.ElementRead("result").ElementRead("spreadReportInfoChatList");
+
+                if (list.EnumerateArray().Any())
+                {
+                    result = list[0].GetRawText().Convert2Object<SpreadReportInfoDTO>();
+                }
+                return result;
+            }
+            throw new APIException(body);
+        }
+
+    }
+}

+ 49 - 34
molilian.core/Plus/JDUnion/goods.cs

@@ -49,29 +49,39 @@ namespace molilian.core
             };
             var body = await RequestAsync(method, version, data.Convert2Json(), cancellationToken);
             var root = body.Convert2Object<JdUnionResponse>();
-            var _promotion_data = root.jd_union_open_promotion_common_get_responce.getResult;
-            var promotion_data = _promotion_data.Convert2Object<JdData>();
-            string code = root.jd_union_open_promotion_common_get_responce.code;
-            if ("0".Equals(code))
+
+            if (root != null && root.jd_union_open_promotion_common_get_responce != null)
             {
-                if (promotion_data.code == 200)
-                {
-                    var url = promotion_data.data.clickURL;
 
-                    result.success = true;
-                    result.message = "OK";
-                    result.shortLinkurl = url;
-                    result.content = result.shortLinkurl;
-                    result.deeplink_url = GetDeeplink(result.shortLinkurl);
 
-                    return result;
+                var _promotion_data = root.jd_union_open_promotion_common_get_responce.getResult;
+                var promotion_data = _promotion_data.Convert2Object<JdData>();
+                string code = root.jd_union_open_promotion_common_get_responce.code;
+                if ("0".Equals(code))
+                {
+                    if (promotion_data.code == 200)
+                    {
+                        var url = promotion_data.data.clickURL;
+
+                        result.success = true;
+                        result.message = "OK";
+                        result.shortLinkurl = url;
+                        result.content = result.shortLinkurl;
+                        result.deeplink_url = GetDeeplink(result.shortLinkurl);
+
+                        return result;
+                    }
                 }
+                result.reason = root.jd_union_open_promotion_common_get_responce.message;
+                if (string.IsNullOrEmpty(result.reason)) result.reason = promotion_data.message;
+            }
+            else
+            {
+                result.reason = "网络错误";
             }
 
             result.success = false;
             result.message = "转链失败";
-            result.reason = root.jd_union_open_promotion_common_get_responce.message;
-            if (string.IsNullOrEmpty(result.reason)) result.reason = promotion_data.message;
             result.shortLinkurl = shortLinkurl;
             result.deeplink_url = GetDeeplink(result.shortLinkurl);
 
@@ -97,34 +107,38 @@ namespace molilian.core
             var root = body.Convert2Object<JdUnionResponse>();
             //{"jd_union_open_promotion_bysubunionid_get_responce":{"code":"0","getResult":"{\"code\":200,\"data\":{\"shortURL\":\"https://u.jd.com/esCrWn4\"},\"message\":\"success\",\"requestId\":\"o_0b64a07b_lyiusnpg_74220789\"}"}}
 
-
-            string code = root.jd_union_open_promotion_bysubunionid_get_responce.code;
-
-            var _promotion_data = root.jd_union_open_promotion_bysubunionid_get_responce.getResult;
-            var promotion_data = _promotion_data.Convert2Object<JdData>();
-            if ("0".Equals(code))
+            if (root != null && root.jd_union_open_promotion_bysubunionid_get_responce != null)
             {
-                if (promotion_data.code == 200)
+                string code = root.jd_union_open_promotion_bysubunionid_get_responce.code;
+                var _promotion_data = root.jd_union_open_promotion_bysubunionid_get_responce.getResult;
+                var promotion_data = _promotion_data.Convert2Object<JdData>();
+                if ("0".Equals(code))
                 {
-                    var url = promotion_data.data.shortURL;
-
-                    result.success = true;
-                    result.message = "OK";
-                    result.shortLinkurl = url;
-                    result.content = result.shortLinkurl;
-                    result.deeplink_url = GetDeeplink(result.shortLinkurl);
-
-                    return result;
+                    if (promotion_data.code == 200)
+                    {
+                        var url = promotion_data.data.shortURL;
+
+                        result.success = true;
+                        result.message = "OK";
+                        result.shortLinkurl = url;
+                        result.content = result.shortLinkurl;
+                        result.deeplink_url = GetDeeplink(result.shortLinkurl);
+
+                        return result;
+                    }
                 }
+                result.reason = root.jd_union_open_promotion_bysubunionid_get_responce.message;
+                if (string.IsNullOrEmpty(result.reason)) result.reason = promotion_data.message;
+            }
+            else
+            {
+                result.reason = "网络错误";
             }
 
             result.success = false;
             result.message = "转链失败";
-            result.reason = root.jd_union_open_promotion_bysubunionid_get_responce.message;
-            if (string.IsNullOrEmpty(result.reason)) result.reason = promotion_data.message;
             result.shortLinkurl = shortLinkurl;
             result.deeplink_url = GetDeeplink(result.shortLinkurl);
-
             _ = new LoggerLibrary("JdUnion", "bysubunionid_get_error").Info(body).SaveAsync();
             return result;
         }
@@ -139,6 +153,7 @@ namespace molilian.core
 
             var ts = DateTime.Now.Convert2UnixTimestamp(true);
             string cookies = _account.cookies;
+            //cookies = "pinId=lDSKR4P756s; __jdu=797222838; unpl=JF8EAM1nNSttXxtVVxtSSEFASw9QWwpbTh4KP28NAwlaTAvEt16MoRnbUfHBdCarU9683KT3AsB67n92UtFSEXtdVV9fD0oeBm5vNWRdXU8ABh5VSUAXJV06KgF6SUxXbxN6CCU2S1UEGgYfExlOX11bEAl7FANfZjVSVV5IVwYSABIiEXtdXFptCEoWAmtjBF1YWkJRNSsHGxMRTltWX1oBexYzbWYEUV1fQ10AGjJZfMnF8oHV_d_CidTxw9Df9oz_3EgdCh0RE0hUVldtCXsU; shshshfpa=02d19590-d1e4-c91f-76d9-50b5b48caeae-1696955111; shshshfpx=02d19590-d1e4-c91f-76d9-50b5b48caeae-1696955111; TrackID=1P1YIoOSuMvq9KVQS8e4qaKAWslU3bHIlXwpUNeXUOPY_dPOhYcH5fl6XgaIzKppd5zTuGg52Ql9Ht7h1LNA62ZkhO1G3xwkTKekmP3nhjjmnOr5rzvlohhH3EkChqHLB; thor=D3FCA70DCE7542F87C212B790D3JDaxNfPy83okP3kLScwCkGiuMcyC4Pcyn8202E9E708F27CB58F480D2CC3FE67C9253747FE21007250E37AE528C577139FEEC81E6EE68034351A54BE200FF3JDaxNfPy83okP3kLScwCkGiuMcyC4Pcyn7n92UtFE03B1646F11A6B796AEE7DE71C760EDFF210BD03D24599A6CFF007C0D40BA49D; pin=23117; unick=jd2311kga; _tp=D8kjVbHzTJzgqxcxaN3m1w%3D%3D; _pst=23117; ipLoc-djd=24-2144-3909-58335; 3AB9D23F7A4B3C9B=IPF6PUOISQRNPNXNQVLJJVKQVBTAvEt16MoRnbUfHBdCarU9683JDaxNfPy83okP3kLScwCkGiuMcyC4PcynYGLMEE; flash=2_YNg0msef1iArLpGWQBwhJos62BkQWLuFuDD-HGOLK2KKuPtQ08qYx9js2jlEHwoRT7AVTOjRo8iR1-PT6ZsT8ZDnqdgMfbeoSNMJvJa8qphobenATQ0WXPYP62_XgiF1J7II6jY1qovmiIDadA7rd5tHyAVpTzEsqpI6xVJ9b6D*; __jda=209449046.797222838.1720272224.1720293360.1721239059.3; __jdc=209449046; __jdv=209449046|baidu|-|organic|notset|1721239059356; 3AB9D23F7A4B3CSS=jdd03IPF6PUOISQRNPNXNQVLJJVKQVBTAvEt16MoRnbUfHBdCarU9683JDaxNfPy83okP3kLScwCkGiuMcyC4PcynvEt16MoRnbUfHBdCarU9683KT3AsB67n92UtFUX; _gia_d=1; shshshfpb=BApXcdm_fwvVAJzuAI6Mnq8QQOcIPSh90B9TUVj599xJ1MlKCa4O2; __jdb=209449046.5.797222838|3.1721239059; RT=\"z=1&dm=jd.com&si=zpw2ttxi9&ss=lyq5alej&sl=6&tt=3x4&ld=z4s&nu=3d2f85352c70c73af100bf1449967844&cl=x78\"\r\n\r\n;";
 
             string uuid = cookies.GetContentPart("__jdu=", ";");
             string __jda = cookies.GetContentPart("__jda=", ";");

+ 100 - 0
molilian.core/Plus/JDUnion/order.cs

@@ -0,0 +1,100 @@
+using dodohold.core;
+using Sayaka.Common;
+
+
+namespace molilian.core
+{
+    public partial class JdUnionPlus
+    {
+
+
+
+        public async Task<JdDataDTO> listOrderSku(JdDataDTO result, string wareUrl, CancellationToken cancellationToken = default)
+        {
+            string[] parts = wareUrl.Split(new string[] { ".html" }, StringSplitOptions.None);
+            if (parts.Length > 1)
+            {
+                wareUrl = parts[0] + ".html";
+            }
+
+
+            var ts = DateTime.Now.Convert2UnixTimestamp(true);
+            string cookies = _account.cookies;
+
+            string uuid = cookies.GetContentPart("__jdu=", ";");
+            string __jda = cookies.GetContentPart("__jda=", ";");
+            if (__jda.Split('.').Length > 1)
+            {
+                uuid = __jda.Split('.')[1];
+            }
+
+            string useragent = _account.user_agent;
+            if (string.IsNullOrEmpty(useragent)) useragent = ProviderFakeUserAgent.RandomComputer;
+            string url = $"https://api.m.jd.com/api?functionId=unionPromoteLinkService&" +
+                $"appid=unionpc&_={ts}&loginType=3&uuid={uuid}";
+
+            var args = new
+            {
+                funName = "getCode",
+                param = new
+                {
+                    couponLink = "",
+                    isPinGou = 0,
+                    materialId = result.itemId,
+                    materialType = 1,
+                    planId = 3479956501,
+                    promotionType = 15,
+                    receiveType = "cps",
+                    wareUrl = wareUrl,
+                    isSmartGraphics = 0,
+                    command = 1,
+                    ext1 = "618|pc|".UrlEncode()
+                },
+                lientPageId = "jingfen_pc"
+            };
+            string data = args.Convert2Json().UrlEncode();
+
+            WebClientUtility client = new WebClientUtility();
+            client.Proxy = _proxy;
+#if DEBUG
+            client.Proxy = null;
+#endif
+            client.SetContentType("application/x-www-form-urlencoded");
+            client.AddHeaders("X-Referer-Page", "https://union.jd.com/proManager/index");
+            client.AddHeaders("X-Rp-Client", "h5_1.0.0");
+            client.AddHeaders("Referer", "https://union.jd.com/");
+            client.AddHeaders("Origin", "https://union.jd.com");
+            client.UserAgent = useragent;
+            client.AddHeaders("Cookie", cookies);
+            client.Post($"body={data}");
+            var response = await client.RequestAsync(url, "POST", cancellationToken);
+
+            string body = response.Body();
+            var root = body.Convert2JsonElement();
+            int code = root.Read<int>("code");
+            string message = root.Read<string>("message");
+            string shortCode = root.PathRead<string>("data.shortCode");
+
+            if (code == 200)
+            {
+                result.success = true;
+                result.message = "OK";
+                result.shortLinkurl = shortCode;
+                result.content = result.shortLinkurl;
+                result.deeplink_url = GetDeeplink(result.shortLinkurl);
+            }
+            else
+            {
+                if (string.IsNullOrEmpty(body)) message = "网络异常";
+                result.success = false;
+                result.message = "转链失败";
+                result.reason = message;
+                result.shortLinkurl = wareUrl;
+                result.deeplink_url = GetDeeplink(result.shortLinkurl);
+                _ = new LoggerLibrary("JdUnion", "GetPromotionByCrawlerAsync").Info(body).SaveAsync();
+            }
+            return result;
+        }
+
+    }
+}

+ 41 - 7
molilian.core/Plus/TaobaoOpen/TaobaoOpenPlus.cs

@@ -1,4 +1,5 @@
 using dodohold.core;
+using Org.BouncyCastle.Ocsp;
 using System.Net;
 using System.Text.Json;
 using System.Xml;
@@ -25,12 +26,13 @@ namespace molilian.core
         string _app_secret = string.Empty;
         string _pid = string.Empty;
         string _server_url = "https://eco.taobao.com/router/rest";
-
-        public TaobaoOpenPlus(string app_key, string app_secret, string pid)
+        bool _debug = false;
+        public TaobaoOpenPlus(string app_key, string app_secret, string pid, bool debug)
         {
             _app_key = app_key;
             _app_secret = app_secret;
             _pid = pid;
+            _debug = debug;
         }
 
         public static PromotionQueryItemDTO ConverPromotionQueryItem(JsonElement item)
@@ -68,6 +70,12 @@ namespace molilian.core
             req.Option_ = obj1;
 
             TbkThorMfrsPromotionQueryResponse rsp = client.Execute(req);
+            if (_debug)
+            {
+                var _req = req.Convert2Json();
+                var _rsp = rsp.Convert2Json();
+                new LoggerLibrary("debug", oaid).Info(_req, _rsp).Save();
+            }
             return rsp;
         }
 
@@ -75,8 +83,8 @@ namespace molilian.core
 
         public async Task<(List<PromotionQueryItemDTO>, string, int)> GetRecommendDataWithRetry(
             RecommendRequestType type, string oaid,
-           string cookies,
-           CancellationToken cancellationToken = default)
+            string cookies,
+            CancellationToken cancellationToken = default)
         {
             DateTime stime = DateTime.Now;
             // 假设传入了一个 CancellationToken cancellationToken 和 int maxRetries 表示最大重试次数
@@ -86,13 +94,18 @@ namespace molilian.core
             {
                 try
                 {
-                    (var data, string cookie) = await GetRecommendData(type, oaid, cookies, cancellationToken);
+                    (var data, cookies) = await GetRecommendData(type, oaid, cookies, cancellationToken);
                     var ts = DateTime.Now - stime;
                     int elapsedTime = (int)ts.TotalMilliseconds;
-                    return (data, cookie, elapsedTime);
+                    return (data, cookies, elapsedTime);
                 }
                 catch (Exception ex)
                 {
+                    if (type == RecommendRequestType.first &&
+                        ex.Message.Equals("RECOMMEND_UNKNOWN_ERROR::Recommend未知错误"))
+                    {
+                        return (new List<PromotionQueryItemDTO>(), cookies, 2);
+                    }
                     if (retryCount >= maxRetries || cancellationToken.IsCancellationRequested)
                     {
                         throw;
@@ -119,6 +132,15 @@ namespace molilian.core
 
                 if (!res.Successed) { throw res.ResponseException; }
                 body = res.Body();
+
+                if (_debug)
+                {
+                    new LoggerLibrary("debug", oaid)
+                        .Info("第一次 cookies 初始化")
+                        .Info(url, body)
+                        .Save();
+                }
+
                 cookies = res.ResponseMessage.GetCookiesString();
                 token = cookies.GetContentPart("_m_h5_tk=", "_");
             }
@@ -128,7 +150,19 @@ namespace molilian.core
             if (!string.IsNullOrEmpty(cookies)) client.SetCookies(cookies);
             var response = await client.RequestAsync(url, "GET", cancellationToken);
             body = response.Body();
-            body = body.GetContentPart("mtopjsonp1(", ")");
+
+            if (_debug)
+            {
+                new LoggerLibrary("debug", oaid)
+                    .Info("GetRecommendData")
+                    .Info(url, cookies)
+                    .Info(body)
+                    .Save();
+            }
+
+            body = body.Trim().StringTrimStart("mtopjsonp1(");
+            body = body.StringTrimEnd(")");
+
 
             var root = body.Convert2JsonElement();
             var ret = root.PathRead("ret[0]", string.Empty);

+ 0 - 114
molilian.core/Plus/UploadFile/ImageHostingPlus.cs

@@ -1,114 +0,0 @@
-using dodohold.core;
-using Dataoke;
-using System.Net.Http.Headers;
-using Microsoft.AspNetCore.Http;
-using System.Net.Http;
-using System.Net.Mime;
-using static dodohold.core.ZTOExpress.CreateOrderArgs;
-using System.Net;
-using System.Text;
-
-namespace molilian.core
-{
-    public class ImageData
-    {
-        public string url { get; set; } = string.Empty;
-        public string filename { get; set; } = string.Empty;
-        public object fileType { get; set; } = false;
-        public int fileSize { get; set; } = 0;
-    }
-
-    public class ImageRootData
-    {
-        public bool success { get; set; } = false;
-        public int code { get; set; } = 200;
-        public ImageData? data { get; set; }
-        public string message { get; set; } = string.Empty;
-    }
-
-
-
-    public partial class ImageHostingPlus
-    {
-
-        public static async Task<ImageRootData> Dianping(string file_name, byte[] bytes)
-        {
-            var ts = DateTime.Now.Convert2UnixTimestamp(true).ToString();
-            Guid guid = Guid.NewGuid();
-            string randomString = guid.ToString();
-
-            var fileContent = new ByteArrayContent(bytes)
-            {
-                Headers =
-                {
-                    ContentDisposition = new ContentDispositionHeaderValue("form-data")
-                    {
-                        Name = "files",
-                        FileName = "blob",
-                    }
-                }
-            };
-
-            var exts = file_name.GetLastContentPart(".", "");
-            var contentType = WebClientUtility.GetContentType(exts);
-            fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
-
-            var formData = new MultipartFormDataContent()
-            {
-                { new StringContent(file_name), "fileName"},
-                { new StringContent(ts), "fileID"},
-                { new StringContent("0"),"part"},
-                { new StringContent("1"), "partSize"},
-                { fileContent, "files"}
-            };
-
-            // 创建 HttpClient
-            using HttpClient client = new();
-            client.DefaultRequestHeaders.Referrer = new Uri("https://h5.dianping.com/");
-            //client.DefaultRequestHeaders.Add("CSC-VisitId", $"access-{randomString}");
-            client.DefaultRequestHeaders.Add("CSC-VisitId", $"access-11514014-0606-4887-8251-988914b16724");
-            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36");
-
-            // 设置上传的服务器地址
-            string uploadUrl = "https://kf.dianping.com/api/file/burstUploadFile";
-
-            // 构建 HTTP 请求
-            HttpRequestMessage request = new(HttpMethod.Post, uploadUrl);
-            request.Content = formData;
-
-            // 发送 POST 请求上传文件
-            HttpResponseMessage response = await client.SendAsync(request);
-
-            // 读取响应内容
-            string responseBody = await response.Content.ReadAsStringAsync();
-            var root = responseBody.Convert2JsonElement();
-
-            var result = new ImageRootData();
-            result.success = root.Read<bool>("success", false);
-            if (result.success)
-            {
-                _ = new LoggerLibrary("ImageHosting", "meituan").Info(responseBody).SaveAsync();
-            }
-
-            result.code = root.Read<int>("code", 0);
-            result.message = root.Read<string>("errMsg", string.Empty);
-
-            result.data = new ImageData
-            {
-                url = root.PathRead<string>("data.uploadPath", string.Empty),
-                filename = root.PathRead<string>("data.filename", string.Empty),
-                fileSize = root.PathRead<int>("data.fileSize", 0),
-                fileType = contentType
-            };
-
-            int fileSize = root.PathRead<int>("data.fileSize");
-            return result;
-        }
-
-
-
-    }
-
-
-}
-

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio