base.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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 Dataoke;
  10. using System.Text.RegularExpressions;
  11. using Org.BouncyCastle.Ocsp;
  12. using System.Diagnostics;
  13. using TencentCloud.Fmu.V20191213.Models;
  14. using Microsoft.VisualBasic;
  15. using System.Text.Json;
  16. using static System.Runtime.InteropServices.JavaScript.JSType;
  17. using System.Security.Cryptography;
  18. using System.Security.Policy;
  19. using Google.Protobuf.WellKnownTypes;
  20. using Microsoft.AspNetCore.Components;
  21. using Org.BouncyCastle.Pqc.Crypto.Ntru;
  22. namespace molilian.core
  23. {
  24. public partial class DyUnionPlus
  25. {
  26. string _app_key;
  27. string _app_secret;
  28. const string _base_url = "https://ecom.pangolin-sdk-toutiao.com";
  29. public DyUnionPlus(string app_key, string app_secret)
  30. {
  31. _app_key = app_key;
  32. _app_secret = app_secret;
  33. }
  34. public string _sign(string req_id, int timestamp, string data)
  35. {
  36. string signStr = $"app_id={_app_key}&data={data}&req_id={req_id}&timestamp={timestamp}{_app_secret}";
  37. return signStr.MD5();
  38. }
  39. public async Task<DyDataDTO> Parse(string content, DyDataDTO result)
  40. {
  41. string path = "/command_parse";
  42. string post = new { command = content, share_type = new int[] { 1, 3, 5 } }.Convert2Json();
  43. var body = await RequestAsync(path, post);
  44. //{"code":500000,"desc":"command parse error:商品没有加入精选联盟"}
  45. //{"code":500000,"desc":"command parse error:商家已设置该商品仅指定作者可推广,请您更换其他商品"}
  46. //{"code":0,"desc":"","data":{"command_type":1,"product_info":{"product_id":3660263780149019445,"share_info":{"deeplink":"snssdk1128://lynxview?surl=https%3A%2F%2Flf-dy-sourcecdn-tos.bytegecko.com%2Fobj%2Fbyte-gurd-source%2F1325%2Fgecko%2Fresource%2Ffe_lynx_distribution_landing%2Fapp%2Ftemplate.js&hide_nav_bar=1&hide_status_bar=1&token=ijRcTEAk&distribution_ab=1&alliance_distribution=1","share_command":"","zlink":"","share_link":""}}}}
  47. var root = body.Convert2JsonElement();
  48. int code = root.Read<int>("code");
  49. if (code == 0)
  50. {
  51. var share_info = result.link_type switch
  52. {
  53. LinkTypeEnum.live => root.ElementRead("data").ElementRead("live_info").ElementRead("share_info"),
  54. _ => root.ElementRead("data").ElementRead("product_info").ElementRead("share_info"),
  55. };
  56. result.deeplink_url = share_info.Read<string>("deeplink");
  57. result.taoToken = share_info.Read<string>("share_command");
  58. result.shortLinkurl = share_info.Read<string>("share_link");
  59. result.success = true;
  60. result.message = "OK";
  61. }
  62. else
  63. {
  64. //{"code":500000,"desc":"command parse error:商品没有加入精选联盟"}
  65. //{"code":500000,"desc":"command parse error:商家已设置该商品仅指定作者可推广,请您更换其他商品"}
  66. string desc = root.Read<string>("desc", string.Empty);
  67. desc = desc.Replace("command parse error:", "");
  68. result.reason = desc;
  69. result.success = false;
  70. result.message = "转链失败";
  71. result.reason = "";
  72. result.success = false;
  73. }
  74. return result;
  75. }
  76. //public async Task<DyDataDTO> GetLiveOpenId(string live_id, DyDataDTO result)
  77. //{
  78. // string path = "/live/search";
  79. // string post = new { author_buyin_id = live_id, share_type = new int[] { 1, 3 } }.Convert2Json();
  80. // var body = await RequestAsync(path, post);
  81. // var root = body.Convert2JsonElement();
  82. // int code = root.Read<int>("code");
  83. // if (code == 0)
  84. // {
  85. // var share_info = root.ElementRead("data").ElementRead("product_info").ElementRead("share_info");
  86. // result.deeplink_url = share_info.Read<string>("deeplink");
  87. // result.content = share_info.Read<string>("share_command");
  88. // result.shortLinkurl = share_info.Read<string>("share_link");
  89. // result.success = true;
  90. // result.message = "OK";
  91. // }
  92. // else
  93. // {
  94. // result.success = false;
  95. // result.message = "转链失败";
  96. // result.reason = "";
  97. // result.success = false;
  98. // }
  99. // return result;
  100. //}
  101. //public async Task<string> GetLiveOpenId(string room_id)
  102. //{
  103. // try
  104. // {
  105. // string url = $"https://webcast.amemv.com/webcast/room/reflow/info/?type_id=0&live_id=1&room_id={room_id}&app_id=1128";
  106. // WebClientUtility client = new();
  107. // client.UserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/92.0.4515.131";
  108. // var result = client.Request(url);
  109. // if (!result.Successed)
  110. // {
  111. // new LoggerLibrary("pangolin", "webcast_room_reflow").Info($"{room_id}").Info(result.ResponseException.Message, result.ResponseException.StackTrace).SaveAsync();
  112. // return null;
  113. // }
  114. // }
  115. // catch (Exception ex)
  116. // {
  117. // new LoggerLibrary("pangolin", "webcast_room_reflow").Info($"{room_id}").Info(ex.Message, ex.StackTrace).SaveAsync();
  118. // return null;
  119. // }
  120. // return result;
  121. //}
  122. public async Task<string> RequestAsync(string path, string data)
  123. {
  124. int timestamp = DateTime.Now.Convert2UnixTimestamp();
  125. string req_id = Guid.NewGuid().ToString();
  126. var sign = _sign(req_id, timestamp, data);
  127. string url = $"{_base_url}{path}";
  128. var postData = new
  129. {
  130. app_id = _app_key,
  131. timestamp,
  132. sign,
  133. req_id,
  134. data
  135. }.Convert2Json();
  136. var log = new LoggerLibrary("pangolin", path.Replace("/", "_")).Info(postData);
  137. var client = new WebClientUtility();
  138. client.SetContentType("application/json");
  139. client.Post(postData);
  140. var response = await client.RequestAsync(url);
  141. var body = response.Body();
  142. _ = log.Info(body).SaveAsync();
  143. //var root = body.Convert2JsonElement();
  144. return body;
  145. }
  146. public static bool ShouldIgnoreRequest(string ip, string oaid, out string reason)
  147. {
  148. reason = string.Empty;
  149. try
  150. {
  151. var config = TkConfigCore.Get();
  152. int ignorePercentage = config.jdIgnorePercentage;
  153. if (ignorePercentage == 0) return false;
  154. Random random = new Random();
  155. var randomValue = (decimal)random.Next(0, 100);
  156. bool result = randomValue <= ignorePercentage; // 如果生成的随机数小于忽略百分比,则返回 true,表示需要忽略请求
  157. if (result) reason = "流量控制";
  158. return result;
  159. }
  160. catch (Exception ex)
  161. {
  162. reason = $"配置异常";
  163. return true;
  164. }
  165. }
  166. }
  167. }