using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; using System; using System.Collections.Generic; using System.Linq; using System.Text; using dodohold.core; using Dataoke; using System.Text.RegularExpressions; using Org.BouncyCastle.Ocsp; using System.Diagnostics; using TencentCloud.Fmu.V20191213.Models; using Microsoft.VisualBasic; using System.Text.Json; using static System.Runtime.InteropServices.JavaScript.JSType; using System.Security.Cryptography; using System.Security.Policy; using Google.Protobuf.WellKnownTypes; using Microsoft.AspNetCore.Components; using Org.BouncyCastle.Pqc.Crypto.Ntru; namespace molilian.core { public partial class JdUnionPlus { string _app_key; string _app_secret; static Random _random = new Random(); public JdUnionPlus(string app_key, string app_secret) { _app_key = app_key; _app_secret = app_secret; } private string _sign(string method, string version, string param_json, string timestamp) { Dictionary sysParameters = new() { { "360buy_param_json", param_json }, { "access_token", ""}, { "app_key", _app_key }, { "method", method}, { "timestamp", timestamp }, { "v", version } }; StringBuilder stringBuilder = new(); foreach ((var key, var value) in sysParameters) { stringBuilder.Append(key); stringBuilder.Append(value); } string strParameters = _app_secret + stringBuilder.ToString() + _app_secret; string result = strParameters.MD5(false, false); return result; } public string Request(string method, string version, string param_json) { var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); var sign = _sign(method, version, param_json, timestamp); timestamp = timestamp.UrlEncode().Replace(" ", "+"); string api = "https://api.jd.com/routerjson"; string url = api; url += "?access_token="; url += $"&app_key={_app_key}"; url += $"&method={method.UrlEncode()}"; url += $"&v={version.UrlEncode()}"; url += $"&sign={sign}"; url += $"&360buy_param_json={param_json.UrlEncode()}"; url += $"×tamp={timestamp}"; var log = new LoggerLibrary("jdunion", method).Info(url); var client = new WebClientUtility(); var response = client.Request(url); var body = response.Body(); _ = log.Info(body).SaveAsync(); //var root = body.Convert2JsonElement(); return body; } public async Task RequestAsync(string method, string version, string param_json, CancellationToken cancellationToken = default) { var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); var sign = _sign(method, version, param_json, timestamp); timestamp = timestamp.UrlEncode().Replace(" ", "+"); string api = "https://api.jd.com/routerjson"; string url = api; url += "?access_token="; url += $"&app_key={_app_key}"; url += $"&method={method.UrlEncode()}"; url += $"&v={version.UrlEncode()}"; url += $"&sign={sign}"; url += $"&360buy_param_json={param_json.UrlEncode()}"; url += $"×tamp={timestamp}"; var log = new LoggerLibrary("jdunion", method).Info(url); var client = new WebClientUtility(); var response = await client.RequestAsync(url, "GET", cancellationToken); var body = response.Body(); _ = log.Info(body).SaveAsync(); return body; } public static bool ShouldIgnoreRequest(string ip, string oaid, out string reason) { reason = string.Empty; try { // IP和流量控制 var config = TkConfigCore.Get(); string ignorePercentageCity = config.jdIgnorePercentageCity; string? ipInfo = IP2RegionPlus.Search(ip); if (AlimamaPlus.IgnoreRegionIncluded(ignorePercentageCity, ipInfo, out string regionInfo)) { reason = $"地区控制:{regionInfo}"; return true; } } catch (Exception ex) { reason = "配置异常"; } return false; } public static bool FlowControlIgnoreRequest(out string reason) { reason = string.Empty; try { // IP和流量控制 var config = TkConfigCore.Get(); int ignorePercentage = config.jdIgnorePercentage; if (ignorePercentage == 0) return false; var randomValue = (decimal)_random.Next(0, 100); bool result = randomValue <= ignorePercentage; // 如果生成的随机数小于忽略百分比,则返回 true,表示需要忽略请求 if (result) { reason = "流量控制"; return true; } } catch (Exception ex) { reason = $"配置异常"; } return false; } } }