base.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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, string ip, string oaid, string riskStrategy, int launchScene, 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. try
  99. {
  100. // IP和流量控制
  101. string ignorePercentageCity = config.jdIgnorePercentageCity;
  102. string? ipInfo = IP2RegionPlus.Search(ip);
  103. if (!TestParseCore.InWhitelist(ip, oaid) && AlimamaPlus.IgnoreRegionIncluded(ignorePercentageCity, ipInfo, out string regionInfo))
  104. {
  105. reason = $"地区控制:{regionInfo}";
  106. return true;
  107. }
  108. if (TkLogCore.InBlacklist(config.blacklist_oaid, oaid))
  109. {
  110. reason = "OAID黑名单";
  111. return true;
  112. }
  113. int limit_num = config.jd_limit_per_ip_24h;
  114. if (limit_num > 0)
  115. {
  116. int num = TkLogCore.getClientRequestTotalByIp(TkChannelEnum.jd, ip);
  117. if (num >= limit_num)
  118. {
  119. reason = "IP控制";
  120. return true;
  121. }
  122. }
  123. limit_num = config.jd_limit_per_oaid_24h;
  124. if (limit_num > 0)
  125. {
  126. int num = TkLogCore.getClientRequestTotalByOAID(TkChannelEnum.jd, oaid);
  127. if (num >= limit_num)
  128. {
  129. reason = "OAID控制";
  130. return true;
  131. }
  132. }
  133. }
  134. catch (Exception ex)
  135. {
  136. reason = "配置异常";
  137. }
  138. return false;
  139. }
  140. public static bool FlowControlIgnoreRequest(TkConfigDTO config, string riskStrategy, int launchScene, out string reason)
  141. {
  142. reason = string.Empty;
  143. //if (!string.IsNullOrEmpty(riskStrategy) && !"os".Equals(riskStrategy) && launchScene != -1) return false;
  144. try
  145. {
  146. // IP和流量控制
  147. int ignorePercentage = config.jdIgnorePercentage;
  148. if (ignorePercentage == 0) return false;
  149. var randomValue = (decimal)_random.Next(0, 100);
  150. bool result = randomValue <= ignorePercentage; // 如果生成的随机数小于忽略百分比,则返回 true,表示需要忽略请求
  151. if (result)
  152. {
  153. reason = "流量控制";
  154. return true;
  155. }
  156. }
  157. catch (Exception ex)
  158. {
  159. reason = $"配置异常";
  160. }
  161. return false;
  162. }
  163. }
  164. }