ReduPlus.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using Microsoft.AspNetCore.Http;
  2. using Microsoft.AspNetCore.Mvc.Controllers;
  3. using Microsoft.AspNetCore.Mvc.Filters;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using dodohold.core;
  9. using Dataoke;
  10. using System.Text.RegularExpressions;
  11. using Org.BouncyCastle.Ocsp;
  12. using System.Diagnostics;
  13. using TencentCloud.Fmu.V20191213.Models;
  14. using Microsoft.VisualBasic;
  15. using System.Text.Json;
  16. using static System.Runtime.InteropServices.JavaScript.JSType;
  17. using System.Security.Cryptography;
  18. using System.Security.Policy;
  19. using Google.Protobuf.WellKnownTypes;
  20. using Microsoft.AspNetCore.Components;
  21. using Org.BouncyCastle.Pqc.Crypto.Ntru;
  22. using System.Web;
  23. using TencentCloud.Scf.V20180416.Models;
  24. namespace molilian.core
  25. {
  26. public partial class ReduPlus
  27. {
  28. string _app_key;
  29. string _app_secret;
  30. string _base_url = "http://api-service.868676.cn/openapi/";
  31. public ReduPlus(string base_url, string app_key, string app_secret)
  32. {
  33. _base_url = base_url;
  34. _app_key = app_key;
  35. _app_secret = app_secret;
  36. #if DEBUG
  37. _base_url = "http://api-service.868676.cn/openapi/";
  38. _app_key = "10024";
  39. _app_secret = "dbbb7b5a216a30e7f7a0b8d9d18a13e8";
  40. #endif
  41. }
  42. private string AddSignToQueryString(Dictionary<string, object> param, string appSecret = "")
  43. {
  44. param.Remove("sign");
  45. var sortedParam = param.OrderBy(p => p.Key).ToDictionary(p => p.Key, p => p.Value);
  46. sortedParam["app_secret"] = appSecret;
  47. var paramsVal = new List<string>();
  48. foreach (var entry in sortedParam)
  49. {
  50. string value;
  51. if (entry.Value is Dictionary<string, object> || entry.Value is List<object>)
  52. {
  53. value = JsonSerializer.Serialize(entry.Value);
  54. }
  55. else
  56. {
  57. value = entry.Value.ToString();
  58. }
  59. paramsVal.Add($"{entry.Key}={value}");
  60. }
  61. var strToSign = string.Join("&", paramsVal);
  62. string sign = strToSign.MD5(false, false);
  63. param["sign"] = sign;
  64. var queryParams = param.Select(entry =>
  65. {
  66. string value = entry.Value is Dictionary<string, object> || entry.Value is List<object>
  67. ? JsonSerializer.Serialize(entry.Value)
  68. : entry.Value.ToString();
  69. return $"{HttpUtility.UrlEncode(entry.Key)}={HttpUtility.UrlEncode(value)}";
  70. });
  71. return string.Join("&", queryParams);
  72. }
  73. public async Task<string> RequestAsync(string path, Dictionary<string, object> param, CancellationToken cancellationToken = default)
  74. {
  75. int timestamp = DateTime.Now.Convert2UnixTimestamp();
  76. param.Add("app_id", _app_key);
  77. param.Add("time", timestamp);
  78. var queryParams = AddSignToQueryString(param, _app_secret);
  79. string url = $"{_base_url}{path}?{queryParams}";
  80. var log = new LoggerLibrary("redu", path.Replace("/", "_")).Info(queryParams);
  81. var client = new WebClientUtility();
  82. client.SetContentType("application/json");
  83. var response = await client.RequestAsync(url, "GET", cancellationToken);
  84. var body = response.Body();
  85. _ = log.Info(body).SaveAsync();
  86. return body;
  87. }
  88. public async Task<string> DouyinParse(string command, CancellationToken cancellationToken = default)
  89. {
  90. string path = "douyin/goodsShare";
  91. Dictionary<string, object> param = [];
  92. if (decimal.TryParse(command, out _))
  93. {
  94. param.Add("product_id", command);
  95. }
  96. else
  97. {
  98. param.Add("command", command);
  99. }
  100. var body = await RequestAsync(path, param, cancellationToken);
  101. var root = body.Convert2JsonElement();
  102. return body;
  103. }
  104. public async Task<string> KuaishouParse(string command, CancellationToken cancellationToken = default)
  105. {
  106. string path = "kuaishou/goodsShare";
  107. Dictionary<string, object> param = [];
  108. if (decimal.TryParse(command, out _))
  109. {
  110. param.Add("product_id", command);
  111. }
  112. else
  113. {
  114. param.Add("command", command);
  115. }
  116. var body = await RequestAsync(path, param, cancellationToken);
  117. var root = body.Convert2JsonElement();
  118. return body;
  119. }
  120. }
  121. }