UnionParseCore.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  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. bool is_other = await AlimamaPlus.OtherPlatformAsync(content);
  138. stopwatch.Stop();
  139. swData.Add("OtherPlatform", stopwatch.ElapsedMilliseconds);
  140. if (is_other)
  141. {
  142. result.success = false;
  143. result.message = "放弃转链";
  144. result.reason = "平台错误";
  145. _ = TkLogCore.ParseLogAsync(result);
  146. return TaobaoParseOutput(result, swData, new
  147. {
  148. channel = result?.channel.ToString(),
  149. result.success,
  150. result.message,
  151. result.shortLinkurl,
  152. result.deeplink_url,
  153. }, APIResultCodeEnum.NotAcceptable);
  154. }
  155. stopwatch.Reset();
  156. stopwatch.Start();
  157. string reason = string.Empty;
  158. bool is_ignore = AlimamaPlus.FirstFilterIgnoreRequest(content, out reason);
  159. stopwatch.Stop();
  160. swData.Add("FirstFilterIgnoreRequest", stopwatch.ElapsedMilliseconds);
  161. if (string.IsNullOrEmpty(result.shortLinkurl) && is_ignore)
  162. {
  163. //没有短链接都放弃
  164. result.success = false;
  165. result.message = "放弃转链";
  166. result.itemName = "点击打开淘宝APP";
  167. result.reason = "初步筛选";
  168. _ = TkLogCore.ParseLogAsync(result);
  169. return TaobaoParseOutput(result, swData, new
  170. {
  171. result.success,
  172. result.message,
  173. result.content,
  174. result.itemName,
  175. result.deeplink_url,
  176. });
  177. }
  178. stopwatch.Reset();
  179. stopwatch.Start();
  180. bool is_ignore2 = AlimamaPlus.ShouldIgnoreRequest(ip, oaid, out reason);
  181. stopwatch.Stop();
  182. swData.Add("ShouldIgnoreRequest", stopwatch.ElapsedMilliseconds);
  183. #if DEBUG
  184. #else
  185. if (is_ignore2)
  186. {
  187. result.success = false;
  188. result.message = "放弃转链";
  189. result.itemName = "点击打开淘宝APP";
  190. result.reason = reason;
  191. _ = TkLogCore.ParseLogAsync(result);
  192. return TaobaoParseOutput(result, swData, new
  193. {
  194. result.success,
  195. result.message,
  196. result.content,
  197. result.itemName,
  198. result.deeplink_url,
  199. });
  200. }
  201. #endif
  202. stopwatch.Reset();
  203. stopwatch.Start();
  204. TkPoolDTO? account = accountid > 0 ?
  205. TkPoolCore.GetOne(accountid) :
  206. TkPoolCore.GetOne(TkPoolCore.TkAction.parse);
  207. stopwatch.Stop();
  208. swData.Add("GetOne", stopwatch.ElapsedMilliseconds);
  209. if (account == null)
  210. {
  211. result.success = false;
  212. result.message = "放弃转链";
  213. result.reason = "没有匹配账号";
  214. result.itemName = "点击打开淘宝APP";
  215. _ = TkLogCore.ParseLogAsync(result);
  216. return TaobaoParseOutput(result, swData, new
  217. {
  218. result.success,
  219. result.message,
  220. result.content,
  221. result.couponAmount,
  222. result.taoToken,
  223. result.shortLinkurl,
  224. result.deeplink_url,
  225. });
  226. }
  227. result.accountId = account.id;
  228. stopwatch.Reset();
  229. stopwatch.Start();
  230. alimama = new AlimamaPlus(account);
  231. result.accountName = account.company;
  232. stopwatch.Stop();
  233. swData.Add("AlimamaPlus", stopwatch.ElapsedMilliseconds);
  234. int timeout = alimama._config.rt_max;
  235. using var cts = new CancellationTokenSource();
  236. cts.CancelAfter(timeout);
  237. stopwatch.Reset();
  238. stopwatch.Start();
  239. var requestTask = Task.Run(() => alimama.UnionParse2Async(content, result, cts.Token, swData), cts.Token);
  240. var delayTask = Task.Delay(timeout, cts.Token);
  241. var completedTask = await Task.WhenAny(requestTask, delayTask);
  242. if (completedTask == requestTask)
  243. {
  244. result = await requestTask;
  245. }
  246. else
  247. {
  248. cts.Cancel();
  249. result.success = false;
  250. result.message = "放弃转链";
  251. result.reason = "请求超时";
  252. result.itemName = "点击打开淘宝APP";
  253. }
  254. stopwatch.Stop();
  255. swData.Add("UnionParse2Async", stopwatch.ElapsedMilliseconds);
  256. result.accountName = account.company;
  257. //result = await alimama.UnionParse2Async(content, result);
  258. }
  259. catch (Exception ex)
  260. {
  261. if (ex.Message.Contains("was canceled"))
  262. {
  263. result.success = false;
  264. result.message = "放弃转链";
  265. result.reason = "请求超时";
  266. result.itemName = "点击打开淘宝APP";
  267. }
  268. else
  269. {
  270. _ = new LoggerLibrary("unionParse", "tb_error")
  271. .Info(ip, oaid)
  272. .Info(content)
  273. .Info(ex.Message, ex.StackTrace)
  274. .SaveAsync();
  275. NotifyCore.Notify(new NifyMessage
  276. {
  277. message = $"【转链异常TB】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  278. priority = NifyMessagePriority.high,
  279. tags = ["red_circle"]
  280. });
  281. result.success = false;
  282. result.message = "放弃转链";
  283. result.reason = "转链接口异常";
  284. result.itemName = "点击打开淘宝APP";
  285. }
  286. }
  287. _ = TkLogCore.ParseLogAsync(result, alimama);
  288. return TaobaoParseOutput(result, swData, new
  289. {
  290. result.success,
  291. result.message,
  292. link_type = result.link_type.ToString(),
  293. channel = result?.channel.ToString(),
  294. result.channel_type,
  295. result.itemId,
  296. result.itemName,
  297. result.pic,
  298. result.promotionPrice,
  299. result.couponAmount,
  300. result.couponEffectiveStartTime,
  301. result?.couponEffectiveEndTime,
  302. result.shortLinkurl,
  303. result.deeplink_url,
  304. result.content,
  305. result.taoToken,
  306. });
  307. }
  308. public static async Task<APIResult> TaobaoParseAsync222(string content,
  309. string ip = "", string oaid = "")
  310. {
  311. AlimamaPlus alimama = null;
  312. content = content.UrlDecode();
  313. content = content[..Math.Min(1000, content.Length)];
  314. var result = AlimamaPlus.GetFormattedObject(content, ip, oaid);
  315. LoggerLibrary log = new("debug", "stopwatch");
  316. log.Info($"StartNew", content);
  317. Stopwatch stopwatch = Stopwatch.StartNew();
  318. result.rawContent = content;
  319. try
  320. {
  321. bool is_other = await AlimamaPlus.OtherPlatformAsync(content);
  322. stopwatch.Stop();
  323. log.Info($"AlimamaPlus.OtherPlatform\t{stopwatch.ElapsedMilliseconds}");
  324. if (is_other)
  325. {
  326. result.success = false;
  327. result.message = "放弃转链";
  328. result.reason = "平台错误";
  329. _ = TkLogCore.ParseLogAsync(result);
  330. return new APIResult(new
  331. {
  332. channel = result?.channel.ToString(),
  333. result.success,
  334. result.message,
  335. result.shortLinkurl,
  336. result.deeplink_url,
  337. }, APIResultCodeEnum.NotAcceptable);
  338. }
  339. string reason = string.Empty;
  340. if (string.IsNullOrEmpty(result.shortLinkurl) && AlimamaPlus.FirstFilterIgnoreRequest(content, out reason))
  341. {
  342. //没有短链接都放弃
  343. result.success = false;
  344. result.message = "放弃转链";
  345. result.itemName = "点击打开淘宝APP";
  346. result.reason = "初步筛选";
  347. _ = TkLogCore.ParseLogAsync(result);
  348. return new APIResult(new
  349. {
  350. result.success,
  351. result.message,
  352. result.content,
  353. result.itemName,
  354. result.deeplink_url,
  355. });
  356. }
  357. if (AlimamaPlus.ShouldIgnoreRequest(ip, oaid, out reason))
  358. {
  359. result.success = false;
  360. result.message = "放弃转链";
  361. result.itemName = "点击打开淘宝APP";
  362. result.reason = reason;
  363. _ = TkLogCore.ParseLogAsync(result);
  364. return new APIResult(new
  365. {
  366. result.success,
  367. result.message,
  368. result.content,
  369. result.itemName,
  370. result.deeplink_url,
  371. });
  372. }
  373. var account = TkPoolCore.GetOne(TkPoolCore.TkAction.parse);
  374. if (account == null)
  375. {
  376. result.success = false;
  377. result.message = "放弃转链";
  378. result.reason = "没有匹配账号";
  379. result.itemName = "点击打开淘宝APP";
  380. _ = TkLogCore.ParseLogAsync(result);
  381. return new APIResult(new
  382. {
  383. result.success,
  384. result.message,
  385. result.content,
  386. result.couponAmount,
  387. result.taoToken,
  388. result.shortLinkurl,
  389. result.deeplink_url,
  390. });
  391. }
  392. result.accountId = account.id;
  393. alimama = new AlimamaPlus(account);
  394. int timeout = alimama._config.rt_max;
  395. using var cts = new CancellationTokenSource();
  396. cts.CancelAfter(timeout);
  397. var requestTask = Task.Run(() => alimama.UnionParse2Async(content, result, cts.Token), cts.Token);
  398. var delayTask = Task.Delay(timeout, cts.Token);
  399. var completedTask = await Task.WhenAny(requestTask, delayTask);
  400. if (completedTask == requestTask)
  401. {
  402. result = await requestTask;
  403. }
  404. else
  405. {
  406. cts.Cancel();
  407. result.success = false;
  408. result.message = "放弃转链";
  409. result.reason = "请求超时";
  410. result.itemName = "点击打开淘宝APP";
  411. }
  412. //result = await alimama.UnionParse2Async(content, result);
  413. result.accountName = account.company;
  414. }
  415. catch (Exception ex)
  416. {
  417. if (ex.Message.Contains("was canceled"))
  418. {
  419. result.success = false;
  420. result.message = "放弃转链";
  421. result.reason = "请求超时";
  422. result.itemName = "点击打开淘宝APP";
  423. }
  424. else
  425. {
  426. _ = new LoggerLibrary("unionParse", "tb_error")
  427. .Info(ip, oaid)
  428. .Info(content)
  429. .Info(ex.Message, ex.StackTrace)
  430. .SaveAsync();
  431. NotifyCore.Notify(new NifyMessage
  432. {
  433. message = $"【转链异常TB】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  434. priority = NifyMessagePriority.high,
  435. tags = ["red_circle"]
  436. });
  437. result.success = false;
  438. result.message = "放弃转链";
  439. result.reason = "转链接口异常";
  440. result.itemName = "点击打开淘宝APP";
  441. }
  442. }
  443. _ = TkLogCore.ParseLogAsync(result, alimama);
  444. return new APIResult(new
  445. {
  446. result.success,
  447. result.message,
  448. link_type = result.link_type.ToString(),
  449. channel = result?.channel.ToString(),
  450. result.channel_type,
  451. result.itemId,
  452. result.itemName,
  453. result.pic,
  454. result.promotionPrice,
  455. result.couponAmount,
  456. result.couponEffectiveStartTime,
  457. result?.couponEffectiveEndTime,
  458. result.shortLinkurl,
  459. result.deeplink_url,
  460. result.content,
  461. result.taoToken,
  462. });
  463. }
  464. //public static TkDataDTO testTaobaoParseAsync(string content, string ip = "", string oaid = "")
  465. //{
  466. // var result = AlimamaPlus.GetFormattedObject(content, ip, oaid);
  467. // content = content.UrlDecode();
  468. // content = content[..Math.Min(1000, content.Length)];
  469. // result.rawContent = content;
  470. // try
  471. // {
  472. // if (AlimamaPlus.OtherPlatform(content))
  473. // {
  474. // result.success = false;
  475. // result.message = "放弃转链";
  476. // result.reason = "平台错误";
  477. // return result;
  478. // }
  479. // string reason = string.Empty;
  480. // if (string.IsNullOrEmpty(result.shortLinkurl) && AlimamaPlus.FirstFilterIgnoreRequest(content, out reason))
  481. // {
  482. // //没有短链接都放弃
  483. // result.success = false;
  484. // result.message = "放弃转链";
  485. // result.itemName = "点击打开淘宝APP";
  486. // result.reason = "初步筛选";
  487. // return result;
  488. // }
  489. // if (AlimamaPlus.ShouldIgnoreRequest(ip, oaid, out reason))
  490. // {
  491. // result.success = false;
  492. // result.message = "放弃转链";
  493. // result.itemName = "点击打开淘宝APP";
  494. // result.reason = reason;
  495. // return result;
  496. // }
  497. // result.success = true;
  498. // return result;
  499. // }
  500. // catch (Exception ex)
  501. // {
  502. // result.success = false;
  503. // return result;
  504. // }
  505. //}
  506. public static async Task<APIResult> JdParseAsync(string content, string ip, string oaid, CancellationToken cancellationToken = default)
  507. {
  508. var result = JdUnionPlus.GetFormattedObject(content, ip, oaid);
  509. content = content.UrlDecode();
  510. result.rawContent = content;
  511. bool IfExceptional = false;
  512. try
  513. {
  514. if (JdUnionPlus.ShouldIgnoreRequest(ip, oaid, out string reason))
  515. {
  516. result.success = false;
  517. result.message = "放弃转链";
  518. result.reason = reason;
  519. _ = TkLogCore.ParseLogAsync(result);
  520. return new APIResult(result);
  521. }
  522. var account = JdPoolCore.GetOne();
  523. if (account == null)
  524. {
  525. result.success = false;
  526. result.message = "放弃转链";
  527. result.reason = "没有匹配账号";
  528. _ = TkLogCore.ParseLogAsync(result);
  529. return new APIResult(result);
  530. }
  531. result = await JdUnionPlus.JdParseAsync(account, content, result, cancellationToken);
  532. }
  533. catch (Exception ex)
  534. {
  535. if (ex.Message.Contains("was canceled"))
  536. {
  537. result.success = false;
  538. result.message = "放弃转链";
  539. result.reason = "请求超时";
  540. }
  541. else
  542. {
  543. IfExceptional = true;
  544. _ = new LoggerLibrary("unionParse", "jd_error")
  545. .Info(ip, oaid)
  546. .Info(content)
  547. .Info(ex.Message, ex.StackTrace)
  548. .SaveAsync();
  549. NotifyCore.Notify(new NifyMessage
  550. {
  551. message = $"【转链异常JD】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  552. priority = NifyMessagePriority.high,
  553. tags = ["red_circle"]
  554. });
  555. result.success = false;
  556. result.message = "内部错误";
  557. result.reason = "转链接口异常";
  558. }
  559. }
  560. _ = TkLogCore.ParseLogAsync(result);
  561. return new APIResult(new
  562. {
  563. result.success,
  564. result.message,
  565. link_type = result.link_type.ToString(),
  566. channel = result?.channel.ToString(),
  567. result.channel_type,
  568. result.itemId,
  569. result.itemName,
  570. result.shortLinkurl,
  571. result.deeplink_url,
  572. }, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK);
  573. }
  574. public static async Task<APIResult> DyParseAsync(string content, string ip, string oaid, CancellationToken cancellationToken = default)
  575. {
  576. var result = DyUnionPlus.GetFormattedObject(content, ip, oaid);
  577. content = content.UrlDecode();
  578. result.rawContent = content;
  579. bool IfExceptional = false;
  580. try
  581. {
  582. // 2024-06-19 联盟业务下线
  583. result.success = false;
  584. result.message = "放弃转链";
  585. result.reason = "联盟下线";
  586. _ = TkLogCore.ParseLogAsync(result);
  587. return new APIResult(result);
  588. if (DyUnionPlus.ShouldIgnoreRequest(ip, oaid, out string reason))
  589. {
  590. result.success = false;
  591. result.message = "放弃转链";
  592. result.reason = reason;
  593. _ = TkLogCore.ParseLogAsync(result);
  594. return new APIResult(result);
  595. }
  596. var account = PangolinPoolCore.GetOne();
  597. if (account == null)
  598. {
  599. result.success = false;
  600. result.message = "放弃转链";
  601. result.reason = "没有匹配账号";
  602. _ = TkLogCore.ParseLogAsync(result);
  603. return new APIResult(result);
  604. }
  605. result = await DyUnionPlus.DyParseAsync(account, content, result, cancellationToken);
  606. }
  607. catch (Exception ex)
  608. {
  609. if (ex.Message.Contains("was canceled"))
  610. {
  611. result.success = false;
  612. result.message = "放弃转链";
  613. result.reason = "请求超时";
  614. }
  615. else
  616. {
  617. IfExceptional = true;
  618. _ = new LoggerLibrary("unionParse", "dy_error")
  619. .Info(ip, oaid)
  620. .Info(content)
  621. .Info(ex.Message, ex.StackTrace)
  622. .SaveAsync();
  623. NotifyCore.Notify(new NifyMessage
  624. {
  625. message = $"【转链异常DY】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  626. priority = NifyMessagePriority.high,
  627. tags = ["red_circle"]
  628. });
  629. result.success = false;
  630. result.message = "内部错误";
  631. result.reason = "转链接口异常";
  632. }
  633. }
  634. _ = TkLogCore.ParseLogAsync(result);
  635. return new APIResult(new
  636. {
  637. result.success,
  638. result.message,
  639. link_type = result.link_type.ToString(),
  640. channel = result?.channel.ToString(),
  641. content = result?.rawContent.ToString(),
  642. taoToken = result?.taoToken.ToString(),
  643. result.channel_type,
  644. result.itemName,
  645. result.shortLinkurl,
  646. result.deeplink_url,
  647. }, IfExceptional ? APIResultCodeEnum.NotAcceptable : APIResultCodeEnum.OK);
  648. }
  649. }
  650. }