UnionParseCore.cs 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891
  1. using Microsoft.AspNetCore.Http;
  2. using Microsoft.AspNetCore.Mvc.Controllers;
  3. using Microsoft.AspNetCore.Mvc.Filters;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using dodohold.core;
  9. using Spire.Pdf.Exporting.XPS.Schema;
  10. using System.Xml.Linq;
  11. using System.Net;
  12. using TencentCloud.Mrs.V20200910.Models;
  13. using Microsoft.AspNetCore.Mvc;
  14. using Microsoft.AspNetCore.Authentication;
  15. using Spire.Pdf.Graphics;
  16. using Google.Protobuf.WellKnownTypes;
  17. using TencentCloud.Tcm.V20210413.Models;
  18. using System.Diagnostics;
  19. using System.Threading;
  20. using TencentCloud.Soe.V20180724.Models;
  21. namespace molilian.core
  22. {
  23. public partial class UnionParseCore
  24. {
  25. public static async Task<ActionResult> UnionParseAsync(string content, string channel, string ip, string oaid, int accountid = 0)
  26. {
  27. return channel switch
  28. {
  29. "wemeet" => await WemeetParseAsync(content, ip, oaid),
  30. "bdpan" => PanParse(content, ip, oaid),
  31. "jd" => await JdParseAsync(content, ip, oaid),
  32. "dy" => await DyParseAsync(content, ip, oaid),
  33. _ => await TaobaoParseAsync(content, ip, oaid, accountid),
  34. };
  35. }
  36. public static async Task<APIResult> WemeetParseAsync(string content, string ip, string oaid)
  37. {
  38. var result = ToolParsePlus.GetFormattedObject(TkChannelEnum.wemeet, content, ip, oaid);
  39. content = content.UrlDecode();
  40. result.rawContent = content;
  41. try
  42. {
  43. result = await ToolParsePlus.WemeetParseAsync(content, result);
  44. }
  45. catch (Exception ex)
  46. {
  47. _ = new LoggerLibrary("unionParse", "wemeet_error")
  48. .Info(ip, oaid)
  49. .Info(content)
  50. .Info(ex.Message, ex.StackTrace)
  51. .SaveAsync();
  52. NotifyCore.Notify(new NifyMessage
  53. {
  54. message = $"【转链异常Wemeet】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  55. priority = NifyMessagePriority.high,
  56. tags = ["red_circle"]
  57. });
  58. result.success = false;
  59. result.message = "内部错误";
  60. result.reason = "转链接口异常";
  61. }
  62. _ = TkLogCore.ParseLogAsync(result);
  63. return new APIResult(new
  64. {
  65. result.success,
  66. result.message,
  67. channel = result?.channel.ToString(),
  68. result.shortLinkurl,
  69. result.deeplink_url,
  70. result.itemName,
  71. });
  72. }
  73. public static APIResult PanParse(string content, string ip, string oaid)
  74. {
  75. var result = ToolParsePlus.GetFormattedObject(TkChannelEnum.bdpan, content, ip, oaid);
  76. content = content.UrlDecode();
  77. result.rawContent = content;
  78. try
  79. {
  80. ToolParsePlus.PanParse(content, ref result);
  81. }
  82. catch (Exception ex)
  83. {
  84. _ = new LoggerLibrary("unionParse", "pan_error")
  85. .Info(ip, oaid)
  86. .Info(content)
  87. .Info(ex.Message, ex.StackTrace)
  88. .SaveAsync();
  89. NotifyCore.Notify(new NifyMessage
  90. {
  91. message = $"【转链异常Pan】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  92. priority = NifyMessagePriority.high,
  93. tags = ["red_circle"]
  94. });
  95. result.success = false;
  96. result.message = "内部错误";
  97. result.reason = "转链接口异常";
  98. }
  99. _ = TkLogCore.ParseLogAsync(result);
  100. return new APIResult(new
  101. {
  102. result.success,
  103. result.message,
  104. channel = result?.channel.ToString(),
  105. result.shortLinkurl,
  106. result.deeplink_url,
  107. result.itemName,
  108. }, result.success ? APIResultCodeEnum.OK : APIResultCodeEnum.NotAcceptable);
  109. }
  110. private static APIResult TaobaoParseOutput(TkDataDTO result, Dictionary<string, long> swData, object info, APIResultCodeEnum code = APIResultCodeEnum.OK)
  111. {
  112. if (result.elapsedTime > 2000)
  113. {
  114. LoggerLibrary log = new("debug", "stopwatch");
  115. foreach ((var key, var value) in swData)
  116. {
  117. log.Info($"{key}\t{value}");
  118. }
  119. log.SaveAsync();
  120. }
  121. return new APIResult(info, code);
  122. }
  123. public static async Task<APIResult> TaobaoParseAsync(string content,
  124. string ip = "", string oaid = "",
  125. int accountid = 0)
  126. {
  127. AlimamaPlus alimama = null;
  128. content = content.UrlDecode();
  129. content = content[..Math.Min(1000, content.Length)];
  130. var result = AlimamaPlus.GetFormattedObject(content, ip, oaid);
  131. Dictionary<string, long> swData = new();
  132. swData.Add("StartNew", 0);
  133. Stopwatch stopwatch = Stopwatch.StartNew();
  134. result.rawContent = content;
  135. try
  136. {
  137. string reason = string.Empty;
  138. //============================== 放弃转链-地区过滤 ==============================
  139. bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(ip, oaid, out reason);
  140. if (is_ignore2)
  141. {
  142. result.success = false;
  143. result.message = "放弃转链";
  144. result.itemName = "点击打开淘宝APP";
  145. result.reason = reason;
  146. _ = TkLogCore.ParseLogAsync(result);
  147. return TaobaoParseOutput(result, swData, new
  148. {
  149. result.success,
  150. result.message,
  151. result.content,
  152. result.itemName,
  153. result.deeplink_url,
  154. });
  155. }
  156. //============================== 放弃转链-初步筛选 ==============================
  157. bool is_ignore = AlimamaPlus.FirstFilterIgnoreRequest(content, out reason);
  158. if (string.IsNullOrEmpty(result.shortLinkurl) && is_ignore)
  159. {
  160. //没有短链接都放弃
  161. result.success = false;
  162. result.message = "放弃转链";
  163. result.itemName = "点击打开淘宝APP";
  164. result.reason = "初步筛选";
  165. _ = TkLogCore.ParseLogAsync(result);
  166. //0621 临时增加
  167. if (content.Contains("bmlxkyy.com"))
  168. {
  169. result.itemName = "";
  170. result.deeplink_url = "";
  171. }
  172. return TaobaoParseOutput(result, swData, new
  173. {
  174. result.success,
  175. result.message,
  176. result.content,
  177. result.itemName,
  178. result.deeplink_url,
  179. });
  180. }
  181. //============================== 放弃转链-没有匹配账号 ==============================
  182. TkPoolDTO? account = accountid > 0 ?
  183. TkPoolCore.GetOne(accountid) :
  184. TkPoolCore.GetOne(TkPoolCore.TkAction.parse);
  185. if (account == null)
  186. {
  187. result.success = false;
  188. result.message = "放弃转链";
  189. result.reason = "没有匹配账号";
  190. result.itemName = "点击打开淘宝APP";
  191. _ = TkLogCore.ParseLogAsync(result);
  192. return TaobaoParseOutput(result, swData, new
  193. {
  194. result.success,
  195. result.message,
  196. result.content,
  197. result.couponAmount,
  198. result.taoToken,
  199. result.shortLinkurl,
  200. result.deeplink_url,
  201. });
  202. }
  203. result.accountId = account.id;
  204. alimama = new AlimamaPlus(account);
  205. result.accountName = account.company;
  206. int timeout = alimama._config.rt_max;
  207. using var cts = new CancellationTokenSource();
  208. cts.CancelAfter(timeout);
  209. var requestTask = Task.Run(() => alimama.UnionParse2Async(content, result, cts.Token, swData), cts.Token);
  210. var delayTask = Task.Delay(timeout, cts.Token);
  211. var completedTask = await Task.WhenAny(requestTask, delayTask);
  212. if (completedTask == requestTask)
  213. {
  214. result = await requestTask;
  215. }
  216. else
  217. {
  218. //============================== 放弃转链-请求超时 ==============================
  219. cts.Cancel();
  220. result.success = false;
  221. result.message = "放弃转链";
  222. result.reason = "请求超时";
  223. result.itemName = "点击打开淘宝APP";
  224. }
  225. result.accountName = account.company;
  226. //result = await alimama.UnionParse2Async(content, result);
  227. }
  228. catch (Exception ex)
  229. {
  230. //============================== 放弃转链-请求超时 ==============================
  231. if (ex.Message.Contains("was canceled"))
  232. {
  233. result.success = false;
  234. result.message = "放弃转链";
  235. result.reason = "请求超时";
  236. result.itemName = "点击打开淘宝APP";
  237. }
  238. else
  239. {
  240. //============================== 转链接口异常 ==============================
  241. _ = new LoggerLibrary("unionParse", "tb_error")
  242. .Info(ip, oaid)
  243. .Info(content)
  244. .Info(ex.Message, ex.StackTrace)
  245. .SaveAsync();
  246. NotifyCore.Notify(new NifyMessage
  247. {
  248. message = $"【转链异常TB】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  249. priority = NifyMessagePriority.high,
  250. tags = ["red_circle"]
  251. });
  252. result.success = false;
  253. result.message = "转链接口异常";
  254. result.itemName = "点击打开淘宝APP";
  255. }
  256. }
  257. _ = TkLogCore.ParseLogAsync(result, alimama);
  258. return TaobaoParseOutput(result, swData, new
  259. {
  260. result.success,
  261. result.message,
  262. link_type = result.link_type.ToString(),
  263. channel = result?.channel.ToString(),
  264. result.channel_type,
  265. result.itemId,
  266. result.itemName,
  267. result.pic,
  268. result.promotionPrice,
  269. result.couponAmount,
  270. result.couponEffectiveStartTime,
  271. result?.couponEffectiveEndTime,
  272. result.shortLinkurl,
  273. result.deeplink_url,
  274. result.content,
  275. result.taoToken,
  276. });
  277. }
  278. public static async Task<APIResult> TaobaoParseAsync11(string content,
  279. string ip = "", string oaid = "",
  280. int accountid = 0)
  281. {
  282. AlimamaPlus alimama = null;
  283. content = content.UrlDecode();
  284. content = content[..Math.Min(1000, content.Length)];
  285. var result = AlimamaPlus.GetFormattedObject(content, ip, oaid);
  286. Dictionary<string, long> swData = new();
  287. swData.Add("StartNew", 0);
  288. Stopwatch stopwatch = Stopwatch.StartNew();
  289. result.rawContent = content;
  290. try
  291. {
  292. bool is_other = await AlimamaPlus.OtherPlatformAsync(content);
  293. stopwatch.Stop();
  294. swData.Add("OtherPlatform", stopwatch.ElapsedMilliseconds);
  295. if (is_other)
  296. {
  297. result.success = false;
  298. result.message = "放弃转链";
  299. result.reason = "平台错误";
  300. _ = TkLogCore.ParseLogAsync(result);
  301. return TaobaoParseOutput(result, swData, new
  302. {
  303. channel = result?.channel.ToString(),
  304. result.success,
  305. result.message,
  306. result.shortLinkurl,
  307. result.deeplink_url,
  308. }, APIResultCodeEnum.NotAcceptable);
  309. }
  310. if (!string.IsNullOrEmpty(result.shortLinkurl) && result.shortLinkurl.Contains("bmlxkyy.com"))
  311. {
  312. result.success = false;
  313. result.message = "放弃转链";
  314. result.itemName = "点击打开淘宝APP";
  315. result.reason = "初步筛选";
  316. _ = TkLogCore.ParseLogAsync(result);
  317. return TaobaoParseOutput(result, swData, new
  318. {
  319. result.success,
  320. result.message,
  321. result.content,
  322. result.itemName,
  323. result.deeplink_url,
  324. });
  325. }
  326. stopwatch.Reset();
  327. stopwatch.Start();
  328. string reason = string.Empty;
  329. bool is_ignore = AlimamaPlus.FirstFilterIgnoreRequest(content, out reason);
  330. stopwatch.Stop();
  331. swData.Add("FirstFilterIgnoreRequest", stopwatch.ElapsedMilliseconds);
  332. if (string.IsNullOrEmpty(result.shortLinkurl) && is_ignore)
  333. {
  334. //没有短链接都放弃
  335. result.success = false;
  336. result.message = "放弃转链";
  337. result.itemName = "点击打开淘宝APP";
  338. result.reason = "初步筛选";
  339. _ = TkLogCore.ParseLogAsync(result);
  340. return TaobaoParseOutput(result, swData, new
  341. {
  342. result.success,
  343. result.message,
  344. result.content,
  345. result.itemName,
  346. result.deeplink_url,
  347. });
  348. }
  349. stopwatch.Reset();
  350. stopwatch.Start();
  351. bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(ip, oaid, out reason);
  352. stopwatch.Stop();
  353. swData.Add("ShouldIgnoreRequest", stopwatch.ElapsedMilliseconds);
  354. #if DEBUG
  355. #else
  356. if (is_ignore2)
  357. {
  358. result.success = false;
  359. result.message = "放弃转链";
  360. result.itemName = "点击打开淘宝APP";
  361. result.reason = reason;
  362. _ = TkLogCore.ParseLogAsync(result);
  363. return TaobaoParseOutput(result, swData, new
  364. {
  365. result.success,
  366. result.message,
  367. result.content,
  368. result.itemName,
  369. result.deeplink_url,
  370. });
  371. }
  372. #endif
  373. stopwatch.Reset();
  374. stopwatch.Start();
  375. TkPoolDTO? account = accountid > 0 ?
  376. TkPoolCore.GetOne(accountid) :
  377. TkPoolCore.GetOne(TkPoolCore.TkAction.parse);
  378. stopwatch.Stop();
  379. swData.Add("GetOne", stopwatch.ElapsedMilliseconds);
  380. if (account == null)
  381. {
  382. result.success = false;
  383. result.message = "放弃转链";
  384. result.reason = "没有匹配账号";
  385. result.itemName = "点击打开淘宝APP";
  386. _ = TkLogCore.ParseLogAsync(result);
  387. return TaobaoParseOutput(result, swData, new
  388. {
  389. result.success,
  390. result.message,
  391. result.content,
  392. result.couponAmount,
  393. result.taoToken,
  394. result.shortLinkurl,
  395. result.deeplink_url,
  396. });
  397. }
  398. result.accountId = account.id;
  399. stopwatch.Reset();
  400. stopwatch.Start();
  401. alimama = new AlimamaPlus(account);
  402. result.accountName = account.company;
  403. stopwatch.Stop();
  404. swData.Add("AlimamaPlus", stopwatch.ElapsedMilliseconds);
  405. int timeout = alimama._config.rt_max;
  406. using var cts = new CancellationTokenSource();
  407. cts.CancelAfter(timeout);
  408. stopwatch.Reset();
  409. stopwatch.Start();
  410. var requestTask = Task.Run(() => alimama.UnionParse2Async(content, result, cts.Token, swData), cts.Token);
  411. var delayTask = Task.Delay(timeout, cts.Token);
  412. var completedTask = await Task.WhenAny(requestTask, delayTask);
  413. if (completedTask == requestTask)
  414. {
  415. result = await requestTask;
  416. }
  417. else
  418. {
  419. cts.Cancel();
  420. result.success = false;
  421. result.message = "放弃转链";
  422. result.reason = "请求超时";
  423. result.itemName = "点击打开淘宝APP";
  424. }
  425. stopwatch.Stop();
  426. swData.Add("UnionParse2Async", stopwatch.ElapsedMilliseconds);
  427. result.accountName = account.company;
  428. //result = await alimama.UnionParse2Async(content, result);
  429. }
  430. catch (Exception ex)
  431. {
  432. if (ex.Message.Contains("was canceled"))
  433. {
  434. result.success = false;
  435. result.message = "放弃转链";
  436. result.reason = "请求超时";
  437. result.itemName = "点击打开淘宝APP";
  438. }
  439. else
  440. {
  441. _ = new LoggerLibrary("unionParse", "tb_error")
  442. .Info(ip, oaid)
  443. .Info(content)
  444. .Info(ex.Message, ex.StackTrace)
  445. .SaveAsync();
  446. NotifyCore.Notify(new NifyMessage
  447. {
  448. message = $"【转链异常TB】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  449. priority = NifyMessagePriority.high,
  450. tags = ["red_circle"]
  451. });
  452. result.success = false;
  453. result.message = "放弃转链";
  454. result.reason = "转链接口异常";
  455. result.itemName = "点击打开淘宝APP";
  456. }
  457. }
  458. _ = TkLogCore.ParseLogAsync(result, alimama);
  459. return TaobaoParseOutput(result, swData, new
  460. {
  461. result.success,
  462. result.message,
  463. link_type = result.link_type.ToString(),
  464. channel = result?.channel.ToString(),
  465. result.channel_type,
  466. result.itemId,
  467. result.itemName,
  468. result.pic,
  469. result.promotionPrice,
  470. result.couponAmount,
  471. result.couponEffectiveStartTime,
  472. result?.couponEffectiveEndTime,
  473. result.shortLinkurl,
  474. result.deeplink_url,
  475. result.content,
  476. result.taoToken,
  477. });
  478. }
  479. public static async Task<APIResult> TaobaoParseAsync222(string content,
  480. string ip = "", string oaid = "")
  481. {
  482. AlimamaPlus alimama = null;
  483. content = content.UrlDecode();
  484. content = content[..Math.Min(1000, content.Length)];
  485. var result = AlimamaPlus.GetFormattedObject(content, ip, oaid);
  486. LoggerLibrary log = new("debug", "stopwatch");
  487. log.Info($"StartNew", content);
  488. Stopwatch stopwatch = Stopwatch.StartNew();
  489. result.rawContent = content;
  490. try
  491. {
  492. bool is_other = await AlimamaPlus.OtherPlatformAsync(content);
  493. stopwatch.Stop();
  494. log.Info($"AlimamaPlus.OtherPlatform\t{stopwatch.ElapsedMilliseconds}");
  495. if (is_other)
  496. {
  497. result.success = false;
  498. result.message = "放弃转链";
  499. result.reason = "平台错误";
  500. _ = TkLogCore.ParseLogAsync(result);
  501. return new APIResult(new
  502. {
  503. channel = result?.channel.ToString(),
  504. result.success,
  505. result.message,
  506. result.shortLinkurl,
  507. result.deeplink_url,
  508. }, APIResultCodeEnum.NotAcceptable);
  509. }
  510. if (string.IsNullOrEmpty(result.shortLinkurl) && AlimamaPlus.FirstFilterIgnoreRequest(content, out reason))
  511. {
  512. //没有短链接都放弃
  513. result.success = false;
  514. result.message = "放弃转链";
  515. result.itemName = "点击打开淘宝APP";
  516. result.reason = "初步筛选";
  517. _ = TkLogCore.ParseLogAsync(result);
  518. return new APIResult(new
  519. {
  520. result.success,
  521. result.message,
  522. result.content,
  523. result.itemName,
  524. result.deeplink_url,
  525. });
  526. }
  527. if (AlimamaPlus.ShouldIgnoreRequest(ip, oaid, out reason))
  528. {
  529. result.success = false;
  530. result.message = "放弃转链";
  531. result.itemName = "点击打开淘宝APP";
  532. result.reason = reason;
  533. _ = TkLogCore.ParseLogAsync(result);
  534. return new APIResult(new
  535. {
  536. result.success,
  537. result.message,
  538. result.content,
  539. result.itemName,
  540. result.deeplink_url,
  541. });
  542. }
  543. var account = TkPoolCore.GetOne(TkPoolCore.TkAction.parse);
  544. if (account == null)
  545. {
  546. result.success = false;
  547. result.message = "放弃转链";
  548. result.reason = "没有匹配账号";
  549. result.itemName = "点击打开淘宝APP";
  550. _ = TkLogCore.ParseLogAsync(result);
  551. return new APIResult(new
  552. {
  553. result.success,
  554. result.message,
  555. result.content,
  556. result.couponAmount,
  557. result.taoToken,
  558. result.shortLinkurl,
  559. result.deeplink_url,
  560. });
  561. }
  562. result.accountId = account.id;
  563. alimama = new AlimamaPlus(account);
  564. int timeout = alimama._config.rt_max;
  565. using var cts = new CancellationTokenSource();
  566. cts.CancelAfter(timeout);
  567. var requestTask = Task.Run(() => alimama.UnionParse2Async(content, result, cts.Token), cts.Token);
  568. var delayTask = Task.Delay(timeout, cts.Token);
  569. var completedTask = await Task.WhenAny(requestTask, delayTask);
  570. if (completedTask == requestTask)
  571. {
  572. result = await requestTask;
  573. }
  574. else
  575. {
  576. cts.Cancel();
  577. result.success = false;
  578. result.message = "放弃转链";
  579. result.reason = "请求超时";
  580. result.itemName = "点击打开淘宝APP";
  581. }
  582. //result = await alimama.UnionParse2Async(content, result);
  583. result.accountName = account.company;
  584. }
  585. catch (Exception ex)
  586. {
  587. if (ex.Message.Contains("was canceled"))
  588. {
  589. result.success = false;
  590. result.message = "放弃转链";
  591. result.reason = "请求超时";
  592. result.itemName = "点击打开淘宝APP";
  593. }
  594. else
  595. {
  596. _ = new LoggerLibrary("unionParse", "tb_error")
  597. .Info(ip, oaid)
  598. .Info(content)
  599. .Info(ex.Message, ex.StackTrace)
  600. .SaveAsync();
  601. NotifyCore.Notify(new NifyMessage
  602. {
  603. message = $"【转链异常TB】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  604. priority = NifyMessagePriority.high,
  605. tags = ["red_circle"]
  606. });
  607. result.success = false;
  608. result.message = "放弃转链";
  609. result.reason = "转链接口异常";
  610. result.itemName = "点击打开淘宝APP";
  611. }
  612. }
  613. _ = TkLogCore.ParseLogAsync(result, alimama);
  614. return new APIResult(new
  615. {
  616. result.success,
  617. result.message,
  618. link_type = result.link_type.ToString(),
  619. channel = result?.channel.ToString(),
  620. result.channel_type,
  621. result.itemId,
  622. result.itemName,
  623. result.pic,
  624. result.promotionPrice,
  625. result.couponAmount,
  626. result.couponEffectiveStartTime,
  627. result?.couponEffectiveEndTime,
  628. result.shortLinkurl,
  629. result.deeplink_url,
  630. result.content,
  631. result.taoToken,
  632. });
  633. }
  634. //public static TkDataDTO testTaobaoParseAsync(string content, string ip = "", string oaid = "")
  635. //{
  636. // var result = AlimamaPlus.GetFormattedObject(content, ip, oaid);
  637. // content = content.UrlDecode();
  638. // content = content[..Math.Min(1000, content.Length)];
  639. // result.rawContent = content;
  640. // try
  641. // {
  642. // if (AlimamaPlus.OtherPlatform(content))
  643. // {
  644. // result.success = false;
  645. // result.message = "放弃转链";
  646. // result.reason = "平台错误";
  647. // return result;
  648. // }
  649. // string reason = string.Empty;
  650. // if (string.IsNullOrEmpty(result.shortLinkurl) && AlimamaPlus.FirstFilterIgnoreRequest(content, out reason))
  651. // {
  652. // //没有短链接都放弃
  653. // result.success = false;
  654. // result.message = "放弃转链";
  655. // result.itemName = "点击打开淘宝APP";
  656. // result.reason = "初步筛选";
  657. // return result;
  658. // }
  659. // if (AlimamaPlus.ShouldIgnoreRequest(ip, oaid, out reason))
  660. // {
  661. // result.success = false;
  662. // result.message = "放弃转链";
  663. // result.itemName = "点击打开淘宝APP";
  664. // result.reason = reason;
  665. // return result;
  666. // }
  667. // result.success = true;
  668. // return result;
  669. // }
  670. // catch (Exception ex)
  671. // {
  672. // result.success = false;
  673. // return result;
  674. // }
  675. //}
  676. public static async Task<APIResult> JdParseAsync(string content, string ip, string oaid, CancellationToken cancellationToken = default)
  677. {
  678. var result = JdUnionPlus.GetFormattedObject(content, ip, oaid);
  679. content = content.UrlDecode();
  680. result.rawContent = content;
  681. bool IfExceptional = false;
  682. try
  683. {
  684. if (JdUnionPlus.ShouldIgnoreRequest(ip, oaid, out string reason))
  685. {
  686. result.success = false;
  687. result.message = "放弃转链";
  688. result.reason = reason;
  689. _ = TkLogCore.ParseLogAsync(result);
  690. return new APIResult(result);
  691. }
  692. var account = JdPoolCore.GetOne();
  693. if (account == null)
  694. {
  695. result.success = false;
  696. result.message = "放弃转链";
  697. result.reason = "没有匹配账号";
  698. _ = TkLogCore.ParseLogAsync(result);
  699. return new APIResult(result);
  700. }
  701. result = await JdUnionPlus.JdParseAsync(account, content, result, cancellationToken);
  702. }
  703. catch (Exception ex)
  704. {
  705. if (ex.Message.Contains("was canceled"))
  706. {
  707. result.success = false;
  708. result.message = "放弃转链";
  709. result.reason = "请求超时";
  710. }
  711. else
  712. {
  713. IfExceptional = true;
  714. _ = new LoggerLibrary("unionParse", "jd_error")
  715. .Info(ip, oaid)
  716. .Info(content)
  717. .Info(ex.Message, ex.StackTrace)
  718. .SaveAsync();
  719. NotifyCore.Notify(new NifyMessage
  720. {
  721. message = $"【转链异常JD】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  722. priority = NifyMessagePriority.high,
  723. tags = ["red_circle"]
  724. });
  725. result.success = false;
  726. result.message = "内部错误";
  727. result.reason = "转链接口异常";
  728. }
  729. }
  730. _ = TkLogCore.ParseLogAsync(result);
  731. return new APIResult(new
  732. {
  733. result.success,
  734. result.message,
  735. link_type = result.link_type.ToString(),
  736. channel = result?.channel.ToString(),
  737. result.channel_type,
  738. result.itemId,
  739. result.itemName,
  740. result.shortLinkurl,
  741. result.deeplink_url,
  742. }, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK);
  743. }
  744. public static async Task<APIResult> DyParseAsync(string content, string ip, string oaid, CancellationToken cancellationToken = default)
  745. {
  746. var result = DyUnionPlus.GetFormattedObject(content, ip, oaid);
  747. content = content.UrlDecode();
  748. result.rawContent = content;
  749. bool IfExceptional = false;
  750. try
  751. {
  752. // 2024-06-19 联盟业务下线
  753. result.success = false;
  754. result.message = "放弃转链";
  755. result.reason = "联盟下线";
  756. _ = TkLogCore.ParseLogAsync(result);
  757. return new APIResult(result);
  758. if (DyUnionPlus.ShouldIgnoreRequest(ip, oaid, out string reason))
  759. {
  760. result.success = false;
  761. result.message = "放弃转链";
  762. result.reason = reason;
  763. _ = TkLogCore.ParseLogAsync(result);
  764. return new APIResult(result);
  765. }
  766. var account = PangolinPoolCore.GetOne();
  767. if (account == null)
  768. {
  769. result.success = false;
  770. result.message = "放弃转链";
  771. result.reason = "没有匹配账号";
  772. _ = TkLogCore.ParseLogAsync(result);
  773. return new APIResult(result);
  774. }
  775. result = await DyUnionPlus.DyParseAsync(account, content, result, cancellationToken);
  776. }
  777. catch (Exception ex)
  778. {
  779. if (ex.Message.Contains("was canceled"))
  780. {
  781. result.success = false;
  782. result.message = "放弃转链";
  783. result.reason = "请求超时";
  784. }
  785. else
  786. {
  787. IfExceptional = true;
  788. _ = new LoggerLibrary("unionParse", "dy_error")
  789. .Info(ip, oaid)
  790. .Info(content)
  791. .Info(ex.Message, ex.StackTrace)
  792. .SaveAsync();
  793. NotifyCore.Notify(new NifyMessage
  794. {
  795. message = $"【转链异常DY】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  796. priority = NifyMessagePriority.high,
  797. tags = ["red_circle"]
  798. });
  799. result.success = false;
  800. result.message = "内部错误";
  801. result.reason = "转链接口异常";
  802. }
  803. }
  804. _ = TkLogCore.ParseLogAsync(result);
  805. return new APIResult(new
  806. {
  807. result.success,
  808. result.message,
  809. link_type = result.link_type.ToString(),
  810. channel = result?.channel.ToString(),
  811. content = result?.rawContent.ToString(),
  812. taoToken = result?.taoToken.ToString(),
  813. result.channel_type,
  814. result.itemName,
  815. result.shortLinkurl,
  816. result.deeplink_url,
  817. }, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK);
  818. }
  819. }
  820. }