UnionCouponCore.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. using dodohold.core;
  2. using Microsoft.AspNetCore.Mvc;
  3. namespace molilian.core
  4. {
  5. public partial class UnionCouponCore
  6. {
  7. private static string _end_point;
  8. static UnionCouponCore()
  9. {
  10. _end_point = Environment.GetEnvironmentVariable("EndPoint");
  11. }
  12. public static async Task<ActionResult> UnionCouponAsync(string content, string dplink, string channel, string style, string ip, string oaid, string clickId)
  13. {
  14. switch (channel)
  15. {
  16. case "tb":
  17. return await TaobaoCouponAsync(content, dplink, ip, oaid);
  18. case "jd":
  19. return await JdCouponAsync(content, dplink, ip, oaid, clickId);
  20. default:
  21. if (!string.IsNullOrEmpty(content.Trim()))
  22. {
  23. return await UnionCpsCore.TbtCouponAsync(content, channel, ip, oaid);
  24. }
  25. var result = await UnionCpsCore.CpsCouponAsync(channel, style, ip, oaid);
  26. if (result.success)
  27. {
  28. return new APIResult(new
  29. {
  30. result.success,
  31. result.message,
  32. result.title,
  33. result.sub_title,
  34. result.deeplink_url,
  35. result.shortLinkurl,
  36. result.token,
  37. result.channel,
  38. exposeTracks = $"https://api.molilian.com/tracks/track?track_id=9&unique_id={result.channel}",
  39. clickTracks = $"https://api.molilian.com/tracks/track?track_id=10&unique_id={result.channel}",
  40. });
  41. }
  42. else
  43. {
  44. return new APIResult(new
  45. {
  46. result.success,
  47. result.message,
  48. result.reason,
  49. result.channel,
  50. });
  51. }
  52. }
  53. }
  54. public static async Task<APIResult> TaobaoCouponAsync(string content, string dplink, string ip = "", string oaid = "")
  55. {
  56. AlimamaPlus alimama = null;
  57. content = content.UrlDecode();
  58. dplink = dplink.UrlDecode();
  59. UnionCouponDTO result = new()
  60. {
  61. channel = TkChannelEnum.tb,
  62. rawContent = content,
  63. rawContent2 = dplink,
  64. end_point = _end_point,
  65. ip = ip,
  66. oaid = oaid
  67. };
  68. content = AlimamaPlus.FakeItemUrl(content, dplink);
  69. result.content = content;
  70. if (string.IsNullOrEmpty(content))
  71. {
  72. result.success = false;
  73. result.message = "放弃转链";
  74. result.reason = "无效的参数";
  75. result.rawContent = content;
  76. _ = TkLogCore.CouponLogAsync(result);
  77. return new APIResult(new
  78. {
  79. result.success,
  80. result.reason,
  81. result.message,
  82. channel = result.channel.ToString(),
  83. });
  84. }
  85. try
  86. {
  87. string reason;
  88. UnionParseRequest request = new()
  89. {
  90. Ip = ip,
  91. Oaid = oaid,
  92. RiskStrategy = string.Empty,
  93. LaunchScene = 0,
  94. };
  95. if (AlimamaPlus.FilterRiskLink(ip, oaid, content, out reason) ||
  96. AlimamaPlus.ShouldIgnoreRequest(request, out reason))
  97. {
  98. result.success = false;
  99. result.message = "放弃转链";
  100. result.reason = reason;
  101. _ = TkLogCore.CouponLogAsync(result);
  102. return new APIResult(new
  103. {
  104. result.success,
  105. result.message,
  106. result.reason,
  107. channel = result.channel.ToString(),
  108. });
  109. }
  110. var account = await TkPoolCore.GetOneAsync(TkPoolCore.TkAction.coupon, false, string.Empty, 0);
  111. if (account == null)
  112. {
  113. result.success = false;
  114. result.message = "放弃转链";
  115. result.reason = "没有匹配账号";
  116. _ = TkLogCore.CouponLogAsync(result);
  117. return new APIResult(new
  118. {
  119. result.success,
  120. result.message,
  121. result.reason,
  122. channel = result.channel.ToString(),
  123. });
  124. }
  125. result.accountId = account.id;
  126. result.accountName = account.name;
  127. alimama = new AlimamaPlus(account);
  128. result = await alimama.UnionCoupon2Async(content, result);
  129. }
  130. catch (Exception ex)
  131. {
  132. if (ex.Message.Contains("was canceled"))
  133. {
  134. result.success = false;
  135. result.message = "放弃转链";
  136. result.reason = "请求超时";
  137. }
  138. else
  139. {
  140. _ = new LoggerLibrary("unionCoupon", "tb_error")
  141. .Info(ip, oaid)
  142. .Info(content)
  143. .Info(ex.Message, ex.StackTrace)
  144. .SaveAsync();
  145. NotifyCore.Notify(new NifyMessage
  146. {
  147. message = $"【转链异常TB】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  148. priority = NifyMessagePriority.high,
  149. tags = ["red_circle"]
  150. });
  151. result.success = false;
  152. result.message = "放弃转链";
  153. result.reason = "转链接口异常";
  154. }
  155. }
  156. _ = TkLogCore.CouponLogAsync(result, alimama);
  157. if (!result.success)
  158. {
  159. return new APIResult(new
  160. {
  161. result.success,
  162. result.message,
  163. result.reason,
  164. channel = result?.channel.ToString(),
  165. });
  166. }
  167. int couponAmount = (int)result.couponAmount * 100;
  168. return new APIResult(new
  169. {
  170. result.success,
  171. result.message,
  172. channel = result?.channel.ToString(),
  173. result?.itemId,
  174. couponAmount,
  175. result?.deeplink_url,
  176. result?.pic,
  177. result?.couponEffectiveStartTime,
  178. result?.couponEffectiveEndTime,
  179. });
  180. }
  181. public static async Task<APIResult> JdCouponAsync(string content, string dplink, string ip, string oaid, string clickId)
  182. {
  183. content = content.UrlDecode();
  184. dplink = dplink.UrlDecode();
  185. UnionCouponDTO result = new()
  186. {
  187. channel = TkChannelEnum.jd,
  188. rawContent = content,
  189. rawContent2 = dplink,
  190. end_point = _end_point,
  191. };
  192. if (string.IsNullOrEmpty(content))
  193. {
  194. content = dplink.Replace("taobao://", "https://");
  195. }
  196. if (string.IsNullOrEmpty(content))
  197. {
  198. result.success = false;
  199. result.message = "放弃转链";
  200. result.reason = "无效的参数";
  201. result.rawContent = content;
  202. _ = TkLogCore.CouponLogAsync(result);
  203. return new APIResult(new
  204. {
  205. result.success,
  206. result.reason,
  207. result.message,
  208. channel = result.channel.ToString(),
  209. });
  210. }
  211. try
  212. {
  213. var config = TkConfigCore.Get();
  214. UnionParseRequest request = new();
  215. request.Ip = ip;
  216. request.Oaid = oaid;
  217. request.RiskStrategy = string.Empty;
  218. request.LaunchScene = 0;
  219. if (JdUnionPlus.ShouldIgnoreRequest(config, request, out string reason))
  220. {
  221. result.success = false;
  222. result.message = "放弃转链";
  223. result.reason = reason;
  224. _ = TkLogCore.CouponLogAsync(result);
  225. return new APIResult(new
  226. {
  227. result.success,
  228. result.reason,
  229. result.message,
  230. channel = result.channel.ToString(),
  231. });
  232. }
  233. var api = DataokeCore.GetOne();
  234. if (api == null)
  235. {
  236. result.success = false;
  237. result.message = "放弃转链";
  238. result.reason = "没有匹配账号";
  239. result.rawContent = content;
  240. _ = TkLogCore.CouponLogAsync(result);
  241. return new APIResult(new
  242. {
  243. result.success,
  244. result.reason,
  245. result.message,
  246. channel = result.channel.ToString(),
  247. });
  248. }
  249. var account = await JdPoolCore.GetOneAsync();
  250. if (account == null)
  251. {
  252. result.success = false;
  253. result.message = "放弃转链";
  254. result.reason = "没有匹配账号";
  255. _ = TkLogCore.CouponLogAsync(result);
  256. return new APIResult(new
  257. {
  258. result.success,
  259. result.reason,
  260. result.message,
  261. channel = result.channel.ToString(),
  262. });
  263. }
  264. result = await JdUnionPlus.JdCouponAsync(account, api, content, clickId, result);
  265. if (result.success && result.couponAmount == 0)
  266. {
  267. result.success = false;
  268. result.message = "没有优惠券";
  269. result.reason = "";
  270. }
  271. }
  272. catch (Exception ex)
  273. {
  274. if (ex.Message.Contains("was canceled"))
  275. {
  276. result.success = false;
  277. result.message = "放弃转链";
  278. result.reason = "请求超时";
  279. }
  280. else
  281. {
  282. _ = new LoggerLibrary("unionCoupon", "jd_error")
  283. .Info(ip, oaid)
  284. .Info(content)
  285. .Info(ex.Message, ex.StackTrace)
  286. .SaveAsync();
  287. NotifyCore.Notify(new NifyMessage
  288. {
  289. message = $"【转链异常JD】\n{content}\n\n{ex.Message}\n{ex.StackTrace}",
  290. priority = NifyMessagePriority.high,
  291. tags = ["red_circle"]
  292. });
  293. result.success = false;
  294. result.message = "内部错误";
  295. result.reason = "转链接口异常";
  296. }
  297. }
  298. _ = TkLogCore.CouponLogAsync(result);
  299. if (!result.success)
  300. {
  301. return new APIResult(new
  302. {
  303. result.success,
  304. result.reason,
  305. result.message,
  306. channel = result?.channel.ToString(),
  307. });
  308. }
  309. int couponAmount = (int)(result.couponAmount * 100);
  310. return new APIResult(new
  311. {
  312. result.success,
  313. result.message,
  314. channel = result?.channel.ToString(),
  315. result?.itemId,
  316. couponAmount,
  317. result?.deeplink_url,
  318. result?.pic,
  319. result?.couponEffectiveStartTime,
  320. result?.couponEffectiveEndTime,
  321. });
  322. }
  323. }
  324. }