UnionParseCore.cs 27 KB

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