Pārlūkot izejas kodu

增加 YouDaoAPITools

leiy 1 gadu atpakaļ
vecāks
revīzija
8ed7fe2065

+ 28 - 2
OASystem/OASystem.Api/Controllers/SmallFunController.cs

@@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
 using MySqlX.XDevAPI;
 using OASystem.API.OAMethodLib.JuHeAPI;
+using OASystem.API.OAMethodLib.YouDaoAPI;
 using OASystem.Domain.Dtos.Groups;
 using OASystem.Domain.Dtos.SmallFun;
 using OASystem.Domain.ViewModels.JuHeExchangeRate;
@@ -13,6 +14,7 @@ using System.Collections.Immutable;
 using System.Collections.Specialized;
 using System.Text.Json;
 using System.Text.Json.Nodes;
+using System.Transactions;
 using System.Xml.Linq;
 
 namespace OASystem.API.Controllers
@@ -37,8 +39,7 @@ namespace OASystem.API.Controllers
             this._config = config;
         }
 
-
-        #region 聚合汇率相关
+        #region 聚合API 汇率相关
         /// <summary>
         /// 获取汇率币种
         /// </summary>
@@ -82,7 +83,32 @@ namespace OASystem.API.Controllers
         }
         #endregion
 
+        #region 有道API 文本翻译
+        /// <summary>
+        /// 有道翻译
+        /// </summary>
+        /// <param name="q">准备翻译的文本 目前只支持 中转英</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GeTranslate(string q)
+        {
+            if (string.IsNullOrEmpty(q))
+            {
+                return Ok(JsonView("翻译的文本不能为空!"));
+            }
+
+            var translateData = await YouDaoApiTools.GetReTrans(q);
+
+            if (translateData == null || translateData.Code != 0) 
+            {
+                return Ok(JsonView(false, translateData.Msg));
+            }
+
+            return Ok(JsonView( new { translation = translateData.Data }));
+        }
 
+        #endregion
 
     }
 }

+ 9 - 0
OASystem/OASystem.Api/OAMethodLib/YouDaoAPI/IYouDaoApiService.cs

@@ -0,0 +1,9 @@
+namespace OASystem.API.OAMethodLib.YouDaoAPI
+{
+    /// <summary>
+    /// 有道api 接口
+    /// </summary>
+    public interface IYouDaoApiService
+    {
+    }
+}

+ 19 - 0
OASystem/OASystem.Api/OAMethodLib/YouDaoAPI/YouDaoApiService.cs

@@ -0,0 +1,19 @@
+namespace OASystem.API.OAMethodLib.YouDaoAPI
+{
+    /// <summary>
+    /// 有道api
+    /// </summary>
+    public class YouDaoApiService:IYouDaoApiService
+    {
+        
+
+        ///// <summary>
+        ///// 获取翻译结果
+        ///// </summary>
+        ///// <returns></returns>
+        //public Task<Result> GetTranslate()
+        //{ 
+        //    return 
+        //}
+    }
+}

+ 167 - 0
OASystem/OASystem.Api/OAMethodLib/YouDaoAPI/YouDaoApiTools.cs

@@ -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
+    }
+}

+ 6 - 0
OASystem/OASystem.Api/Program.cs

@@ -11,6 +11,7 @@ using OASystem.Domain.Dtos.Groups;
 using Microsoft.AspNetCore.Http.Features;
 using Microsoft.AspNetCore.Server.Kestrel.Core;
 using OASystem.API.OAMethodLib.JuHeAPI;
+using OASystem.API.OAMethodLib.YouDaoAPI;
 
 var builder = WebApplication.CreateBuilder(args);
 var basePath = AppContext.BaseDirectory;
@@ -236,7 +237,12 @@ builder.Services.AddScoped<IMapper, Mapper>();
 builder.Services.AddControllersWithViews();
 builder.Services.AddSingleton<IJuHeApiService, JuHeApiService>();
 builder.Services.AddHttpClient("PublicJuHeApi", c => c.BaseAddress = new Uri("http://web.juhe.cn"));
+#endregion
 
+#region ÓеÀAPI ·þÎñ
+builder.Services.AddControllersWithViews();
+builder.Services.AddSingleton<IYouDaoApiService, YouDaoApiService>();
+builder.Services.AddHttpClient("PublicYouDaoApi", c => c.BaseAddress = new Uri("https://openapi.youdao.com"));
 #endregion
 
 var app = builder.Build();