base.cs 6.2 KB

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