YouDaoApiTools.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using OASystem.Domain.ViewModels.JuHeExchangeRate;
  2. using System.Text.Json;
  3. namespace OASystem.API.OAMethodLib.YouDaoAPI
  4. {
  5. /// <summary>
  6. /// 有道API Tools
  7. /// </summary>
  8. public static class YouDaoApiTools
  9. {
  10. private static readonly HttpClient _httpClient = new HttpClient { BaseAddress = new Uri("https://openapi.youdao.com") };
  11. //private static readonly IHttpClientFactory _httpClientFactory;
  12. private static readonly string _appKey = "0fe3bc01e109ed36"; //应用ID
  13. private static readonly string _appSecret = "1f2x9TrqJfSBEJ8iH9GEFGgTyaYGjEry"; //应用密钥
  14. /// <summary>
  15. /// 有道翻译
  16. /// </summary>
  17. /// <param name="str"></param>
  18. /// <param name="aimLanguage"></param>
  19. /// <returns></returns>
  20. public static async Task<Result> GetReTrans(string str, string from = "zh-CHS", string to = "en")
  21. {
  22. var result = new Result();
  23. #region MyRegion
  24. if (string.IsNullOrEmpty(str))
  25. {
  26. result.Msg = "翻译文本为空!";
  27. return result;
  28. }
  29. #endregion
  30. string url = string.Format("/api");
  31. #region 请求参数处理
  32. string q = System.Web.HttpUtility.UrlEncode(str, Encoding.UTF8);
  33. //input的计算方式为:input=q前10个字符 + q长度 + q后10个字符(当q长度大于20)或 input=q字符串(当q长度小于等于20);
  34. string input = q.Length <= 20 ? q : q.Substring(0, 10) + q.Length + q.Substring(q.Length - 10, 10);
  35. string salt = DateTime.Now.Millisecond.ToString();
  36. string curtime = GetUTCTime(true).ToString(); //UTC毫秒时间戳
  37. //sign = sha256(应用ID + input + salt + curtime + 应用密钥);
  38. string signStr = _appKey + input + salt + curtime + _appSecret;
  39. string sign = SHA256EncryptString(signStr);
  40. #endregion
  41. var reqData = new FormUrlEncodedContent(
  42. new List<KeyValuePair<string, string>>()
  43. {
  44. new KeyValuePair<string, string>("q",q), //待翻译文本 必须是UTF-8编码
  45. new KeyValuePair<string, string>("from",from), //源语言
  46. new KeyValuePair<string, string>("to",to), //目标语言
  47. new KeyValuePair<string, string>("appKey",_appKey), //应用ID
  48. new KeyValuePair<string, string>("salt",salt), //UUID
  49. new KeyValuePair<string, string>("sign",sign), //签名 sha256(应用ID+input+salt+curtime+应用密钥)
  50. new KeyValuePair<string, string>("signType","v3"), //签名类型
  51. new KeyValuePair<string, string>("curtime",curtime), //TUC 时间戳
  52. });
  53. var reTransReq = await _httpClient.PostAsync(url, reqData);
  54. if (reTransReq.IsSuccessStatusCode)
  55. {
  56. var strResponse = await reTransReq.Content.ReadAsStringAsync();
  57. var strResponse1 = System.Web.HttpUtility.UrlDecode(strResponse, System.Text.Encoding.UTF8);
  58. var trans = JsonConvert.DeserializeObject<dynamic>(strResponse1);
  59. string errorCode = trans["errorCode"].ToString();
  60. if (errorCode == "0")
  61. {
  62. result.Code = 0;
  63. var translation = JsonConvert.DeserializeObject<List<string>>(trans["translation"].ToString());
  64. result.Msg = string.Format(@"成功!");
  65. result.Data = translation;
  66. }
  67. else
  68. {
  69. result.Msg = string.Format(@"有道翻译API [Error:{0}]", errorCode);
  70. }
  71. }
  72. else
  73. {
  74. result.Msg = "接口请求失败!";
  75. }
  76. return result;
  77. }
  78. #region SHA256加密
  79. /// <summary>
  80. /// SHA256加密
  81. /// </summary>
  82. /// <param name="data"></param>
  83. /// <returns></returns>
  84. public static string SHA256EncryptString(string data)
  85. {
  86. byte[] bytes = Encoding.UTF8.GetBytes(data);
  87. byte[] hash = SHA256Managed.Create().ComputeHash(bytes);
  88. StringBuilder builder = new StringBuilder();
  89. for (int i = 0; i < hash.Length; i++)
  90. {
  91. builder.Append(hash[i].ToString("x2"));
  92. }
  93. return builder.ToString();
  94. }
  95. /// <summary>
  96. /// SHA256加密
  97. /// </summary>
  98. /// <param name="StrIn">待加密字符串</param>
  99. /// <returns>加密数组</returns>
  100. public static Byte[] SHA256EncryptByte(string StrIn)
  101. {
  102. var sha256 = new SHA256Managed();
  103. var Asc = new ASCIIEncoding();
  104. var tmpByte = Asc.GetBytes(StrIn);
  105. var EncryptBytes = sha256.ComputeHash(tmpByte);
  106. sha256.Clear();
  107. return EncryptBytes;
  108. }
  109. #endregion
  110. #region UTC时间戳
  111. /// <summary>
  112. /// 获取utc时间
  113. /// </summary>
  114. /// <param name="type">true 秒 flase 毫秒</param>
  115. /// <returns></returns>
  116. public static long GetUTCTime(bool type)
  117. {
  118. TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
  119. return type ? Convert.ToInt64(ts.TotalSeconds) : Convert.ToInt64(ts.TotalMilliseconds);
  120. }
  121. /// <summary>
  122. /// 将当前时间戳转换至Datetime
  123. /// </summary>
  124. /// <param name="timeStamp"></param>
  125. /// <returns></returns>
  126. public static DateTime ConvertUTCToDateTime(long timeStamp)
  127. {
  128. DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); // 当地时区
  129. DateTime dt = startTime.AddSeconds(timeStamp);
  130. return dt;
  131. }
  132. /// <summary>
  133. /// 把datetime转utc时间戳
  134. /// </summary>
  135. /// <param name="time"></param>
  136. /// <returns></returns>
  137. public static int ConvertDateTimeToUTC(DateTime time)
  138. {
  139. double intResult = 0;
  140. DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
  141. intResult = (time - startTime).TotalSeconds;
  142. return (int)intResult;
  143. }
  144. #endregion
  145. }
  146. }