|
@@ -0,0 +1,167 @@
|
|
|
|
+using OASystem.Domain.ViewModels.JuHeExchangeRate;
|
|
|
|
+using System.Text.Json;
|
|
|
|
+
|
|
|
|
+namespace OASystem.API.OAMethodLib.YouDaoAPI
|
|
|
|
+{
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 有道API Tools
|
|
|
|
+ /// </summary>
|
|
|
|
+ public static class YouDaoApiTools
|
|
|
|
+ {
|
|
|
|
+ private static readonly HttpClient _httpClient = new HttpClient { BaseAddress = new Uri("https://openapi.youdao.com") };
|
|
|
|
+ //private static readonly IHttpClientFactory _httpClientFactory;
|
|
|
|
+ private static readonly string _appKey = "0fe3bc01e109ed36"; //应用ID
|
|
|
|
+ private static readonly string _appSecret = "1f2x9TrqJfSBEJ8iH9GEFGgTyaYGjEry"; //应用密钥
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 有道翻译
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="str"></param>
|
|
|
|
+ /// <param name="aimLanguage"></param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ public static async Task<Result> GetReTrans(string str, string from = "zh-CHS", string to = "en")
|
|
|
|
+ {
|
|
|
|
+ var result = new Result();
|
|
|
|
+ #region MyRegion
|
|
|
|
+ if (string.IsNullOrEmpty(str))
|
|
|
|
+ {
|
|
|
|
+ result.Msg = "翻译文本为空!";
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ #endregion
|
|
|
|
+
|
|
|
|
+ string url = string.Format("/api");
|
|
|
|
+
|
|
|
|
+ #region 请求参数处理
|
|
|
|
+
|
|
|
|
+ string q = System.Web.HttpUtility.UrlEncode(str, Encoding.UTF8);
|
|
|
|
+ //input的计算方式为:input=q前10个字符 + q长度 + q后10个字符(当q长度大于20)或 input=q字符串(当q长度小于等于20);
|
|
|
|
+ string input = q.Length <= 20 ? q : q.Substring(0, 10) + q.Length + q.Substring(q.Length - 10, 10);
|
|
|
|
+ string salt = DateTime.Now.Millisecond.ToString();
|
|
|
|
+ string curtime = GetUTCTime(true).ToString(); //UTC毫秒时间戳
|
|
|
|
+ //sign = sha256(应用ID + input + salt + curtime + 应用密钥);
|
|
|
|
+ string signStr = _appKey + input + salt + curtime + _appSecret;
|
|
|
|
+ string sign = SHA256EncryptString(signStr);
|
|
|
|
+ #endregion
|
|
|
|
+
|
|
|
|
+ var reqData = new FormUrlEncodedContent(
|
|
|
|
+ new List<KeyValuePair<string, string>>()
|
|
|
|
+ {
|
|
|
|
+ new KeyValuePair<string, string>("q",q), //待翻译文本 必须是UTF-8编码
|
|
|
|
+ new KeyValuePair<string, string>("from",from), //源语言
|
|
|
|
+ new KeyValuePair<string, string>("to",to), //目标语言
|
|
|
|
+ new KeyValuePair<string, string>("appKey",_appKey), //应用ID
|
|
|
|
+ new KeyValuePair<string, string>("salt",salt), //UUID
|
|
|
|
+ new KeyValuePair<string, string>("sign",sign), //签名 sha256(应用ID+input+salt+curtime+应用密钥)
|
|
|
|
+ new KeyValuePair<string, string>("signType","v3"), //签名类型
|
|
|
|
+ new KeyValuePair<string, string>("curtime",curtime), //TUC 时间戳
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ var reTransReq = await _httpClient.PostAsync(url, reqData);
|
|
|
|
+ if (reTransReq.IsSuccessStatusCode)
|
|
|
|
+ {
|
|
|
|
+ var strResponse = await reTransReq.Content.ReadAsStringAsync();
|
|
|
|
+ var strResponse1 = System.Web.HttpUtility.UrlDecode(strResponse, System.Text.Encoding.UTF8);
|
|
|
|
+
|
|
|
|
+ var trans = JsonConvert.DeserializeObject<dynamic>(strResponse1);
|
|
|
|
+ string errorCode = trans["errorCode"].ToString();
|
|
|
|
+ if (errorCode == "0")
|
|
|
|
+ {
|
|
|
|
+ result.Code = 0;
|
|
|
|
+ var translation = JsonConvert.DeserializeObject<List<string>>(trans["translation"].ToString());
|
|
|
|
+ result.Msg = string.Format(@"成功!");
|
|
|
|
+ result.Data = translation;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ result.Msg = string.Format(@"有道翻译API [Error:{0}]", errorCode);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ result.Msg = "接口请求失败!";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ #region SHA256加密
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// SHA256加密
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="data"></param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ public static string SHA256EncryptString(string data)
|
|
|
|
+ {
|
|
|
|
+ byte[] bytes = Encoding.UTF8.GetBytes(data);
|
|
|
|
+ byte[] hash = SHA256Managed.Create().ComputeHash(bytes);
|
|
|
|
+
|
|
|
|
+ StringBuilder builder = new StringBuilder();
|
|
|
|
+ for (int i = 0; i < hash.Length; i++)
|
|
|
|
+ {
|
|
|
|
+ builder.Append(hash[i].ToString("x2"));
|
|
|
|
+ }
|
|
|
|
+ return builder.ToString();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// SHA256加密
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="StrIn">待加密字符串</param>
|
|
|
|
+ /// <returns>加密数组</returns>
|
|
|
|
+ public static Byte[] SHA256EncryptByte(string StrIn)
|
|
|
|
+ {
|
|
|
|
+ var sha256 = new SHA256Managed();
|
|
|
|
+ var Asc = new ASCIIEncoding();
|
|
|
|
+ var tmpByte = Asc.GetBytes(StrIn);
|
|
|
|
+ var EncryptBytes = sha256.ComputeHash(tmpByte);
|
|
|
|
+ sha256.Clear();
|
|
|
|
+ return EncryptBytes;
|
|
|
|
+ }
|
|
|
|
+ #endregion
|
|
|
|
+
|
|
|
|
+ #region UTC时间戳
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 获取utc时间
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="type">true 秒 flase 毫秒</param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ public static long GetUTCTime(bool type)
|
|
|
|
+ {
|
|
|
|
+ TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
|
|
|
+ return type ? Convert.ToInt64(ts.TotalSeconds) : Convert.ToInt64(ts.TotalMilliseconds);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 将当前时间戳转换至Datetime
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="timeStamp"></param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ public static DateTime ConvertUTCToDateTime(long timeStamp)
|
|
|
|
+ {
|
|
|
|
+ DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); // 当地时区
|
|
|
|
+ DateTime dt = startTime.AddSeconds(timeStamp);
|
|
|
|
+ return dt;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 把datetime转utc时间戳
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="time"></param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ public static int ConvertDateTimeToUTC(DateTime time)
|
|
|
|
+ {
|
|
|
|
+ double intResult = 0;
|
|
|
|
+ DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
|
|
|
|
+ intResult = (time - startTime).TotalSeconds;
|
|
|
|
+ return (int)intResult;
|
|
|
|
+ }
|
|
|
|
+ #endregion
|
|
|
|
+ }
|
|
|
|
+}
|