|
@@ -14,6 +14,10 @@ using Microsoft.AspNetCore.Mvc;
|
|
|
using Microsoft.AspNetCore.Authentication;
|
|
using Microsoft.AspNetCore.Authentication;
|
|
|
using Spire.Pdf.Graphics;
|
|
using Spire.Pdf.Graphics;
|
|
|
using Google.Protobuf.WellKnownTypes;
|
|
using Google.Protobuf.WellKnownTypes;
|
|
|
|
|
+using TencentCloud.Tcm.V20210413.Models;
|
|
|
|
|
+using System.Diagnostics;
|
|
|
|
|
+using System.Threading;
|
|
|
|
|
+using TencentCloud.Soe.V20180724.Models;
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace molilian.core
|
|
namespace molilian.core
|
|
@@ -21,7 +25,7 @@ namespace molilian.core
|
|
|
public partial class UnionParseCore
|
|
public partial class UnionParseCore
|
|
|
{
|
|
{
|
|
|
|
|
|
|
|
- public static async Task<ActionResult> UnionParseAsync(string content, string channel, string ip, string oaid)
|
|
|
|
|
|
|
+ public static async Task<ActionResult> UnionParseAsync(string content, string channel, string ip, string oaid, int accountid = 0)
|
|
|
{
|
|
{
|
|
|
return channel switch
|
|
return channel switch
|
|
|
{
|
|
{
|
|
@@ -29,7 +33,7 @@ namespace molilian.core
|
|
|
"bdpan" => PanParse(content, ip, oaid),
|
|
"bdpan" => PanParse(content, ip, oaid),
|
|
|
"jd" => await JdParseAsync(content, ip, oaid),
|
|
"jd" => await JdParseAsync(content, ip, oaid),
|
|
|
"dy" => await DyParseAsync(content, ip, oaid),
|
|
"dy" => await DyParseAsync(content, ip, oaid),
|
|
|
- _ => await TaobaoParseAsync(content, ip, oaid),
|
|
|
|
|
|
|
+ _ => await TaobaoParseAsync(content, ip, oaid, accountid),
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -110,16 +114,244 @@ namespace molilian.core
|
|
|
}, result.success ? APIResultCodeEnum.OK : APIResultCodeEnum.NotAcceptable);
|
|
}, result.success ? APIResultCodeEnum.OK : APIResultCodeEnum.NotAcceptable);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public static async Task<APIResult> TaobaoParseAsync(string content, string ip = "", string oaid = "")
|
|
|
|
|
|
|
+
|
|
|
|
|
+ private static APIResult TaobaoParseOutput(TkDataDTO result, Dictionary<string, long> swData, object info, APIResultCodeEnum code = APIResultCodeEnum.OK)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (result.elapsedTime > 2000)
|
|
|
|
|
+ {
|
|
|
|
|
+ LoggerLibrary log = new("debug", "stopwatch");
|
|
|
|
|
+ foreach ((var key, var value) in swData)
|
|
|
|
|
+ {
|
|
|
|
|
+ log.Info($"{key}\t{value}");
|
|
|
|
|
+ }
|
|
|
|
|
+ log.SaveAsync();
|
|
|
|
|
+ }
|
|
|
|
|
+ return new APIResult(info, code);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static async Task<APIResult> TaobaoParseAsync(string content,
|
|
|
|
|
+ string ip = "", string oaid = "",
|
|
|
|
|
+ int accountid = 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ AlimamaPlus alimama = null;
|
|
|
|
|
+ content = content.UrlDecode();
|
|
|
|
|
+ content = content[..Math.Min(1000, content.Length)];
|
|
|
|
|
+ var result = AlimamaPlus.GetFormattedObject(content, ip, oaid);
|
|
|
|
|
+
|
|
|
|
|
+ Dictionary<string, long> swData = new();
|
|
|
|
|
+ swData.Add("StartNew", 0);
|
|
|
|
|
+ Stopwatch stopwatch = Stopwatch.StartNew();
|
|
|
|
|
+
|
|
|
|
|
+ result.rawContent = content;
|
|
|
|
|
+ try
|
|
|
|
|
+ {
|
|
|
|
|
+ bool is_other = AlimamaPlus.OtherPlatform(content);
|
|
|
|
|
+ stopwatch.Stop();
|
|
|
|
|
+ swData.Add("OtherPlatform", stopwatch.ElapsedMilliseconds);
|
|
|
|
|
+
|
|
|
|
|
+ if (is_other)
|
|
|
|
|
+ {
|
|
|
|
|
+ result.success = false;
|
|
|
|
|
+ result.message = "放弃转链";
|
|
|
|
|
+ result.reason = "平台错误";
|
|
|
|
|
+
|
|
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
|
|
+ return TaobaoParseOutput(result, swData, new
|
|
|
|
|
+ {
|
|
|
|
|
+ channel = result?.channel.ToString(),
|
|
|
|
|
+ result.success,
|
|
|
|
|
+ result.message,
|
|
|
|
|
+ result.shortLinkurl,
|
|
|
|
|
+ result.deeplink_url,
|
|
|
|
|
+ }, APIResultCodeEnum.NotAcceptable);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ stopwatch.Reset();
|
|
|
|
|
+ stopwatch.Start();
|
|
|
|
|
+ string reason = string.Empty;
|
|
|
|
|
+ bool is_ignore = AlimamaPlus.FirstFilterIgnoreRequest(content, out reason);
|
|
|
|
|
+ stopwatch.Stop();
|
|
|
|
|
+ swData.Add("FirstFilterIgnoreRequest", stopwatch.ElapsedMilliseconds);
|
|
|
|
|
+
|
|
|
|
|
+ if (string.IsNullOrEmpty(result.shortLinkurl) && is_ignore)
|
|
|
|
|
+ {
|
|
|
|
|
+ //没有短链接都放弃
|
|
|
|
|
+ result.success = false;
|
|
|
|
|
+ result.message = "放弃转链";
|
|
|
|
|
+ result.itemName = "点击打开淘宝APP";
|
|
|
|
|
+ result.reason = "初步筛选";
|
|
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
|
|
+ return TaobaoParseOutput(result, swData, new
|
|
|
|
|
+ {
|
|
|
|
|
+ result.success,
|
|
|
|
|
+ result.message,
|
|
|
|
|
+ result.content,
|
|
|
|
|
+ result.itemName,
|
|
|
|
|
+ result.deeplink_url,
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ stopwatch.Reset();
|
|
|
|
|
+ stopwatch.Start();
|
|
|
|
|
+ bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(ip, oaid, out reason);
|
|
|
|
|
+ stopwatch.Stop();
|
|
|
|
|
+ swData.Add("ShouldIgnoreRequest", stopwatch.ElapsedMilliseconds);
|
|
|
|
|
+
|
|
|
|
|
+ if (is_ignore2)
|
|
|
|
|
+ {
|
|
|
|
|
+ result.success = false;
|
|
|
|
|
+ result.message = "放弃转链";
|
|
|
|
|
+ result.itemName = "点击打开淘宝APP";
|
|
|
|
|
+ result.reason = reason;
|
|
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
|
|
+ return TaobaoParseOutput(result, swData, new
|
|
|
|
|
+ {
|
|
|
|
|
+ result.success,
|
|
|
|
|
+ result.message,
|
|
|
|
|
+ result.content,
|
|
|
|
|
+ result.itemName,
|
|
|
|
|
+ result.deeplink_url,
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ stopwatch.Reset();
|
|
|
|
|
+ stopwatch.Start();
|
|
|
|
|
+ TkPoolDTO? account = accountid > 0 ?
|
|
|
|
|
+ TkPoolCore.GetOne(accountid) :
|
|
|
|
|
+ TkPoolCore.GetOne(TkPoolCore.TkAction.parse);
|
|
|
|
|
+
|
|
|
|
|
+ stopwatch.Stop();
|
|
|
|
|
+ swData.Add("GetOne", stopwatch.ElapsedMilliseconds);
|
|
|
|
|
+
|
|
|
|
|
+ if (account == null)
|
|
|
|
|
+ {
|
|
|
|
|
+ result.success = false;
|
|
|
|
|
+ result.message = "放弃转链";
|
|
|
|
|
+ result.reason = "没有匹配账号";
|
|
|
|
|
+ result.itemName = "点击打开淘宝APP";
|
|
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
|
|
+ return TaobaoParseOutput(result, swData, new
|
|
|
|
|
+ {
|
|
|
|
|
+ result.success,
|
|
|
|
|
+ result.message,
|
|
|
|
|
+ result.content,
|
|
|
|
|
+ result.couponAmount,
|
|
|
|
|
+ result.taoToken,
|
|
|
|
|
+ result.shortLinkurl,
|
|
|
|
|
+ result.deeplink_url,
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ result.accountId = account.id;
|
|
|
|
|
+
|
|
|
|
|
+ stopwatch.Reset();
|
|
|
|
|
+ stopwatch.Start();
|
|
|
|
|
+ alimama = new AlimamaPlus(account);
|
|
|
|
|
+ stopwatch.Stop();
|
|
|
|
|
+ swData.Add("AlimamaPlus", stopwatch.ElapsedMilliseconds);
|
|
|
|
|
+
|
|
|
|
|
+ int timeout = alimama._config.rt_max - result.elapsedTime2;
|
|
|
|
|
+ using var cts = new CancellationTokenSource();
|
|
|
|
|
+ cts.CancelAfter(timeout);
|
|
|
|
|
+
|
|
|
|
|
+ stopwatch.Reset();
|
|
|
|
|
+ stopwatch.Start();
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ var requestTask = alimama.UnionParse2Async(content, result, cts.Token, swData);
|
|
|
|
|
+ var delayTask = Task.Delay(timeout, cts.Token);
|
|
|
|
|
+ var completedTask = await Task.WhenAny(requestTask, delayTask);
|
|
|
|
|
+ if (completedTask == requestTask)
|
|
|
|
|
+ {
|
|
|
|
|
+ result = await requestTask;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ cts.Cancel();
|
|
|
|
|
+ result.success = false;
|
|
|
|
|
+ result.message = "放弃转链";
|
|
|
|
|
+ result.reason = "请求超时";
|
|
|
|
|
+ result.itemName = "点击打开淘宝APP";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ stopwatch.Stop();
|
|
|
|
|
+ swData.Add("UnionParse2Async", stopwatch.ElapsedMilliseconds);
|
|
|
|
|
+
|
|
|
|
|
+ //result = await alimama.UnionParse2Async(content, result);
|
|
|
|
|
+ result.accountName = account.company;
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (Exception ex)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (ex.Message.Contains("was canceled"))
|
|
|
|
|
+ {
|
|
|
|
|
+ result.success = false;
|
|
|
|
|
+ result.message = "放弃转链";
|
|
|
|
|
+ result.reason = "请求超时";
|
|
|
|
|
+ result.itemName = "点击打开淘宝APP";
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ _ = new LoggerLibrary("unionParse", "tb_error")
|
|
|
|
|
+ .Info(ip, oaid)
|
|
|
|
|
+ .Info(content)
|
|
|
|
|
+ .Info(ex.Message, ex.StackTrace)
|
|
|
|
|
+ .SaveAsync();
|
|
|
|
|
+
|
|
|
|
|
+ NotifyCore.Notify(new NifyMessage
|
|
|
|
|
+ {
|
|
|
|
|
+ message = $"【转链异常TB】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
|
|
|
|
|
+ priority = NifyMessagePriority.high,
|
|
|
|
|
+ tags = ["red_circle"]
|
|
|
|
|
+ });
|
|
|
|
|
+ result.success = false;
|
|
|
|
|
+ result.message = "放弃转链";
|
|
|
|
|
+ result.reason = "转链接口异常";
|
|
|
|
|
+ result.itemName = "点击打开淘宝APP";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ _ = TkLogCore.ParseLogAsync(result, alimama);
|
|
|
|
|
+
|
|
|
|
|
+ return TaobaoParseOutput(result, swData, new
|
|
|
|
|
+ {
|
|
|
|
|
+ result.success,
|
|
|
|
|
+ result.message,
|
|
|
|
|
+ link_type = result.link_type.ToString(),
|
|
|
|
|
+ channel = result?.channel.ToString(),
|
|
|
|
|
+ result.channel_type,
|
|
|
|
|
+ result.itemId,
|
|
|
|
|
+ result.itemName,
|
|
|
|
|
+ result.pic,
|
|
|
|
|
+ result.promotionPrice,
|
|
|
|
|
+ result.couponAmount,
|
|
|
|
|
+ result.couponEffectiveStartTime,
|
|
|
|
|
+ result?.couponEffectiveEndTime,
|
|
|
|
|
+ result.shortLinkurl,
|
|
|
|
|
+ result.deeplink_url,
|
|
|
|
|
+ result.content,
|
|
|
|
|
+ result.taoToken,
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static async Task<APIResult> TaobaoParseAsync222(string content, string ip = "", string oaid = "")
|
|
|
{
|
|
{
|
|
|
AlimamaPlus alimama = null;
|
|
AlimamaPlus alimama = null;
|
|
|
content = content.UrlDecode();
|
|
content = content.UrlDecode();
|
|
|
content = content[..Math.Min(1000, content.Length)];
|
|
content = content[..Math.Min(1000, content.Length)];
|
|
|
var result = AlimamaPlus.GetFormattedObject(content, ip, oaid);
|
|
var result = AlimamaPlus.GetFormattedObject(content, ip, oaid);
|
|
|
|
|
+
|
|
|
|
|
+ LoggerLibrary log = new("debug", "stopwatch");
|
|
|
|
|
+ log.Info($"StartNew", content);
|
|
|
|
|
+ Stopwatch stopwatch = Stopwatch.StartNew();
|
|
|
|
|
+
|
|
|
result.rawContent = content;
|
|
result.rawContent = content;
|
|
|
try
|
|
try
|
|
|
{
|
|
{
|
|
|
- if (AlimamaPlus.OtherPlatform(content))
|
|
|
|
|
|
|
+ bool is_other = AlimamaPlus.OtherPlatform(content);
|
|
|
|
|
+ stopwatch.Stop();
|
|
|
|
|
+ log.Info($"AlimamaPlus.OtherPlatform\t{stopwatch.ElapsedMilliseconds}");
|
|
|
|
|
+
|
|
|
|
|
+ if (is_other)
|
|
|
{
|
|
{
|
|
|
result.success = false;
|
|
result.success = false;
|
|
|
result.message = "放弃转链";
|
|
result.message = "放弃转链";
|
|
@@ -191,7 +423,26 @@ namespace molilian.core
|
|
|
}
|
|
}
|
|
|
result.accountId = account.id;
|
|
result.accountId = account.id;
|
|
|
alimama = new AlimamaPlus(account);
|
|
alimama = new AlimamaPlus(account);
|
|
|
- result = await alimama.UnionParse2Async(content, result);
|
|
|
|
|
|
|
+ int timeout = alimama._config.rt_max;
|
|
|
|
|
+
|
|
|
|
|
+ using var cts = new CancellationTokenSource();
|
|
|
|
|
+ cts.CancelAfter(timeout);
|
|
|
|
|
+ var requestTask = alimama.UnionParse2Async(content, result, cts.Token);
|
|
|
|
|
+ var delayTask = Task.Delay(timeout, cts.Token);
|
|
|
|
|
+ var completedTask = await Task.WhenAny(requestTask, delayTask);
|
|
|
|
|
+ if (completedTask == requestTask)
|
|
|
|
|
+ {
|
|
|
|
|
+ result = await requestTask;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ cts.Cancel();
|
|
|
|
|
+ result.success = false;
|
|
|
|
|
+ result.message = "放弃转链";
|
|
|
|
|
+ result.reason = "请求超时";
|
|
|
|
|
+ result.itemName = "点击打开淘宝APP";
|
|
|
|
|
+ }
|
|
|
|
|
+ //result = await alimama.UnionParse2Async(content, result);
|
|
|
result.accountName = account.company;
|
|
result.accountName = account.company;
|
|
|
}
|
|
}
|
|
|
catch (Exception ex)
|
|
catch (Exception ex)
|
|
@@ -290,7 +541,7 @@ namespace molilian.core
|
|
|
// }
|
|
// }
|
|
|
//}
|
|
//}
|
|
|
|
|
|
|
|
- public static async Task<APIResult> JdParseAsync(string content, string ip, string oaid)
|
|
|
|
|
|
|
+ public static async Task<APIResult> JdParseAsync(string content, string ip, string oaid, CancellationToken cancellationToken = default)
|
|
|
{
|
|
{
|
|
|
var result = JdUnionPlus.GetFormattedObject(content, ip, oaid);
|
|
var result = JdUnionPlus.GetFormattedObject(content, ip, oaid);
|
|
|
content = content.UrlDecode();
|
|
content = content.UrlDecode();
|
|
@@ -316,7 +567,7 @@ namespace molilian.core
|
|
|
_ = TkLogCore.ParseLogAsync(result);
|
|
_ = TkLogCore.ParseLogAsync(result);
|
|
|
return new APIResult(result);
|
|
return new APIResult(result);
|
|
|
}
|
|
}
|
|
|
- result = await JdUnionPlus.JdParseAsync(account, content, result);
|
|
|
|
|
|
|
+ result = await JdUnionPlus.JdParseAsync(account, content, result, cancellationToken);
|
|
|
}
|
|
}
|
|
|
catch (Exception ex)
|
|
catch (Exception ex)
|
|
|
{
|
|
{
|
|
@@ -360,7 +611,7 @@ namespace molilian.core
|
|
|
}, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK);
|
|
}, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public static async Task<APIResult> DyParseAsync(string content, string ip, string oaid)
|
|
|
|
|
|
|
+ public static async Task<APIResult> DyParseAsync(string content, string ip, string oaid, CancellationToken cancellationToken = default)
|
|
|
{
|
|
{
|
|
|
var result = DyUnionPlus.GetFormattedObject(content, ip, oaid);
|
|
var result = DyUnionPlus.GetFormattedObject(content, ip, oaid);
|
|
|
content = content.UrlDecode();
|
|
content = content.UrlDecode();
|
|
@@ -368,6 +619,14 @@ namespace molilian.core
|
|
|
bool IfExceptional = false;
|
|
bool IfExceptional = false;
|
|
|
try
|
|
try
|
|
|
{
|
|
{
|
|
|
|
|
+ // 2024-06-19 联盟业务下线
|
|
|
|
|
+ result.success = false;
|
|
|
|
|
+ result.message = "放弃转链";
|
|
|
|
|
+ result.reason = "联盟下线";
|
|
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
|
|
+ return new APIResult(result);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
if (DyUnionPlus.ShouldIgnoreRequest(ip, oaid, out string reason))
|
|
if (DyUnionPlus.ShouldIgnoreRequest(ip, oaid, out string reason))
|
|
|
{
|
|
{
|
|
|
result.success = false;
|
|
result.success = false;
|
|
@@ -386,7 +645,7 @@ namespace molilian.core
|
|
|
_ = TkLogCore.ParseLogAsync(result);
|
|
_ = TkLogCore.ParseLogAsync(result);
|
|
|
return new APIResult(result);
|
|
return new APIResult(result);
|
|
|
}
|
|
}
|
|
|
- result = await DyUnionPlus.DyParseAsync(account, content, result);
|
|
|
|
|
|
|
+ result = await DyUnionPlus.DyParseAsync(account, content, result, cancellationToken);
|
|
|
}
|
|
}
|
|
|
catch (Exception ex)
|
|
catch (Exception ex)
|
|
|
{
|
|
{
|