using dodohold.core; using Microsoft.AspNetCore.Mvc; using System.Diagnostics; using System.Text.RegularExpressions; namespace molilian.core { public partial class UnionParseCore { public static async Task UnionParseAsync(string content, string channel, int commerceType, string ip, string oaid, string riskStrategy, int launchScene, int accountid = 0, string clickId = "", string type = "") { content = content.Trim(); if ("dp".Equals(type)) { return channel switch { "jd" => await DeeplinkJdParseAsync(content, commerceType, ip, oaid, riskStrategy, launchScene, accountid, clickId), "pdd" => await DeeplinkPddParseAsync(content, commerceType, ip, oaid, accountid), "tb" => await DeeplinkTaobaoParseAsync(content, commerceType, ip, oaid, riskStrategy, launchScene, accountid), }; } return channel switch { "wemeet" => await WemeetParseAsync(content, ip, oaid), "bdpan" => PanParse(content, ip, oaid), "jd" => await JdParseAsync(content, commerceType, ip, oaid, riskStrategy, launchScene, accountid, clickId), "ks" => await KsParseAsync(content, commerceType, ip, oaid, accountid), "dy" => await DyParseAsync(content, commerceType, ip, oaid), "pdd" => await PddParseAsync(content, commerceType, ip, oaid, accountid), "tb" => await TaobaoParseAsync(content, commerceType, ip, oaid, riskStrategy, launchScene, accountid), _ => await DeeplinkParseCore.ParseAsync(content, channel, ip, oaid), }; } //return await DeeplinkParseCore.ParseAsync(content, channel, ip, oaid); public static async Task WemeetParseAsync(string content, string ip, string oaid) { var result = ToolParsePlus.GetFormattedObject(TkChannelEnum.wemeet, content, ip, oaid); content = content.UrlDecode(); result.rawContent = content; try { result = await ToolParsePlus.WemeetParseAsync(content, result); } catch (Exception ex) { _ = new LoggerLibrary("unionParse", "wemeet_error") .Info(ip, oaid) .Info(content) .Info(ex.Message, ex.StackTrace) .SaveAsync(); NotifyCore.Notify(new NifyMessage { message = $"【转链异常Wemeet】\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 new APIResult(new { result.success, result.message, channel = result?.channel.ToString(), result.shortLinkurl, result.deeplink_url, result.itemName, }, result.success ? APIResultCodeEnum.OK : APIResultCodeEnum.NotAcceptable); } public static APIResult PanParse(string content, string ip, string oaid) { var result = ToolParsePlus.GetFormattedObject(TkChannelEnum.bdpan, content, ip, oaid); content = content.UrlDecode(); result.rawContent = content; try { ToolParsePlus.PanParse(content, ref result); } catch (Exception ex) { _ = new LoggerLibrary("unionParse", "pan_error") .Info(ip, oaid) .Info(content) .Info(ex.Message, ex.StackTrace) .SaveAsync(); NotifyCore.Notify(new NifyMessage { message = $"【转链异常Pan】\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 new APIResult(new { result.success, result.message, channel = result?.channel.ToString(), result.shortLinkurl, result.deeplink_url, result.itemName, }, !string.IsNullOrEmpty(result.deeplink_url) ? APIResultCodeEnum.OK : APIResultCodeEnum.NotAcceptable); } private static APIResult TaobaoParseOutput(TkDataDTO result, Dictionary 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); } private static string parseDeeplinkInput(string content) { //detail.tmall.com //item.taobao.com //没有 ali_trackid 参数就转链 if (content.StartsWith("tbopen://") || content.StartsWith("tmall://")) { string url = content.GetContentPart("h5Url=", "&"); if (string.IsNullOrEmpty(url)) { url = content.GetContentPart("h5Url=", ""); } if (string.IsNullOrEmpty(url)) return content; content = url.UrlDecode(); } if (content.StartsWith("openapp.jdmobile://")) { try { string param = content.GetContentPart("params=", ""); param = param.UrlDecode(); var root = param.Convert2JsonElement(); string category = root.Read("category", string.Empty); string sourceType = root.Read("sourceType", string.Empty); string skuId = root.Read("skuId", string.Empty); switch (sourceType) { case "Item": string url_content = $"https://item.jd.com/{skuId}.html"; return url_content; } switch (category) { case "jump": string url = root.Read("url", string.Empty); string url_content = url; return url_content; } } catch (Exception ex) { } } //tmall://page.tm/appLink?h5Url=https%3A%2F%2Fdetail.tmall.com%2Fitem.htm%3Fid%3D629542722592%26share_channel%3Ddetail%26paidshareToken%3D842B5476D9A0B364D5CC650F238292E3CFB595CDC22393CD60DAD29D99CDB28859466A4E043DC620792D1206C14333CF4494C856B7CB8E4E%26sourceType%3Dother%26suid%3D8daeb0cc-87f9-44c9-b530-aa4566945452%26ut_sk%3D1.Z9jmzqkFuPsDANvbV379%252FPgp_23181017_1752503741948.Copy.tm_detailbenefitshare%26un%3Df6b7d60f206d27bb88bd3787856a60a9%26share_crt_v%3D1%26un_site%3D0%26spm%3Da2159r.13376460.0.0%26sp_tk%3DR25MWDQxc3FYTUE%253D%26cpp%3D1%26shareurl%3Dtrue%26short_name%3Dh.hRhri7E%26bxsign%3DscdGJqiqt-937BvSp8SKU1sftPqjbSV-mN9PO9uSUpCQixolsthqN0L8lXUUcfE3z7Px0CurYbiqaK7Zu4nTznXTD9SNYSFZAWkd-quYKZBNgwpfIA5kJabJs1rRFphfw19%26tk%3DGnLX41sqXMA%2520CZ321%26app%3Dchrome%26sharingreflow%3Dh5%26bc_fl_src%3Dtmapp_detail_new%26traceId%3D1101041752523106267mmWuHUrYERQCA&module=h5&action=ali.open.nav&bc_fl_src=tmapp_detail_new&splash=9455fa72420237eb&traceId=1101041752523106267mmWuHUrYERQCA //intent://m.taobao.com/tbopen/index.html?h5Url=https%3A%2F%2Fpages-fast.m.taobao.com%2Fwow%2Fz%2Fapp%2Fltao-fe%2Fxsms-ssr-yyds%2Fexternal%3Fx-ssr%3Dtrue%26x-preload%3Dtrue%26x-sec%3Dwua%26disableProgress%3Dtrue%26disableNav%3DYES%26skeleton%3Dtrue%26asac%3D2A241230082ZOWK433A270%26forceThemis%3Dtrue%26status_bar_transparent%3Dtrue%26feedsCeiling%3Dtrue%26spmb%3Dmssharereturntb_base%26itemIds%3D902307586145%26src%3Dmsdetail%26isCallApp%3D1%26slk_gid%3Dgid_er_sidebar_0&action=ali.open.nav&module=h5&bootImage=0&slk_sid=vk/8IEUpYEoCARudLiPeC+y9_1752523360882&slk_t=1752523366491&slk_gid=gid_er_sidebar_0&afcPromotionOpen=false&bc_fl_src=h5_huanduan&source=slk_intent // tbopen://m.taobao.com/tbopen/index.html?action=ali.open.nav&module=h5&h5Url=https%3A%2F%2Fdetail.m.tmall.com%2Fitem.htm%3Fid%3D838442214976%26ali_trackid%3D2%3Amm_7770555492_3286350431_116030600497%3A1752523820207_557769320_0%26union_lens%3DlensId%3AOPT%401752508785%402135dbda_1303_19809a9e462_5d67%4001%40eyJmbG9vcklkIjo3MzM2N30ie%3Brecoveryid%3A557769320_0%401752523820210%26e%3DdXNALs0LOL32LDtfC7ZWu9EHLliVjxj7pU0YSYyMuITov3hgGO6cv43ak0M1RdoZhIY4r_DZTS7AIWf4uHY1l_zk9mjzcRPpAiUi6ISdl6tIQmqgSGrWBp4zrUrX30wzt5CoaUxHdgDcvlGY0FFw4AsSCrC98Ev3WwYNKzSCQESWOsgjI-_XQgIvzXlgEI89__I9gNxCnRWuLFbjX-6pADavg52v_HkHibcVNsFgxnVy52oYpKpvhmw_NFRtQD3PDSi1wLFUrWN_6nC8CG3HZzcKOEjMTefgpXU0JQv0wvGdjkXaNLJcTxH-LDKBJRbbUD-4jMAahepVY0FqvKyrNwo5h4XpPi-KwY3mRR37mYRk2qVlYBujxeXrXDgNuUfueXX72mp250XDG_1N5hlzNg%26type%3D2%26tk_cps_param%3D7770555492%26tkFlag%3D0%26tk_cps_ut%3D2%26bxsign%3Dtbkcb7FZp7TFdkfoQXHOByuFz_a0nDGWCqDV8BNKko5E73a65lh_x913EERrie6TvaWs7hDm2suzCAC_Q7KTXaHf8L6aOHPYNkJAwvON3bQRhfCIZWwiW14-Ws9DtJvqpvgeE76f_3H9O_RCdTJRsGvBcsNfJnkHdRYGo2t4m-mMnEy0GiLAZo_ahkGsuwzoKVi //openapp.jdmobile://virtual?params=%7B%22category%22%3A%22jump%22%2C%22des%22%3A%22productDetail%22%2C%22skuId%22%3A%2210153596800839%22%2C%22sourceType%22%3A%22Item%22%2C%22sourceValue%22%3A%22view-ware%22%2C%22utm_term_m%22%3A%22654711b5a69048ed8e277944bd840205%22%2C%22M_sourceFrom%22%3A%22sxbanner%22%2C%22yinliuExt%22%3A%22exp-base___bXBhZ2VhY3RpdmVfNzY5NjJ8ZXhwLWJhc2U%22%2C%22msf_type%22%3A%22click%22%2C%22m_param%22%3A%7B%22m_source%22%3A%220%22%2C%22jda%22%3A%22181111935.17520759467211334439509.1752075947.1752523405.1752523435.4%22%2C%22usc%22%3A%22lianmeng__9__kong%22%2C%22ucp%22%3A%22t_2035161610_%22%2C%22umd%22%3A%22tuiguang%22%2C%22utr%22%3A%22654711b5a69048ed8e277944bd840205%22%2C%22jdv%22%3A%22181111935%7Clianmeng__9__kong%7Ct_2035161610_%7Ctuiguang%7C654711b5a69048ed8e277944bd840205%7C1752523436869%22%2C%22ref%22%3A%22https%3A%2F%2Fitem.m.jd.com%2Fproduct%2F10153596800839.html%3Fcu%3Dtrue%26utm_source%3Dlianmeng__9__kong%26utm_medium%3Dtuiguang%26utm_campaign%3Dt_2035161610_%26utm_term%3D654711b5a69048ed8e277944bd840205%22%2C%22psn%22%3A%2217520759467211334439509%7C4%22%2C%22psq%22%3A1%2C%22unpl%22%3A%22JF8EAK9nNSttX09RAxsCSBZATFVVW1RcHh5XbGEDXFhdGAEMHgMYExR7XlVdWRRKER9vYxRVWFNKVg4fCisSF3teVVxZCEwXBG9mNWRaWEIZRElPKxEQe1xkXlsMSBYFa28AU1tbS1QHGQceEBhPXFxuXDhMFwpfZwRUWVpPXAISAxobEkNtZF9tCXsWMy4JBVRUW05XDRhPGxQUSFxSWlUNTBEAb2cHVlhdSVwBGgorEyBI%22%2C%22pc_source%22%3A%22%22%2C%22mba_muid%22%3A%2217520759467211334439509%22%2C%22mba_sid%22%3A%2217525234051972092463856%22%2C%22std%22%3A%22MO-J2011-1%22%2C%22par%22%3A%22cu%3Dtrue%26utm_source%3Dlianmeng__9__kong%26utm_medium%3Dtuiguang%26utm_campaign%3Dt_2035161610_%26utm_term%3D654711b5a69048ed8e277944bd840205%22%2C%22event_id%22%3A%22MDownLoadFloat_ClickOpenApp%22%2C%22mt_xid%22%3A%22%22%2C%22mt_subsite%22%3A%22%22%2C%22YINLIUhuanqi%22%3A%22https%3A%2F%2Fitem.m.jd.com%2Fproduct%2F10153596800839.html%3Fcu%3Dtrue%26utm_source%3Dlianmeng__9__kong%26utm_medium%3Dtuiguang%26utm_campaign%3Dt_2035161610_%26utm_term%3D654711b5a69048ed8e277944bd840205%22%2C%22yls%22%3A%22sh_bt_%22%2C%22ylb%22%3A%22safari%22%2C%22yld%22%3A%22iphone%22%2C%22ylh%22%3A%22https%3A%2F%2Fitem.m.jd.com%2Fproduct%2F10153596800839.html%22%2C%22yle%22%3A%5B%5D%2C%22ylle%22%3A%22%22%2C%22ylo%22%3A%22ios%22%7D%2C%22SE%22%3A%7B%22mt_subsite%22%3A%22%22%2C%22__jdv%22%3A%22181111935%7Clianmeng__9__kong%7Ct_2035161610_%7Ctuiguang%7C654711b5a69048ed8e277944bd840205%7C1752523436869%22%2C%22unpl%22%3A%22JF8EAK9nNSttX09RAxsCSBZATFVVW1RcHh5XbGEDXFhdGAEMHgMYExR7XlVdWRRKER9vYxRVWFNKVg4fCisSF3teVVxZCEwXBG9mNWRaWEIZRElPKxEQe1xkXlsMSBYFa28AU1tbS1QHGQceEBhPXFxuXDhMFwpfZwRUWVpPXAISAxobEkNtZF9tCXsWMy4JBVRUW05XDRhPGxQUSFxSWlUNTBEAb2cHVlhdSVwBGgorEyBI%22%2C%22__jda%22%3A%22181111935.17520759467211334439509.1752075947.1752523405.1752523435.4%22%7D%7D return content; } public static async Task TaobaoParseAsync(string content, int commerceType, string ip = "", string oaid = "", string riskStrategy = "", int launchScene = 0, int accountid = 0) { bool other_aff = false; AlimamaPlus alimama = null; //content = content.UrlDecode(); var result = AlimamaPlus.GetFormattedObject(content, ip, oaid); result.riskStrategy = riskStrategy; result.launchScene = launchScene; result.rawContent = content; Dictionary swData = new(); swData.Add("StartNew", 0); Stopwatch stopwatch = Stopwatch.StartNew(); try { content = content[..Math.Min(1000, content.Length)]; string reason = string.Empty; var config = TkConfigCore.Get(); var arr = config.tk_whitelist_regular.Split('\n') .Where(line => !string.IsNullOrWhiteSpace(line)) .ToList(); var arr2 = config.tk_blacklist_regular.Split('\n') .Where(line => !string.IsNullOrWhiteSpace(line)) .ToList(); var arr3 = config.multi_token_regular.Split('\n') .Where(line => !string.IsNullOrWhiteSpace(line)) .ToList(); bool is_tao_url = !string.IsNullOrEmpty(result.shortLinkurl); bool is_tao_token = AlimamaPlus.MatchRegexes(content, arr); bool is_other = AlimamaPlus.MatchOtherInfo(content, arr2); //============================== 放弃转链-初步筛选1 ============================== if (!is_tao_url && !is_tao_token || is_other) { //没有链接都放弃 result.success = false; result.message = "放弃转链"; result.reason = "初步筛选1"; result.subCode = TkSubCodeEnum.Prelim1; result.itemName = ""; result.deeplink_url = string.Empty; _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } bool is_multi_token = AlimamaPlus.MatchMultiToken(content, arr3); //============================== 放弃转链-初步筛选1.5 ============================== if (is_multi_token) { //没有链接都放弃 result.success = false; result.message = "放弃转链"; result.reason = "初步筛选1.5"; result.subCode = TkSubCodeEnum.Prelim1_5; result.itemName = ""; result.deeplink_url = string.Empty; _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } //============================== 放弃转链-初步筛选2 ============================== bool is_aff_link = false; if (!string.IsNullOrEmpty(result.shortLinkurl)) is_aff_link = AlimamaPlus.IsAffLink(result.shortLinkurl); if (!is_tao_url && is_tao_token) { //淘宝口令 result.success = false; result.message = "放弃转链"; result.reason = "初步筛选2"; result.subCode = TkSubCodeEnum.Prelim2; result.itemName = "点击打开淘宝APP"; _ = TkLogCore.ParseLogAsync(result); //20241229 特例 //if ("bj".Equals(EndPointCore.CurrentEndPoint)) //{ // string ruleKey = $"tmp_rules2:tb:{DateTime.Now:yyyyMMdd}"; // var count = RedisHelper.Get(ruleKey); // var now = DateTime.Now; // if (now > new DateTime(2024, 12, 19) && now <= new DateTime(2024, 12, 22) && now.Hour >= 7 && count < 1000) // { // result.deeplink_url = "tbopen://m.taobao.com/tbopen/index.html?source=auto&action=ali.open.nav&module=h5&bootImage=0&afc_route=1&bc_fl_src=growth_dhh_2200803434968_100-1930985-1595034112&dpa_Inid=159503411212096&dpa_material_id=530637422585&dpa_material_type=1&dpa_source_code=12096&force_no_smb=true&h5Url=https%3A%2F%2Fs.m.taobao.com%2Fh5%3Ffrom%3Dcustoms%26g_channelSrp%3Ddhhdpa_1232552832%26dpa_material_type%3D1%26ut_sk%3Dsearch%26spm%3Da2141.mb819t211c7%26sLaunch%3D0%26sKeep%3D1%26sModuleName%3Dsearch%26spm_back_up%3Da2141.mb819t211c7%26bc_fl_src%3Dgrowth_dhh_2200803434968_100-1930985-1595034112%26dpa_Inid%3D159503411212096%26dpa_material_id%3D530637422585%26dpa_material_type%3D1%26dpa_source_code%3D12096%26force_no_smb%3Dtrue%26itemIds%3D530637422585%26slk_actid%3D100000000207%26spm%3D2014.ugdhh.2200803434968.100-1930985-1595034112%26wh_biz%3Dtm&itemIds=530637422585&slk_actid=100000000207&spm=2014.ugdhh.2200803434968.100-1930985-1595034112&wh_biz=tm"; // RedisHelper.IncrBy(ruleKey); // RedisHelper.Expire(ruleKey, 86400 * 1); // } //} other_aff = true; return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } if ((!is_tao_url && is_tao_token) || is_aff_link) { //没有短链接都放弃 result.success = false; result.message = "放弃转链"; result.reason = "初步筛选2"; result.subCode = TkSubCodeEnum.Prelim2; result.itemName = "点击打开淘宝APP"; _ = TkLogCore.ParseLogAsync(result); //20241229 特例 //if ("bj".Equals(EndPointCore.CurrentEndPoint)) //{ // string ruleKey = $"tmp_rules2:tb:{DateTime.Now:yyyyMMdd}"; // var count = RedisHelper.Get(ruleKey); // var now = DateTime.Now; // if (now > new DateTime(2024, 12, 19) && now <= new DateTime(2024, 12, 22) && now.Hour >= 7 && count < 1000) // { // result.deeplink_url = "tbopen://m.taobao.com/tbopen/index.html?source=auto&action=ali.open.nav&module=h5&bootImage=0&afc_route=1&bc_fl_src=growth_dhh_2200803434968_100-1930985-1595034112&dpa_Inid=159503411212096&dpa_material_id=530637422585&dpa_material_type=1&dpa_source_code=12096&force_no_smb=true&h5Url=https%3A%2F%2Fs.m.taobao.com%2Fh5%3Ffrom%3Dcustoms%26g_channelSrp%3Ddhhdpa_1232552832%26dpa_material_type%3D1%26ut_sk%3Dsearch%26spm%3Da2141.mb819t211c7%26sLaunch%3D0%26sKeep%3D1%26sModuleName%3Dsearch%26spm_back_up%3Da2141.mb819t211c7%26bc_fl_src%3Dgrowth_dhh_2200803434968_100-1930985-1595034112%26dpa_Inid%3D159503411212096%26dpa_material_id%3D530637422585%26dpa_material_type%3D1%26dpa_source_code%3D12096%26force_no_smb%3Dtrue%26itemIds%3D530637422585%26slk_actid%3D100000000207%26spm%3D2014.ugdhh.2200803434968.100-1930985-1595034112%26wh_biz%3Dtm&itemIds=530637422585&slk_actid=100000000207&spm=2014.ugdhh.2200803434968.100-1930985-1595034112&wh_biz=tm"; // RedisHelper.IncrBy(ruleKey); // RedisHelper.Expire(ruleKey, 86400 * 1); // } //} other_aff = true; return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } //那就初步筛选3 有tb.cn 并且有 or 手淘发现 string pattern = @"^(?!【淘宝】).*https?:\/\/m\.tb\.cn.*(?:手淘发现|手淘搜索)"; bool isMatch = Regex.IsMatch(content, pattern); if (isMatch) { result.success = false; result.message = "放弃转链"; result.reason = "初步筛选3"; result.subCode = TkSubCodeEnum.Prelim3; result.itemName = "点击打开淘宝APP"; _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } //============================== 放弃转链-地区过滤 ============================== bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(ip, oaid, riskStrategy, launchScene, out reason); if (is_ignore2) { result.success = false; result.message = "放弃转链"; result.itemName = "点击打开淘宝APP"; result.reason = reason; result.subCode = TkSubCodeEnum.TrafficCtrl; _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } (bool isTaobaoUrl, string url) = AlimamaPlus.IsTaobaoUrl(content); //============================== 放弃转链-没有匹配账号 ============================== TkPoolDTO? account = accountid > 0 ? await TkPoolCore.GetOneAsync(accountid) : await TkPoolCore.GetOneAsync(TkPoolCore.TkAction.parse, isTaobaoUrl, riskStrategy, launchScene); if (account == null) { result.success = false; result.message = "放弃转链"; result.reason = "没有匹配账号"; result.subCode = TkSubCodeEnum.Other; result.itemName = "点击打开淘宝APP"; _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.couponAmount, result.taoToken, result.shortLinkurl, other_aff, result.deeplink_url, }); } result.accountId = account.id; result.accountName = account.company; alimama = new AlimamaPlus(account); int timeout = alimama._config.rt_max; #if DEBUG timeout = 10000; #endif using var cts = new CancellationTokenSource(); cts.CancelAfter(timeout); var requestTask = Task.Run(() => alimama.UnionParseAsync(ip, oaid, content, commerceType, result, isTaobaoUrl, riskStrategy, launchScene, cts.Token, swData), 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.subCode = TkSubCodeEnum.Other; result.itemName = "点击打开淘宝APP"; } result.accountName = account.company; //result = await alimama.UnionParse2Async(content, result); } catch (Exception ex) { //============================== 放弃转链-请求超时 ============================== if (ex.Message.Contains("was canceled")) { result.success = false; result.message = "放弃转链"; result.reason = "请求超时"; result.subCode = TkSubCodeEnum.Other; 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.subCode = TkSubCodeEnum.Other; result.message = "转链接口异常"; result.itemName = "点击打开淘宝APP"; } } _ = TkLogCore.ParseLogAsync(result, alimama); switch (result.reason) { case "其他推广链接": //case "排除淘口令": case "纯口令 没链接": other_aff = true; break; } return TaobaoParseOutput(result, swData, new { result.success, result.commercial, 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.riskStrategy, result.launchScene, result.content, result.taoToken, other_aff, }); } public static async Task DeeplinkTaobaoParseAsync(string content, int commerceType, string ip = "", string oaid = "", string riskStrategy = "", int launchScene = 0, int accountid = 0) { bool other_aff = false; AlimamaPlus alimama = null; var result = AlimamaPlus.GetFormattedObject(content, ip, oaid); result.riskStrategy = riskStrategy; result.launchScene = launchScene; result.rawContent = content; result.parse_type = "dp"; Dictionary swData = new(); swData.Add("StartNew", 0); Stopwatch stopwatch = Stopwatch.StartNew(); try { string url_content = parseDeeplinkInput(content); if (url_content.Contains("ali_trackid=")) { //============================== 其他推广链接 ============================== result.channel = TkChannelEnum.tb; result.channel_type = ChannelTypeEnum.tb; result.link_type = LinkTypeEnum.other_aff; result.success = false; result.message = "放弃转链"; result.reason = "其他推广链接"; result.subCode = TkSubCodeEnum.OtherPromo; result.accountName = string.Empty; result.content = content; result.deeplink_url = string.Empty; _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff = true, result.deeplink_url, }); } (bool isTaobaUrl, string shortLinkurl) = AlimamaPlus.IsTaobaoUrl(url_content); if (!isTaobaUrl) { result.success = false; result.channel = TkChannelEnum.tb; result.link_type = LinkTypeEnum.unknown; result.success = false; result.message = "放弃转链"; result.reason = "无效商品id"; if (!result.success) { result.deeplink_url = string.Empty; } _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } result.shortLinkurl = shortLinkurl; result.deeplink_url = content; result.content = shortLinkurl; content = shortLinkurl; string reason = string.Empty; var config = TkConfigCore.Get(); var arr = config.tk_whitelist_regular.Split('\n') .Where(line => !string.IsNullOrWhiteSpace(line)) .ToList(); var arr2 = config.tk_blacklist_regular.Split('\n') .Where(line => !string.IsNullOrWhiteSpace(line)) .ToList(); var arr3 = config.multi_token_regular.Split('\n') .Where(line => !string.IsNullOrWhiteSpace(line)) .ToList(); bool is_tao_url = !string.IsNullOrEmpty(result.shortLinkurl); bool is_tao_token = AlimamaPlus.MatchRegexes(content, arr); bool is_other = AlimamaPlus.MatchOtherInfo(content, arr2); //============================== 放弃转链-初步筛选1 ============================== if (!is_tao_url && !is_tao_token || is_other) { //没有链接都放弃 result.success = false; result.message = "放弃转链"; result.reason = "初步筛选1"; result.subCode = TkSubCodeEnum.Prelim1; result.itemName = ""; result.deeplink_url = string.Empty; _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } bool is_multi_token = AlimamaPlus.MatchMultiToken(content, arr3); //============================== 放弃转链-初步筛选1.5 ============================== if (is_multi_token) { //没有链接都放弃 result.success = false; result.message = "放弃转链"; result.reason = "初步筛选1.5"; result.subCode = TkSubCodeEnum.Prelim1_5; result.itemName = ""; result.deeplink_url = string.Empty; _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } //============================== 放弃转链-初步筛选2 ============================== bool is_aff_link = false; if (!string.IsNullOrEmpty(result.shortLinkurl)) is_aff_link = AlimamaPlus.IsAffLink(result.shortLinkurl); if (!is_tao_url && is_tao_token) { //淘宝口令 result.success = false; result.message = "放弃转链"; result.reason = "初步筛选2"; result.subCode = TkSubCodeEnum.Prelim2; result.itemName = "点击打开淘宝APP"; if (!result.success) { result.deeplink_url = string.Empty; } _ = TkLogCore.ParseLogAsync(result); //20241229 特例 //if ("bj".Equals(EndPointCore.CurrentEndPoint)) //{ // string ruleKey = $"tmp_rules2:tb:{DateTime.Now:yyyyMMdd}"; // var count = RedisHelper.Get(ruleKey); // var now = DateTime.Now; // if (now > new DateTime(2024, 12, 19) && now <= new DateTime(2024, 12, 22) && now.Hour >= 7 && count < 1000) // { // result.deeplink_url = "tbopen://m.taobao.com/tbopen/index.html?source=auto&action=ali.open.nav&module=h5&bootImage=0&afc_route=1&bc_fl_src=growth_dhh_2200803434968_100-1930985-1595034112&dpa_Inid=159503411212096&dpa_material_id=530637422585&dpa_material_type=1&dpa_source_code=12096&force_no_smb=true&h5Url=https%3A%2F%2Fs.m.taobao.com%2Fh5%3Ffrom%3Dcustoms%26g_channelSrp%3Ddhhdpa_1232552832%26dpa_material_type%3D1%26ut_sk%3Dsearch%26spm%3Da2141.mb819t211c7%26sLaunch%3D0%26sKeep%3D1%26sModuleName%3Dsearch%26spm_back_up%3Da2141.mb819t211c7%26bc_fl_src%3Dgrowth_dhh_2200803434968_100-1930985-1595034112%26dpa_Inid%3D159503411212096%26dpa_material_id%3D530637422585%26dpa_material_type%3D1%26dpa_source_code%3D12096%26force_no_smb%3Dtrue%26itemIds%3D530637422585%26slk_actid%3D100000000207%26spm%3D2014.ugdhh.2200803434968.100-1930985-1595034112%26wh_biz%3Dtm&itemIds=530637422585&slk_actid=100000000207&spm=2014.ugdhh.2200803434968.100-1930985-1595034112&wh_biz=tm"; // RedisHelper.IncrBy(ruleKey); // RedisHelper.Expire(ruleKey, 86400 * 1); // } //} other_aff = true; return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } if ((!is_tao_url && is_tao_token) || is_aff_link) { //没有短链接都放弃 result.success = false; result.message = "放弃转链"; result.reason = "初步筛选2"; result.subCode = TkSubCodeEnum.Prelim2; result.itemName = "点击打开淘宝APP"; if (!result.success) { result.deeplink_url = string.Empty; } _ = TkLogCore.ParseLogAsync(result); //20241229 特例 //if ("bj".Equals(EndPointCore.CurrentEndPoint)) //{ // string ruleKey = $"tmp_rules2:tb:{DateTime.Now:yyyyMMdd}"; // var count = RedisHelper.Get(ruleKey); // var now = DateTime.Now; // if (now > new DateTime(2024, 12, 19) && now <= new DateTime(2024, 12, 22) && now.Hour >= 7 && count < 1000) // { // result.deeplink_url = "tbopen://m.taobao.com/tbopen/index.html?source=auto&action=ali.open.nav&module=h5&bootImage=0&afc_route=1&bc_fl_src=growth_dhh_2200803434968_100-1930985-1595034112&dpa_Inid=159503411212096&dpa_material_id=530637422585&dpa_material_type=1&dpa_source_code=12096&force_no_smb=true&h5Url=https%3A%2F%2Fs.m.taobao.com%2Fh5%3Ffrom%3Dcustoms%26g_channelSrp%3Ddhhdpa_1232552832%26dpa_material_type%3D1%26ut_sk%3Dsearch%26spm%3Da2141.mb819t211c7%26sLaunch%3D0%26sKeep%3D1%26sModuleName%3Dsearch%26spm_back_up%3Da2141.mb819t211c7%26bc_fl_src%3Dgrowth_dhh_2200803434968_100-1930985-1595034112%26dpa_Inid%3D159503411212096%26dpa_material_id%3D530637422585%26dpa_material_type%3D1%26dpa_source_code%3D12096%26force_no_smb%3Dtrue%26itemIds%3D530637422585%26slk_actid%3D100000000207%26spm%3D2014.ugdhh.2200803434968.100-1930985-1595034112%26wh_biz%3Dtm&itemIds=530637422585&slk_actid=100000000207&spm=2014.ugdhh.2200803434968.100-1930985-1595034112&wh_biz=tm"; // RedisHelper.IncrBy(ruleKey); // RedisHelper.Expire(ruleKey, 86400 * 1); // } //} other_aff = true; return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } //那就初步筛选3 有tb.cn 并且有 or 手淘发现 string pattern = @"^(?!【淘宝】).*https?:\/\/m\.tb\.cn.*(?:手淘发现|手淘搜索)"; bool isMatch = Regex.IsMatch(content, pattern); if (isMatch) { result.success = false; result.message = "放弃转链"; result.reason = "初步筛选3"; result.subCode = TkSubCodeEnum.Prelim3; result.itemName = "点击打开淘宝APP"; if (!result.success) { result.deeplink_url = string.Empty; } _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } //============================== 放弃转链-地区过滤 ============================== bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(ip, oaid, riskStrategy, launchScene, out reason); if (is_ignore2) { result.success = false; result.message = "放弃转链"; result.itemName = "点击打开淘宝APP"; result.reason = reason; result.subCode = TkSubCodeEnum.TrafficCtrl; if (!result.success) { result.deeplink_url = string.Empty; } _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.itemName, other_aff, result.deeplink_url, }); } (bool isTaobaoUrl, string url) = AlimamaPlus.IsTaobaoUrl(content); //============================== 放弃转链-没有匹配账号 ============================== TkPoolDTO? account = accountid > 0 ? await TkPoolCore.GetOneAsync(accountid) : await TkPoolCore.GetOneAsync(TkPoolCore.TkAction.parse, isTaobaoUrl, riskStrategy, launchScene, "dp"); if (account == null) { result.success = false; result.message = "放弃转链"; result.reason = "没有匹配账号"; result.subCode = TkSubCodeEnum.Other; result.itemName = "点击打开淘宝APP"; if (!result.success) { result.deeplink_url = string.Empty; } _ = TkLogCore.ParseLogAsync(result); return TaobaoParseOutput(result, swData, new { result.success, result.commercial, result.message, result.content, result.couponAmount, result.taoToken, result.shortLinkurl, other_aff, result.deeplink_url, }); } result.accountId = account.id; result.accountName = account.company; alimama = new AlimamaPlus(account); int timeout = alimama._config.rt_max; #if DEBUG timeout = 10000; #endif using var cts = new CancellationTokenSource(); cts.CancelAfter(timeout); var requestTask = Task.Run(() => alimama.UnionParseAsync(ip, oaid, content, commerceType, result, isTaobaoUrl, riskStrategy, launchScene, cts.Token, swData), 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.subCode = TkSubCodeEnum.Other; result.itemName = "点击打开淘宝APP"; } result.accountName = account.company; //result = await alimama.UnionParse2Async(content, result); } catch (Exception ex) { //============================== 放弃转链-请求超时 ============================== if (ex.Message.Contains("was canceled")) { result.success = false; result.message = "放弃转链"; result.reason = "请求超时"; result.subCode = TkSubCodeEnum.Other; 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.subCode = TkSubCodeEnum.Other; result.message = "转链接口异常"; result.itemName = "点击打开淘宝APP"; } } if (!result.success) { result.deeplink_url = string.Empty; } _ = TkLogCore.ParseLogAsync(result, alimama); switch (result.reason) { case "其他推广链接": //case "排除淘口令": case "纯口令 没链接": other_aff = true; break; } return TaobaoParseOutput(result, swData, new { result.success, result.commercial, 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.riskStrategy, result.launchScene, result.content, result.taoToken, other_aff, }); } private static APIResult JdParseOutput(JdDataDTO result, APIResultCodeEnum code = APIResultCodeEnum.OK) { return new APIResult(new { result.success, result.commercial, result.message, link_type = result.link_type.ToString(), channel = result?.channel.ToString(), result.channel_type, result.itemId, result.itemName, result.shortLinkurl, result.deeplink_url, result.riskStrategy, result.launchScene, }, code); } public static async Task JdParseAsync(string content, int commerceType, string ip, string oaid, string riskStrategy = "", int launchScene = 0, int accountid = 0, string clickId = "", CancellationToken cancellationToken = default) { var config = TkConfigCore.Get(); var result = JdUnionPlus.GetFormattedObject(content, ip, oaid, clickId); result.rawContent = content; result.riskStrategy = riskStrategy; result.launchScene = launchScene; bool IfExceptional = false; try { content = content.UrlDecode(); 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.Empty; result.message = "放弃转链"; result.reason = "规则排除"; _ = TkLogCore.ParseLogAsync(result); return JdParseOutput(result); } } string out_url = null; string itemId = null; //============================== 放弃转链-地区过滤 ============================== if (!TestParseCore.InWhitelist(result.ip, result.oaid) && accountid == 0 && JdUnionPlus.ShouldIgnoreRequest(config, ip, oaid, riskStrategy, 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(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); return JdParseOutput(result); } // bool is_ignore2 = JdUnionPlus.FlowControlIgnoreRequest(config, out reason); //#if DEBUG // is_ignore2 = false; //#endif // if (accountid == 0 && is_ignore2) // { // result.success = false; // result.message = "放弃转链"; // result.reason = reason; // _ = TkLogCore.ParseLogAsync(result); // return JdParseOutput(result); // } result.shortLinkurl = JdUnionPlus.GetLink(content); result.content = result.shortLinkurl; result.link_type = JdUnionPlus.GetLinkType(result.shortLinkurl, out out_url, out itemId); bool is_numeric = result.shortLinkurl.Contains(itemId); var account = accountid > 0 ? await JdPoolCore.GetOneAsync(accountid, JdPoolCore.JdAction.parse) : await JdPoolCore.GetOneAsync(JdPoolCore.JdAction.parse, riskStrategy, launchScene, is_numeric); 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); return JdParseOutput(result); } result.accountId = account.id; result.accountName = account.name; var plus = new JdUnionPlus(account); result = await plus.JdParseAsync(content, commerceType, 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(ip, 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), }; } _ = TkLogCore.ParseLogAsync(result); return JdParseOutput(result, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK); } public static async Task DeeplinkJdParseAsync(string content, int commerceType, string ip, string oaid, string riskStrategy = "", int launchScene = 0, int accountid = 0, string clickId = "", CancellationToken cancellationToken = default) { var config = TkConfigCore.Get(); var result = JdUnionPlus.GetFormattedObject(content, ip, oaid, clickId); result.rawContent = content; result.parse_type = "dp"; result.riskStrategy = riskStrategy; result.launchScene = launchScene; bool IfExceptional = false; try { string url_content = parseDeeplinkInput(content); string utm_campaign = url_content.GetContentPart("utm_campaign=", "&"); string utm_term = url_content.GetContentPart("utm_term=", "&"); if (!string.IsNullOrEmpty(utm_campaign) || !string.IsNullOrEmpty(utm_term)) { //============================== 其他推广链接 ============================== result.channel = TkChannelEnum.jd; result.channel_type = ChannelTypeEnum.jd; result.link_type = LinkTypeEnum.other_aff; result.success = false; result.message = "放弃转链"; result.reason = "其他推广链接"; result.accountName = string.Empty; result.content = content; result.deeplink_url = string.Empty; _ = TkLogCore.ParseLogAsync(result); return JdParseOutput(result); } ///utm_campaign=t_2034983365_&utm_term=638b93ffc5174cc1a01a6471c56913d5 这俩带1个都不转。 /// result.shortLinkurl = url_content; result.content = url_content; result.deeplink_url = content; content = url_content; 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.Empty; result.message = "放弃转链"; result.reason = "规则排除"; _ = TkLogCore.ParseLogAsync(result); return JdParseOutput(result); } } string out_url = null; string itemId = null; //============================== 放弃转链-地区过滤 ============================== if (!TestParseCore.InWhitelist(result.ip, result.oaid) && accountid == 0 && JdUnionPlus.ShouldIgnoreRequest(config, ip, oaid, riskStrategy, 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), }; result.success = false; result.message = "放弃转链"; result.reason = reason; if (!result.success) { result.deeplink_url = string.Empty; } _ = TkLogCore.ParseLogAsync(result); return JdParseOutput(result); } result.shortLinkurl = JdUnionPlus.GetLink(content); result.content = result.shortLinkurl; result.link_type = JdUnionPlus.GetLinkType(result.shortLinkurl, out out_url, out itemId); bool is_numeric = result.shortLinkurl.Contains(itemId); var account = accountid > 0 ? await JdPoolCore.GetOneAsync(accountid, JdPoolCore.JdAction.parse) : await JdPoolCore.GetOneAsync(JdPoolCore.JdAction.parse, riskStrategy, launchScene, is_numeric,"dp"); 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), }; if (!result.success) { result.deeplink_url = string.Empty; } _ = TkLogCore.ParseLogAsync(result); return JdParseOutput(result); } result.accountId = account.id; result.accountName = account.name; var plus = new JdUnionPlus(account); result = await plus.JdParseAsync(content, commerceType, 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(ip, 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.Empty; } _ = TkLogCore.ParseLogAsync(result); return JdParseOutput(result, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK); } public static async Task DyParseAsync(string content, int commerceType, string ip, string oaid, CancellationToken cancellationToken = default) { var result = DyUnionPlus.GetFormattedObject(content, ip, oaid); content = content.UrlDecode(); result.rawContent = content; bool IfExceptional = false; try { #if DEBUG #else // 2024-06-19 联盟业务下线 result.success = false; result.message = "放弃转链"; result.reason = "联盟下线"; _ = TkLogCore.ParseLogAsync(result); return new APIResult(result); #endif if (DyUnionPlus.ShouldIgnoreRequest(ip, oaid, out string reason)) { result.success = false; result.message = "放弃转链"; result.reason = reason; _ = TkLogCore.ParseLogAsync(result); return new APIResult(result); } var account = PangolinPoolCore.GetOne(); if (account == null) { result.success = false; result.message = "放弃转链"; result.reason = "没有匹配账号"; _ = TkLogCore.ParseLogAsync(result); return new APIResult(result); } result = await DyUnionPlus.DyParseAsync(account, content, 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", "dy_error") .Info(ip, oaid) .Info(content) .Info(ex.Message, ex.StackTrace) .SaveAsync(); NotifyCore.Notify(new NifyMessage { message = $"【转链异常DY】\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 new APIResult(new { result.success, result.message, link_type = result.link_type.ToString(), channel = result?.channel.ToString(), content = result?.rawContent.ToString(), taoToken = result?.taoToken.ToString(), result.channel_type, result.itemName, result.shortLinkurl, result.deeplink_url, }, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK); } public static async Task PddParseAsync(string content, int commerceType, string ip, string oaid, int accountid = 0, CancellationToken cancellationToken = default) { var result = PddUnionPlus.GetFormattedObject(content, ip, oaid); content = content.UrlDecode(); result.rawContent = content; bool IfExceptional = false; try { var config = TkConfigCore.Get(); if (!string.IsNullOrEmpty(config.pdd_blacklist_regular)) { 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.Empty; result.message = "放弃转链"; result.reason = "规则排除"; _ = TkLogCore.ParseLogAsync(result); return PddParseOutput(result); } } //============================== 放弃转链-地区过滤 ============================== if (accountid == 0 && PddUnionPlus.ShouldIgnoreRequest(config, ip, oaid, out string reason)) { result.success = false; result.message = "放弃转链"; result.reason = reason; result.deeplink_url = PddUnionPlus.GetDeeplink(result.rawContent); _ = TkLogCore.ParseLogAsync(result); return PddParseOutput(result); } var account = PddPoolCore.GetOne(PddUnionWorkMode.All, accountid); 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; var plus = new PddUnionPlus(account); result = await plus.PddParseAsync(content, 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(ip, 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); } public static async Task DeeplinkPddParseAsync(string content, int commerceType, string ip, string oaid, int accountid = 0, CancellationToken cancellationToken = default) { var result = PddUnionPlus.GetFormattedObject(content, ip, oaid); content = content.UrlDecode(); result.rawContent = content; result.parse_type = "dp"; bool IfExceptional = false; try { var config = TkConfigCore.Get(); if (!string.IsNullOrEmpty(config.pdd_blacklist_regular)) { 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.Empty; result.message = "放弃转链"; result.reason = "规则排除"; _ = TkLogCore.ParseLogAsync(result); return PddParseOutput(result); } } //============================== 放弃转链-地区过滤 ============================== if (accountid == 0 && PddUnionPlus.ShouldIgnoreRequest(config, ip, oaid, out string reason)) { result.success = false; result.message = "放弃转链"; result.reason = reason; result.deeplink_url = PddUnionPlus.GetDeeplink(result.rawContent); _ = TkLogCore.ParseLogAsync(result); return PddParseOutput(result); } var account = PddPoolCore.GetOne(PddUnionWorkMode.All, accountid, "dp"); 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; var plus = new PddUnionPlus(account); result = await plus.PddParseAsync(content, 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(ip, 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); } private static APIResult PddParseOutput(PddDataDTO result, APIResultCodeEnum code = APIResultCodeEnum.OK) { return new APIResult(new { result.success, result.message, link_type = result.link_type.ToString(), channel = result?.channel.ToString(), result.itemId, result.itemName, result.shortLinkurl, result.deeplink_url, }, code); } public static async Task KsParseAsync(string content, int commerceType, string ip, string oaid, int accountid = 0, CancellationToken cancellationToken = default) { var result = KsUnionPlus.GetFormattedObject(content, ip, oaid); content = content.UrlDecode(); result.rawContent = content; bool IfExceptional = false; try { var config = TkConfigCore.Get(); if (!string.IsNullOrEmpty(config.ks_blacklist_regular)) { var blacklist = config.ks_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.Empty; result.message = "放弃转链"; result.reason = "规则排除"; _ = TkLogCore.ParseLogAsync(result); return KsParseOutput(result); } } //============================== 放弃转链-地区过滤 ============================== if (accountid == 0 && KsUnionPlus.ShouldIgnoreRequest(config, ip, oaid, out string reason)) { result.success = false; result.message = "放弃转链"; result.reason = reason; result.deeplink_url = KsUnionPlus.GetDeeplink(string.Empty, LinkTypeEnum.baseDomain); _ = TkLogCore.ParseLogAsync(result); return KsParseOutput(result); } var account = accountid > 0 ? KsPoolCore.GetOne(accountid, KsPoolCore.KsAction.parse) : KsPoolCore.GetOne(KsPoolCore.KsAction.parse); if (account == null) { result.success = false; result.message = "放弃转链"; result.reason = "没有匹配账号"; result.deeplink_url = KsUnionPlus.GetDeeplink(string.Empty, LinkTypeEnum.baseDomain); _ = TkLogCore.ParseLogAsync(result); return KsParseOutput(result); } result.accountId = account.id; result.accountName = account.name; var plus = new KsUnionPlus(account); result = await plus.KsParseAsync(content, 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", "jd_error") .Info(ip, 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 = KsUnionPlus.GetDeeplink(string.Empty, LinkTypeEnum.baseDomain); } _ = TkLogCore.ParseLogAsync(result); return KsParseOutput(result, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK); } private static APIResult KsParseOutput(KsDataDTO result, APIResultCodeEnum code = APIResultCodeEnum.OK) { return new APIResult(new { result.success, result.message, link_type = result.link_type.ToString(), channel = result?.channel.ToString(), result.itemId, result.itemName, result.shortLinkurl, result.deeplink_url, }, code); } } }