base.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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. private WebProxy? _proxy = null;
  11. public TkConfigDTO _config;
  12. private JdPoolDTO _account;
  13. private static string _end_point;
  14. static JdUnionPlus()
  15. {
  16. _end_point = Environment.GetEnvironmentVariable("EndPoint");
  17. }
  18. public JdUnionPlus(JdPoolDTO account)
  19. {
  20. _account = account;
  21. _config = TkConfigCore.Get();
  22. if (!string.IsNullOrEmpty(account.nodeName))
  23. {
  24. _proxy = ProxyNodesCore.GetOne(account.nodeName);
  25. }
  26. }
  27. private string _sign(string method, string version, string param_json, string timestamp)
  28. {
  29. Dictionary<string, string> sysParameters = new()
  30. {
  31. { "360buy_param_json", param_json },
  32. { "access_token", ""},
  33. { "app_key", _account.app_key },
  34. { "method", method},
  35. { "timestamp", timestamp },
  36. { "v", version }
  37. };
  38. StringBuilder stringBuilder = new();
  39. foreach ((var key, var value) in sysParameters)
  40. {
  41. stringBuilder.Append(key);
  42. stringBuilder.Append(value);
  43. }
  44. string strParameters = _account.app_secret + stringBuilder.ToString() + _account.app_secret;
  45. string result = strParameters.MD5(false, false);
  46. return result;
  47. }
  48. public string Request(string method, string version, string param_json)
  49. {
  50. var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  51. var sign = _sign(method, version, param_json, timestamp);
  52. timestamp = timestamp.UrlEncode().Replace(" ", "+");
  53. string api = "https://api.jd.com/routerjson";
  54. string url = api;
  55. url += "?access_token=";
  56. url += $"&app_key={_account.app_key}";
  57. url += $"&method={method.UrlEncode()}";
  58. url += $"&v={version.UrlEncode()}";
  59. url += $"&sign={sign}";
  60. url += $"&360buy_param_json={param_json.UrlEncode()}";
  61. url += $"&timestamp={timestamp}";
  62. var log = new LoggerLibrary("jdunion", method).Info(url);
  63. var client = new WebClientUtility();
  64. var response = client.Request(url);
  65. var body = response.Body();
  66. _ = log.Info(body).SaveAsync();
  67. //var root = body.Convert2JsonElement();
  68. return body;
  69. }
  70. public async Task<string> RequestAsync(string method, string version, string param_json, CancellationToken cancellationToken = default)
  71. {
  72. var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  73. var sign = _sign(method, version, param_json, timestamp);
  74. timestamp = timestamp.UrlEncode().Replace(" ", "+");
  75. string api = "https://api.jd.com/routerjson";
  76. string url = api;
  77. url += "?access_token=";
  78. url += $"&app_key={_account.app_key}";
  79. url += $"&method={method.UrlEncode()}";
  80. url += $"&v={version.UrlEncode()}";
  81. url += $"&sign={sign}";
  82. url += $"&360buy_param_json={param_json.UrlEncode()}";
  83. url += $"&timestamp={timestamp}";
  84. var log = new LoggerLibrary("jdunion", method).Info(url);
  85. var client = new WebClientUtility();
  86. var response = await client.RequestAsync(url, "GET", cancellationToken);
  87. var body = response.Body();
  88. _ = log.Info(body).SaveAsync();
  89. return body;
  90. }
  91. public static bool ShouldIgnoreRequest(TkConfigDTO config, string ip, string oaid, out string reason)
  92. {
  93. reason = string.Empty;
  94. try
  95. {
  96. // IP和流量控制
  97. string ignorePercentageCity = config.jdIgnorePercentageCity;
  98. string? ipInfo = IP2RegionPlus.Search(ip);
  99. if (AlimamaPlus.IgnoreRegionIncluded(ignorePercentageCity, ipInfo, out string regionInfo))
  100. {
  101. reason = $"地区控制:{regionInfo}";
  102. return true;
  103. }
  104. int limit_num = config.jd_limit_per_ip_24h;
  105. if (limit_num > 0)
  106. {
  107. int num = TkLogCore.getClientRequestTotalByIp(TkChannelEnum.jd, ip);
  108. if (num > limit_num)
  109. {
  110. reason = "IP控制";
  111. return true;
  112. }
  113. num = TkLogCore.getClientRequestTotalByOAID(TkChannelEnum.jd, oaid);
  114. if (num > limit_num)
  115. {
  116. reason = "OAID控制";
  117. return true;
  118. }
  119. }
  120. }
  121. catch (Exception ex)
  122. {
  123. reason = "配置异常";
  124. }
  125. return false;
  126. }
  127. public static bool FlowControlIgnoreRequest(TkConfigDTO config, out string reason)
  128. {
  129. reason = string.Empty;
  130. try
  131. {
  132. // IP和流量控制
  133. int ignorePercentage = config.jdIgnorePercentage;
  134. if (ignorePercentage == 0) return false;
  135. var randomValue = (decimal)_random.Next(0, 100);
  136. bool result = randomValue <= ignorePercentage; // 如果生成的随机数小于忽略百分比,则返回 true,表示需要忽略请求
  137. if (result)
  138. {
  139. reason = "流量控制";
  140. return true;
  141. }
  142. }
  143. catch (Exception ex)
  144. {
  145. reason = $"配置异常";
  146. }
  147. return false;
  148. }
  149. }
  150. }