UnionParseCore.cs 27 KB

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