base.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. 
  2. using System.Text;
  3. using dodohold.core;
  4. using System.Net;
  5. namespace molilian.core
  6. {
  7. public partial class JdUnionPlus
  8. {
  9. static Random _random = new Random();
  10. public string _proxyName = null;
  11. public WebProxy? _proxy = null;
  12. public TkConfigDTO _config;
  13. private JdPoolDTO _account;
  14. private static string _end_point;
  15. static JdUnionPlus()
  16. {
  17. _end_point = Environment.GetEnvironmentVariable("EndPoint");
  18. }
  19. public JdUnionPlus(JdPoolDTO account)
  20. {
  21. _account = account;
  22. _config = TkConfigCore.Get();
  23. if (!string.IsNullOrEmpty(account.nodeName))
  24. {
  25. _proxyName = ProxyNodesCore.GetSelectOne(account.nodeName);
  26. _proxy = ProxyNodesCore.GetOne(_proxyName);
  27. }
  28. }
  29. public string _sign(string method, string version, string param_json, string timestamp)
  30. {
  31. Dictionary<string, string> sysParameters = new()
  32. {
  33. { "360buy_param_json", param_json },
  34. { "access_token", ""},
  35. { "app_key", _account.app_key },
  36. { "method", method},
  37. { "timestamp", timestamp },
  38. { "v", version }
  39. };
  40. StringBuilder stringBuilder = new();
  41. foreach ((var key, var value) in sysParameters)
  42. {
  43. stringBuilder.Append(key);
  44. stringBuilder.Append(value);
  45. }
  46. string strParameters = _account.app_secret + stringBuilder.ToString() + _account.app_secret;
  47. string result = strParameters.MD5(false, false);
  48. return result;
  49. }
  50. public string Request(string method, string version, string param_json)
  51. {
  52. var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  53. var sign = _sign(method, version, param_json, timestamp);
  54. timestamp = timestamp.UrlEncode();
  55. string api = "https://api.jd.com/routerjson";
  56. string url = api;
  57. url += "?access_token=";
  58. url += $"&app_key={_account.app_key}";
  59. url += $"&method={method.UrlEncode()}";
  60. url += $"&v={version.UrlEncode()}";
  61. url += $"&sign={sign}";
  62. url += $"&360buy_param_json={param_json.UrlEncode()}";
  63. url += $"&timestamp={timestamp}";
  64. var log = new LoggerLibrary("jdunion", method).Info(url);
  65. var client = new WebClientUtility();
  66. var response = client.Request(url);
  67. var body = response.Body();
  68. _ = log.Info(body).SaveAsync();
  69. //var root = body.Convert2JsonElement();
  70. return body;
  71. }
  72. public async Task<string> RequestAsync(string method, string version, string param_json, CancellationToken cancellationToken = default)
  73. {
  74. var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  75. var sign = _sign(method, version, param_json, timestamp);
  76. timestamp = timestamp.UrlEncode().Replace(" ", "+");
  77. string api = "https://api.jd.com/routerjson";
  78. string url = api;
  79. url += "?access_token=";
  80. url += $"&app_key={_account.app_key}";
  81. url += $"&method={method.UrlEncode()}";
  82. url += $"&v={version.UrlEncode()}";
  83. url += $"&sign={sign}";
  84. url += $"&360buy_param_json={param_json.UrlEncode()}";
  85. url += $"&timestamp={timestamp}";
  86. var log = new LoggerLibrary("jdunion", method).Info(url);
  87. var client = new WebClientUtility();
  88. var response = await client.RequestAsync(url, "GET", cancellationToken);
  89. var body = response.Body();
  90. _ = log.Info(body).SaveAsync();
  91. return body;
  92. }
  93. public static bool ShouldIgnoreRequest(TkConfigDTO config, UnionParseRequest request, out string reason)
  94. {
  95. reason = string.Empty;
  96. //2025-06-24 brw不做风控
  97. //if (!string.IsNullOrEmpty(riskStrategy) && !"os".Equals(riskStrategy) && launchScene != -1) return false;
  98. switch (request.RiskStrategy)
  99. {
  100. case "tbpush":
  101. case "brwsimilar":
  102. case "icon":
  103. return false;
  104. }
  105. try
  106. {
  107. // IP和流量控制
  108. string ignorePercentageCity = config.jdIgnorePercentageCity;
  109. string? ipInfo = IP2RegionPlus.Search(request.Ip);
  110. if (!TestParseCore.InWhitelist(request.Ip, request.Oaid) && AlimamaPlus.IgnoreRegionIncluded(ignorePercentageCity, ipInfo, out string regionInfo))
  111. {
  112. reason = $"地区控制:{regionInfo}";
  113. return true;
  114. }
  115. if (TkLogCore.InBlacklist(config.blacklist_oaid, request.Oaid))
  116. {
  117. reason = "OAID黑名单";
  118. return true;
  119. }
  120. int limit_num = config.jd_limit_per_ip_24h;
  121. if (limit_num > 0)
  122. {
  123. int num = TkLogCore.getClientRequestTotalByIp(TkChannelEnum.jd, request.Ip);
  124. if (num >= limit_num)
  125. {
  126. reason = "IP控制";
  127. return true;
  128. }
  129. }
  130. limit_num = config.jd_limit_per_oaid_24h;
  131. if (limit_num > 0)
  132. {
  133. int num = TkLogCore.getClientRequestTotalByOAID(TkChannelEnum.jd, request.Oaid);
  134. if (num >= limit_num)
  135. {
  136. reason = "OAID控制";
  137. return true;
  138. }
  139. }
  140. }
  141. catch (Exception ex)
  142. {
  143. reason = "配置异常";
  144. }
  145. return false;
  146. }
  147. public static bool FlowControlIgnoreRequest(TkConfigDTO config, UnionParseRequest request, out string reason)
  148. {
  149. reason = string.Empty;
  150. //if (!string.IsNullOrEmpty(riskStrategy) && !"os".Equals(riskStrategy) && launchScene != -1) return false;
  151. switch (request.RiskStrategy)
  152. {
  153. case "tbpush":
  154. case "brwsimilar":
  155. case "icon":
  156. return false;
  157. }
  158. try
  159. {
  160. // IP和流量控制
  161. int ignorePercentage = config.jdIgnorePercentage;
  162. if (ignorePercentage == 0) return false;
  163. var randomValue = (decimal)_random.Next(0, 100);
  164. bool result = randomValue <= ignorePercentage; // 如果生成的随机数小于忽略百分比,则返回 true,表示需要忽略请求
  165. if (result)
  166. {
  167. reason = "流量控制";
  168. return true;
  169. }
  170. }
  171. catch (Exception ex)
  172. {
  173. reason = $"配置异常";
  174. }
  175. return false;
  176. }
  177. }
  178. }