|
|
@@ -24,17 +24,24 @@ namespace molilian.core
|
|
|
}
|
|
|
|
|
|
request.Content = request.Content.Trim();
|
|
|
-
|
|
|
- if ("dp".Equals(request.Type))
|
|
|
+ switch (request.Type)
|
|
|
{
|
|
|
- return request.Channel switch
|
|
|
- {
|
|
|
- "jd" => await DeeplinkJdParseAsync(request),
|
|
|
- "pdd" => await DeeplinkPddParseAsync(request),
|
|
|
- "tb" => await DeeplinkTaobaoParseAsync(request),
|
|
|
- };
|
|
|
+ case "dp":
|
|
|
+ return request.Channel switch
|
|
|
+ {
|
|
|
+ "jd" => await DeeplinkJdParseAsync(request),
|
|
|
+ "pdd" => await DeeplinkPddParseAsync(request),
|
|
|
+ "tb" => await DeeplinkTaobaoParseAsync(request),
|
|
|
+ };
|
|
|
+ case "goods":
|
|
|
+ return request.Channel switch
|
|
|
+ {
|
|
|
+ "jd" => await GoodsJdParseAsync(request),
|
|
|
+ "pdd" => await GoodsPddParseAsync(request),
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
+
|
|
|
return request.Channel switch
|
|
|
{
|
|
|
//"wemeet" => await WemeetParseAsync(request),
|
|
|
@@ -572,6 +579,181 @@ namespace molilian.core
|
|
|
}, code);
|
|
|
}
|
|
|
|
|
|
+ public static async Task<APIResult> GoodsJdParseAsync(UnionParseRequest request, CancellationToken cancellationToken = default)
|
|
|
+ {
|
|
|
+ var config = TkConfigCore.Get();
|
|
|
+ var result = JdUnionPlus.GetFormattedObject(request.Content, request.Ip, request.Oaid, request.ClickId);
|
|
|
+
|
|
|
+ result.rawContent = request.Content;
|
|
|
+ result.riskStrategy = request.RiskStrategy;
|
|
|
+ result.launchScene = request.LaunchScene;
|
|
|
+ bool IfExceptional = false;
|
|
|
+ bool is_hide = false;
|
|
|
+ string content = request.Content;
|
|
|
+ try
|
|
|
+ {
|
|
|
+
|
|
|
+ string goods_pattern = @"(?:sku=|sku%3D|sku%253D)(\d+)";
|
|
|
+ Match match = Regex.Match(content, goods_pattern);
|
|
|
+ if (match.Success)
|
|
|
+ {
|
|
|
+ string goods_id = match.Groups[1].Value; // 返回匹配的 URL
|
|
|
+ if (string.IsNullOrEmpty(goods_id))
|
|
|
+ {
|
|
|
+ result.success = false;
|
|
|
+ result.deeplink_url = string.Empty;
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = "无效商品ID";
|
|
|
+ _ = TkLogCore.ParseLogAsync(result, is_hide);
|
|
|
+ return JdParseOutput(result);
|
|
|
+ }
|
|
|
+ content = $"https://item.jd.com/{goods_id}.html";
|
|
|
+ result.shortLinkurl = content;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ result.success = false;
|
|
|
+ result.deeplink_url = string.Empty;
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = "无效商品ID";
|
|
|
+ _ = TkLogCore.ParseLogAsync(result, is_hide);
|
|
|
+ return JdParseOutput(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!string.IsNullOrEmpty(config.jd_blacklist_regular))
|
|
|
+ {
|
|
|
+ var blacklist = config.jd_blacklist_regular.Split('\n')
|
|
|
+ .Where(line => !string.IsNullOrWhiteSpace(line))
|
|
|
+ .ToList();
|
|
|
+ bool anyMatch = false;
|
|
|
+ foreach (string pattern in blacklist)
|
|
|
+ {
|
|
|
+ if (Regex.IsMatch(content, pattern, RegexOptions.IgnoreCase)) anyMatch = true;
|
|
|
+ }
|
|
|
+ if (anyMatch)
|
|
|
+ {
|
|
|
+ result.success = false;
|
|
|
+ result.deeplink_url = string.IsNullOrEmpty(result.shortLinkurl) ? string.Empty : JdUnionPlus.GetDeeplink(result.shortLinkurl, request.ClickId);
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = "规则排除";
|
|
|
+ _ = TkLogCore.ParseLogAsync(result, is_hide);
|
|
|
+ return JdParseOutput(result);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ string out_url = null;
|
|
|
+ string itemId = null;
|
|
|
+
|
|
|
+ //============================== 放弃转链-地区过滤 ==============================
|
|
|
+ if (!TestParseCore.InWhitelist(result.ip, result.oaid) && request.AccountId == 0 && JdUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, request.RiskStrategy, request.LaunchScene, out string reason))
|
|
|
+ {
|
|
|
+ result.link_type = JdUnionPlus.GetLinkType(result.shortLinkurl, out out_url, out itemId);
|
|
|
+
|
|
|
+ result.deeplink_url = result.link_type switch
|
|
|
+ {
|
|
|
+ LinkTypeEnum.other_aff or
|
|
|
+ LinkTypeEnum.live or
|
|
|
+ LinkTypeEnum.video or
|
|
|
+ LinkTypeEnum.profile or
|
|
|
+ LinkTypeEnum.goods => JdUnionPlus.GetDefaultStyleDeeplink(result.shortLinkurl),
|
|
|
+ _ => JdUnionPlus.GetDefaultStyleDeeplink(result.shortLinkurl),
|
|
|
+ };
|
|
|
+
|
|
|
+ //if (result.link_type == LinkTypeEnum.other_aff)
|
|
|
+ //{
|
|
|
+ // //20241204 特例
|
|
|
+ // if ("bj".Equals(EndPointCore.CurrentEndPoint))
|
|
|
+ // {
|
|
|
+ // string ruleKey = $"tmp_rules1:jd:{DateTime.Now:yyyyMMdd}";
|
|
|
+ // var count = RedisHelper.Get<int>(ruleKey);
|
|
|
+ // if (DateTime.Now < DateTime.Parse("2024-12-07") && count < 500)
|
|
|
+ // {
|
|
|
+ // result.deeplink_url = "openapp.jdmobile://virtual?params=%7B%22des%22%3A%22union%22%2C%22category%22%3A%22jump%22%2C%22url%22%3A%22https%3A%2F%2Fu.jd.com%2FugInesd%3Fe%3DCPS-11417-__ZLDEVICE__-CPS-wkfG72%22%7D&backurl=__back_url__";
|
|
|
+ // RedisHelper.IncrBy(ruleKey);
|
|
|
+ // RedisHelper.Expire(ruleKey, 86400 * 1);
|
|
|
+ // }
|
|
|
+
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+ result.success = false;
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = reason;
|
|
|
+ _ = TkLogCore.ParseLogAsync(result, is_hide);
|
|
|
+ return JdParseOutput(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ result.link_type = JdUnionPlus.GetLinkType(result.shortLinkurl, out out_url, out itemId);
|
|
|
+
|
|
|
+ bool is_numeric = result.shortLinkurl.Contains(itemId);
|
|
|
+
|
|
|
+ var account = request.AccountId > 0 ?
|
|
|
+ await JdPoolCore.GetOneAsync(request.AccountId, JdPoolCore.JdAction.parse) :
|
|
|
+ await JdPoolCore.GetOneAsync(JdPoolCore.JdAction.parse, is_numeric, request);
|
|
|
+ if (account == null)
|
|
|
+ {
|
|
|
+ result.success = false;
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = "没有匹配账号";
|
|
|
+ result.deeplink_url = result.link_type switch
|
|
|
+ {
|
|
|
+ LinkTypeEnum.other_aff or LinkTypeEnum.goods => JdUnionPlus.GetDefaultStyleDeeplink(result.shortLinkurl),
|
|
|
+ _ => JdUnionPlus.GetDefaultStyleDeeplink(result.shortLinkurl),
|
|
|
+ };
|
|
|
+
|
|
|
+ _ = TkLogCore.ParseLogAsync(result, is_hide);
|
|
|
+ return JdParseOutput(result);
|
|
|
+ }
|
|
|
+ result.accountId = account.id;
|
|
|
+ result.accountName = account.name;
|
|
|
+ is_hide = account.is_hide;
|
|
|
+
|
|
|
+ var plus = new JdUnionPlus(account);
|
|
|
+ result.proxy_name = plus._proxyName;
|
|
|
+ result.proxy_node = plus._proxy?.Address?.Host;
|
|
|
+
|
|
|
+ result = await plus.JdParseAsync(content, request.CommerceType, request.ClickId, result, cancellationToken);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ if (ex.Message.Contains("was canceled"))
|
|
|
+ {
|
|
|
+ result.success = false;
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = "请求超时";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ IfExceptional = true;
|
|
|
+ _ = new LoggerLibrary("unionParse", "jd_error")
|
|
|
+ .Info(request.Ip, request.Oaid)
|
|
|
+ .Info(content)
|
|
|
+ .Info(ex.Message, ex.StackTrace)
|
|
|
+ .SaveAsync();
|
|
|
+ NotifyCore.Notify(new NifyMessage
|
|
|
+ {
|
|
|
+ message = $"【转链异常JD】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
|
|
|
+ priority = NifyMessagePriority.high,
|
|
|
+ tags = ["red_circle"]
|
|
|
+ });
|
|
|
+ result.success = false;
|
|
|
+ result.message = "内部错误";
|
|
|
+ result.reason = "转链接口异常";
|
|
|
+ }
|
|
|
+ result.deeplink_url = result.link_type switch
|
|
|
+ {
|
|
|
+ LinkTypeEnum.other_aff or LinkTypeEnum.goods => JdUnionPlus.GetDefaultStyleDeeplink(result.shortLinkurl),
|
|
|
+ _ => JdUnionPlus.GetDefaultStyleDeeplink(result.shortLinkurl),
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (!result.success)
|
|
|
+ {
|
|
|
+ result.deeplink_url = string.IsNullOrEmpty(result.shortLinkurl) ? string.Empty : JdUnionPlus.GetDeeplink(result.shortLinkurl, request.ClickId);
|
|
|
+
|
|
|
+ }
|
|
|
+ _ = TkLogCore.ParseLogAsync(result, is_hide);
|
|
|
+ return JdParseOutput(result, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
public static async Task<APIResult> JdParseAsync(UnionParseRequest request, CancellationToken cancellationToken = default)
|
|
|
{
|
|
|
var config = TkConfigCore.Get();
|
|
|
@@ -583,6 +765,7 @@ namespace molilian.core
|
|
|
bool IfExceptional = false;
|
|
|
bool is_hide = false;
|
|
|
string content = request.Content;
|
|
|
+ content = content.UrlDecode();
|
|
|
try
|
|
|
{
|
|
|
var overrideContent = await OverrideRuleCore.ProcessAsync(request);
|
|
|
@@ -597,40 +780,6 @@ namespace molilian.core
|
|
|
return JdParseOutput(result);
|
|
|
}
|
|
|
|
|
|
- switch (request.Type)
|
|
|
- {
|
|
|
- case "goods":
|
|
|
- string pattern = @"(?:sku=|sku%3D|sku%253D)(\d+)";
|
|
|
- Match match = Regex.Match(content, pattern);
|
|
|
-
|
|
|
- if (match.Success)
|
|
|
- {
|
|
|
- string goods_id = match.Groups[1].Value; // 返回匹配的 URL
|
|
|
- if (string.IsNullOrEmpty(goods_id))
|
|
|
- {
|
|
|
- result.success = false;
|
|
|
- result.deeplink_url = string.Empty;
|
|
|
- result.message = "放弃转链";
|
|
|
- result.reason = "无效商品ID";
|
|
|
- _ = TkLogCore.ParseLogAsync(result, is_hide);
|
|
|
- return JdParseOutput(result);
|
|
|
- }
|
|
|
- content = $"https://item.jd.com/{goods_id}.html";
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- result.success = false;
|
|
|
- result.deeplink_url = string.Empty;
|
|
|
- result.message = "放弃转链";
|
|
|
- result.reason = "无效商品ID";
|
|
|
- _ = TkLogCore.ParseLogAsync(result, is_hide);
|
|
|
- return JdParseOutput(result);
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- content = content.UrlDecode();
|
|
|
- break;
|
|
|
- }
|
|
|
if (!string.IsNullOrEmpty(config.jd_blacklist_regular))
|
|
|
{
|
|
|
var blacklist = config.jd_blacklist_regular.Split('\n')
|
|
|
@@ -711,7 +860,9 @@ namespace molilian.core
|
|
|
|
|
|
bool is_numeric = result.shortLinkurl.Contains(itemId);
|
|
|
|
|
|
- var account = request.AccountId > 0 ? await JdPoolCore.GetOneAsync(request.AccountId, JdPoolCore.JdAction.parse) : await JdPoolCore.GetOneAsync(JdPoolCore.JdAction.parse, request.RiskStrategy, request.LaunchScene, is_numeric);
|
|
|
+ var account = request.AccountId > 0 ?
|
|
|
+ await JdPoolCore.GetOneAsync(request.AccountId, JdPoolCore.JdAction.parse) :
|
|
|
+ await JdPoolCore.GetOneAsync(JdPoolCore.JdAction.parse, is_numeric, request);
|
|
|
if (account == null)
|
|
|
{
|
|
|
result.success = false;
|
|
|
@@ -872,7 +1023,6 @@ namespace molilian.core
|
|
|
{
|
|
|
var result = PddUnionPlus.GetFormattedObject(request.Content, request.Ip, request.Oaid);
|
|
|
|
|
|
-
|
|
|
var overrideContent = await OverrideRuleCore.ProcessAsync(request);
|
|
|
if (overrideContent != null)
|
|
|
{
|
|
|
@@ -885,42 +1035,17 @@ namespace molilian.core
|
|
|
}
|
|
|
|
|
|
string content = request.Content;
|
|
|
- switch (request.Type)
|
|
|
+ result.rawContent = content;
|
|
|
+ if (string.IsNullOrEmpty(result.shortLinkurl))
|
|
|
{
|
|
|
- case "goods":
|
|
|
- string pattern = @"(?:goods_id=|goods_id%3D|goods_id%253D)(\d+)";
|
|
|
- Match match = Regex.Match(content, pattern);
|
|
|
- if (match.Success)
|
|
|
- {
|
|
|
- string goods_id = match.Groups[1].Value; // 返回匹配的 URL
|
|
|
- if (string.IsNullOrEmpty(content))
|
|
|
- {
|
|
|
- result.success = false;
|
|
|
- result.deeplink_url = string.Empty;
|
|
|
- result.message = "放弃转链";
|
|
|
- result.reason = "无效商品ID";
|
|
|
- _ = TkLogCore.ParseLogAsync(result);
|
|
|
- return PddParseOutput(result);
|
|
|
- }
|
|
|
- //https://mobile.yangkeduo.com/goods.html?_wv=41729&_wvx=10&goods_id=665746260825
|
|
|
- content = $"https://mobile.yangkeduo.com/goods.html?goods_id={goods_id}";
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- result.success = false;
|
|
|
- result.deeplink_url = string.Empty;
|
|
|
- result.message = "放弃转链";
|
|
|
- result.reason = "无效商品ID";
|
|
|
- _ = TkLogCore.ParseLogAsync(result);
|
|
|
- return PddParseOutput(result);
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- content = content.UrlDecode();
|
|
|
- break;
|
|
|
+ result.success = false;
|
|
|
+ result.deeplink_url = string.Empty;
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = "纯口令";
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
+ return PddParseOutput(result);
|
|
|
}
|
|
|
|
|
|
- result.rawContent = content;
|
|
|
bool IfExceptional = false;
|
|
|
try
|
|
|
{
|
|
|
@@ -957,76 +1082,177 @@ namespace molilian.core
|
|
|
return PddParseOutput(result);
|
|
|
}
|
|
|
PddPoolDTO account = null;
|
|
|
- string lockKey;
|
|
|
- long cis_num = 0;
|
|
|
+ // 直接调用GetOne获取账号
|
|
|
+ // 新的调度策略已经在内部处理了:
|
|
|
+ // 1. 基于时间间隔的账号选择
|
|
|
+ // 2. 并发安全的账号预留(Redis SETNX)
|
|
|
+ // 3. 依次尝试多个候选账号
|
|
|
+ // 因此不需要外层重试逻辑
|
|
|
+ account = PddPoolCore.GetOne(PddUnionWorkMode.All, request.AccountId);
|
|
|
|
|
|
- for (int i = 0; i < 3; i++)
|
|
|
+ if (account == null)
|
|
|
{
|
|
|
- for (int j = 0; j < 3; j++)
|
|
|
- {
|
|
|
- account = PddPoolCore.GetOne(PddUnionWorkMode.All, request.AccountId);
|
|
|
- if (account == null) continue;
|
|
|
-
|
|
|
- if (account.cis_limit > 0)
|
|
|
- {
|
|
|
- lockKey = $"pdd_cis_limit_{result.accountId}";
|
|
|
- cis_num = RedisHelper.Get<long>(lockKey);
|
|
|
- if (cis_num > 0) continue;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- if (account == null)
|
|
|
- {
|
|
|
- result.success = false;
|
|
|
- result.message = "放弃转链";
|
|
|
- result.reason = "没有匹配账号";
|
|
|
- result.deeplink_url = PddUnionPlus.GetDeeplink(result.rawContent);
|
|
|
- _ = TkLogCore.ParseLogAsync(result);
|
|
|
- return PddParseOutput(result);
|
|
|
- }
|
|
|
- result.accountId = account.id;
|
|
|
- result.accountName = account.name;
|
|
|
- result.proxy_node = account.nodeName;
|
|
|
+ result.success = false;
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = "没有匹配账号";
|
|
|
+ result.deeplink_url = PddUnionPlus.GetDeeplink(result.shortLinkurl);
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
+ return PddParseOutput(result);
|
|
|
+ }
|
|
|
|
|
|
- if (account.cis_limit > 0)
|
|
|
- {
|
|
|
- // 更新当前分钟的使用统计
|
|
|
- PddPoolCore.UpdateAccountUsage(account.id);
|
|
|
+ result.accountId = account.id;
|
|
|
+ result.accountName = account.name;
|
|
|
+ result.proxy_node = account.nodeName;
|
|
|
|
|
|
- lockKey = $"pdd_cis_limit_{result.accountId}";
|
|
|
- cis_num = RedisHelper.IncrBy(lockKey);
|
|
|
- if (cis_num > 1) continue;
|
|
|
+ // 更新当前日使用统计
|
|
|
+ PddPoolCore.UpdateAccountUsage(account.id);
|
|
|
|
|
|
- RedisHelper.Expire(lockKey, TimeSpan.FromMilliseconds(account.cis_limit));
|
|
|
- }
|
|
|
- break;
|
|
|
+ var plus = new PddUnionPlus(account);
|
|
|
+ result = await plus.PddParseAsync(content, request.CommerceType, result, cancellationToken);
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ if (ex.Message.Contains("was canceled"))
|
|
|
+ {
|
|
|
+ result.success = false;
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = "请求超时";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ IfExceptional = true;
|
|
|
+ _ = new LoggerLibrary("unionParse", "pdd_error")
|
|
|
+ .Info(request.Ip, request.Oaid)
|
|
|
+ .Info(content)
|
|
|
+ .Info(ex.Message, ex.StackTrace)
|
|
|
+ .SaveAsync();
|
|
|
+ NotifyCore.Notify(new NifyMessage
|
|
|
+ {
|
|
|
+ message = $"【转链异常PDD】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
|
|
|
+ priority = NifyMessagePriority.high,
|
|
|
+ tags = ["red_circle"]
|
|
|
+ });
|
|
|
+ result.success = false;
|
|
|
+ result.message = "内部错误";
|
|
|
+ result.reason = "转链接口异常";
|
|
|
}
|
|
|
+ }
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
+ return PddParseOutput(result, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK);
|
|
|
|
|
|
- if (account == null)
|
|
|
+ }
|
|
|
+ public static async Task<APIResult> GoodsPddParseAsync(UnionParseRequest request, CancellationToken cancellationToken = default)
|
|
|
+ {
|
|
|
+ var result = PddUnionPlus.GetFormattedObject(request.Content, request.Ip, request.Oaid);
|
|
|
+
|
|
|
+ string content = request.Content;
|
|
|
+ content = content.UrlDecode();
|
|
|
+ result.rawContent = content;
|
|
|
+ string goods_pattern = @"(?:goods_id=|goods_id%3D|goods_id%253D)(\d+)";
|
|
|
+ Match match = Regex.Match(content, goods_pattern);
|
|
|
+
|
|
|
+ if (match.Success)
|
|
|
+ {
|
|
|
+ string goods_id = match.Groups[1].Value; // 返回匹配的 URL
|
|
|
+ if (string.IsNullOrEmpty(content))
|
|
|
{
|
|
|
result.success = false;
|
|
|
+ result.deeplink_url = string.Empty;
|
|
|
result.message = "放弃转链";
|
|
|
- result.reason = "没有匹配账号";
|
|
|
- result.deeplink_url = PddUnionPlus.GetDeeplink(result.rawContent);
|
|
|
+ result.reason = "无效商品ID";
|
|
|
_ = TkLogCore.ParseLogAsync(result);
|
|
|
return PddParseOutput(result);
|
|
|
}
|
|
|
- if (account?.cis_limit > 0)
|
|
|
+ content = $"https://mobile.yangkeduo.com/goods.html?goods_id={goods_id}";
|
|
|
+ result.shortLinkurl = content;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ result.success = false;
|
|
|
+ result.deeplink_url = string.Empty;
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = "无效商品ID";
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
+ return PddParseOutput(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (string.IsNullOrEmpty(result.shortLinkurl))
|
|
|
+ {
|
|
|
+ result.success = false;
|
|
|
+ result.deeplink_url = string.IsNullOrEmpty(result.shortLinkurl) ? string.Empty : PddUnionPlus.GetDeeplink(result.shortLinkurl);
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = "纯口令";
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
+ return PddParseOutput(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ bool IfExceptional = false;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var config = TkConfigCore.Get();
|
|
|
+
|
|
|
+ if (!string.IsNullOrEmpty(config.pdd_blacklist_regular))
|
|
|
{
|
|
|
- lockKey = $"pdd_cis_limit_{result.accountId}";
|
|
|
- cis_num = RedisHelper.Get<int>(lockKey);
|
|
|
- if (cis_num > 1)
|
|
|
+ var blacklist = config.pdd_blacklist_regular.Split('\n')
|
|
|
+ .Where(line => !string.IsNullOrWhiteSpace(line))
|
|
|
+ .ToList();
|
|
|
+ bool anyMatch = false;
|
|
|
+ foreach (string pattern in blacklist)
|
|
|
+ {
|
|
|
+ if (Regex.IsMatch(content, pattern, RegexOptions.IgnoreCase)) anyMatch = true;
|
|
|
+ }
|
|
|
+ if (anyMatch)
|
|
|
{
|
|
|
result.success = false;
|
|
|
+ result.deeplink_url = string.IsNullOrEmpty(result.shortLinkurl) ? string.Empty : PddUnionPlus.GetDeeplink(result.shortLinkurl);
|
|
|
result.message = "放弃转链";
|
|
|
- result.reason = $"没有匹配账号{cis_num}";
|
|
|
- result.deeplink_url = PddUnionPlus.GetDeeplink(result.rawContent);
|
|
|
+ result.reason = "规则排除";
|
|
|
_ = TkLogCore.ParseLogAsync(result);
|
|
|
return PddParseOutput(result);
|
|
|
}
|
|
|
}
|
|
|
+ //============================== 放弃转链-地区过滤 ==============================
|
|
|
+ if (request.AccountId == 0 && PddUnionPlus.ShouldIgnoreRequest(config, request.Ip, request.Oaid, out string reason))
|
|
|
+ {
|
|
|
+ result.success = false;
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = reason;
|
|
|
+ result.deeplink_url = string.IsNullOrEmpty(result.shortLinkurl) ? string.Empty : PddUnionPlus.GetDeeplink(result.shortLinkurl);
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
+ return PddParseOutput(result);
|
|
|
+ }
|
|
|
+ PddPoolDTO account = null;
|
|
|
+ // 直接调用GetOne获取账号
|
|
|
+ // 新的调度策略已经在内部处理了:
|
|
|
+ // 1. 基于时间间隔的账号选择
|
|
|
+ // 2. 并发安全的账号预留(Redis SETNX)
|
|
|
+ // 3. 依次尝试多个候选账号
|
|
|
+ // 因此不需要外层重试逻辑
|
|
|
+ account = PddPoolCore.GetOne(PddUnionWorkMode.All, request.AccountId);
|
|
|
+
|
|
|
+ if (account == null)
|
|
|
+ {
|
|
|
+ result.success = false;
|
|
|
+ result.message = "放弃转链";
|
|
|
+ result.reason = "没有匹配账号";
|
|
|
+ result.deeplink_url = string.IsNullOrEmpty(result.shortLinkurl) ? string.Empty : PddUnionPlus.GetDeeplink(result.shortLinkurl);
|
|
|
+ _ = TkLogCore.ParseLogAsync(result);
|
|
|
+ return PddParseOutput(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ result.accountId = account.id;
|
|
|
+ result.accountName = account.name;
|
|
|
+ result.proxy_node = account.nodeName;
|
|
|
+
|
|
|
+ // 更新当前日使用统计
|
|
|
+ PddPoolCore.UpdateAccountUsage(account.id);
|
|
|
+
|
|
|
var plus = new PddUnionPlus(account);
|
|
|
result = await plus.PddParseAsync(content, request.CommerceType, result, cancellationToken);
|
|
|
+ if (!result.success)
|
|
|
+ {
|
|
|
+ result.deeplink_url = string.IsNullOrEmpty(result.shortLinkurl) ? string.Empty : PddUnionPlus.GetDeeplink(result.shortLinkurl);
|
|
|
+ }
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|