/// <summary>
        /// 计算TK值
        /// </summary>
        /// <param name="a">待翻译字符串<see cref="string"/></param>
        /// <param name="TKK">谷歌返回TKK<see cref="string"/></param>
        /// <returns>The <see cref="string"/></returns>
        public static string GetTK(this string a, string TKK)
        {
            string[] e = TKK.Split('.');
            int      d = 0;
            int      h = 0;

            int[] g = new int[a.Length * 3];
            h = GetTKHelper.Number(e[0]);
            for (int f = 0; f < a.Length; f++)
            {
                int c = a.charCodeAt(f);
                if (128 > c)
                {
                    g[d++] = c;
                }
                else
                {
                    if (2048 > c)
                    {
                        g[d++] = c >> 6 | 192;
                    }
                    else
                    {
                        if (55296 == (c & 64512) && f + 1 < a.Length && 56320 == (a.charCodeAt(f + 1) & 64512))
                        {
                            c      = 65536 + ((c & 1023) << 10) + a.charCodeAt(++f) & 1023;
                            g[d++] = c >> 18 | 240;
                            g[d++] = c >> 12 & 63 | 128;
                        }
                        else
                        {
                            g[d++] = c >> 12 | 224;
                            g[d++] = c >> 6 & 63 | 128;
                            g[d++] = c & 63 | 128;
                        }
                    }
                }
            }
            int[] g0 = g.Where(x => x != 0).ToArray();
            long  aa = h;

            for (d = 0; d < g0.Length; d++)
            {
                aa += g0[d];
                aa  = Convert.ToInt64(b(aa, "+-a^+6"));
            }
            aa = Convert.ToInt64(b(aa, "+-3^+b+-f"));
            long bb = aa ^ GetTKHelper.Number(e[1]);

            aa = bb;
            aa = aa + bb;
            bb = aa - bb;
            aa = aa - bb;
            if (0 > aa)
            {
                aa = (aa & 2147483647) + 2147483648;
            }
            aa %= (long)1e6;
            return(aa.ToString() + "." + (aa ^ h));
        }
        /// <summary>
        /// The b
        /// </summary>
        /// <param name="a">The a<see cref="long"/></param>
        /// <param name="b">The b<see cref="string"/></param>
        /// <returns>The <see cref="string"/></returns>
        public static string b(long a, string b)
        {
            for (int d = 0; d < b.Length - 2; d += 3)
            {
                char c  = b.charAt(d + 2);
                int  c0 = 'a' <= c?c.charCodeAt(0) - 87 : GetTKHelper.Number(c);

                long c1 = '+' == b.charAt(d + 1) ? a >> c0 : a << c0;
                a = '+' == b.charAt(d) ? a + c1 & 4294967295 : a ^ c1;
            }
            a = GetTKHelper.Number(a);
            return(a.ToString());
        }
Esempio n. 3
0
        protected virtual async Task <IAPIResponse> Execute(IApiRequest request)
        {
            string result    = string.Empty;
            var    apiResult = new ApiResponse();

            apiResult.Code    = -1;
            apiResult.Message = "";
            apiResult.Data    = "";

            string txt = Encoding.UTF8.GetString(request.Body);

            if (request.Url == "google")
            {
                try
                {
                    string mess      = txt;
                    string tkk       = request.TKK;
                    var    tk        = GetTKHelper.GetTK(txt, tkk);
                    string paramData = "client=webapp&sl=en&tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=1&ssel=3&tsel=3&kc=1&tk=" + tk + "&q=" + mess;

                    HttpWebRequest wbRequest = (HttpWebRequest)WebRequest.Create("https://translate.google.cn/translate_a/single");
                    wbRequest.Method      = "POST";
                    wbRequest.ContentType = "application/x-www-form-urlencoded";
                    wbRequest.Accept      = "*/*";
                    wbRequest.Referer     = "https://translate.google.cn/";
                    wbRequest.Host        = "translate.google.cn";
                    wbRequest.Headers.Add("Accept-Encoding", "gzip, deflate, br");
                    wbRequest.Headers.Add("Accept-Language", "zh-Hans-CN, zh-Hans; q=0.5");
                    wbRequest.UserAgent     = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36";
                    wbRequest.ContentLength = Encoding.UTF8.GetByteCount(paramData);
                    using (Stream requestStream = wbRequest.GetRequestStream())
                    {
                        using (StreamWriter swrite = new StreamWriter(requestStream))
                        {
                            swrite.Write(paramData);
                        }
                    }

                    using (HttpWebResponse response = (HttpWebResponse)wbRequest.GetResponse())
                    {
                        string ContentEncoding = response.ContentEncoding.ToLower();
                        Stream stream          = null;
                        if (ContentEncoding.Contains("gzip"))
                        {
                            stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);
                        }
                        else if (ContentEncoding.Contains("deflate"))
                        {
                            stream = new DeflateStream(response.GetResponseStream(), CompressionMode.Decompress);
                        }
                        else
                        {
                            stream = response.GetResponseStream();
                        }
                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                        {
                            result = reader.ReadToEnd();
                        }
                        dynamic tempResult = Newtonsoft.Json.JsonConvert.DeserializeObject(result);
                        //解决“企业\r\n学习”多行文本没有显示全部翻译
                        var           resarry = Newtonsoft.Json.JsonConvert.DeserializeObject(tempResult[0].ToString());
                        var           length  = (resarry.Count) - 1;
                        StringBuilder str     = new StringBuilder();
                        for (int i = 0; i < length; i++)
                        {
                            var res = Newtonsoft.Json.JsonConvert.DeserializeObject(resarry[i].ToString());
                            str.Append(res[0].ToString());
                        }

                        apiResult.Code    = (int)response.StatusCode;
                        apiResult.Message = response.StatusCode.ToString();
                        apiResult.Data    = str.ToString();
                        apiResult.Tags.Add("from-language", "en");
                        apiResult.Tags.Add("to-language", "zh-CN");
                        apiResult.Tags.Add("translate-success", "true");
                    }
                }
                catch (Exception ex)
                {
                    apiResult.Code    = -1;
                    apiResult.Message = ex.Message;
                    apiResult.Data    = "";
                }
            }
            else if (request.Url == "baidu")
            {
                try
                {
                    Request r = new Request();
                    r.from  = "en";
                    r.to    = "zh";
                    r.q     = txt;
                    r.appid = request.APPID;
                    r.key   = request.KEY;
                    Result res    = r.Post <Result>();
                    int    length = res.trans_result.Count;

                    StringBuilder str = new StringBuilder();
                    for (int i = 0; i < length; i++)
                    {
                        str.Append(res.trans_result[i].dst);
                        if (i < length - 1)
                        {
                            str.Append("\r\n");
                        }
                    }

                    apiResult.Code    = (int)0;
                    apiResult.Message = "";
                    apiResult.Data    = str.ToString();
                    apiResult.Tags.Add("from-language", "en");
                    apiResult.Tags.Add("to-language", "zh-CN");
                    apiResult.Tags.Add("translate-success", "true");
                }
                catch (Exception ex)
                {
                    apiResult.Code    = -1;
                    apiResult.Message = ex.Message;
                    apiResult.Data    = "";
                }
            }
            return(apiResult);
        }
        protected virtual async Task <IAPIResponse> Execute(IApiRequest request)
        {
            CookieContainer cookie       = new CookieContainer();
            string          text         = Encoding.UTF8.GetString(request.Body);
            string          tkk          = request.TKK;
            string          fromLanguage = request.Headers["from-language"].ToString();
            string          toLanguage   = request.Headers["to-language"].ToString();
            string          referer      = "https://translate.google.cn/";
            var             html         = "";
            var             tk           = GetTKHelper.GetTK(text, tkk);
            StringBuilder   url          = new StringBuilder();

            url.Append("https://translate.google.cn/translate_a/single?client=webapp");
            url.AppendFormat("&sl={0}", fromLanguage);
            url.AppendFormat("&tl={0}", toLanguage);
            url.Append("&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=1&ssel=0&tsel=0&kc=1");
            url.AppendFormat("&tk={0}", tk);
            url.AppendFormat("&q={0}", HttpUtility.UrlEncode(text));

            //Create empty result
            var apiResult = new ApiResponse();

            try
            {
                var webRequest = WebRequest.Create(url.ToString()) as HttpWebRequest;
                webRequest.Method          = "GET";
                webRequest.CookieContainer = cookie;
                webRequest.Referer         = referer;
                webRequest.Timeout         = 20000;
                webRequest.Headers.Add("X-Requested-With:XMLHttpRequest");
                webRequest.Accept    = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
                webRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36";

                using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
                {
                    using (var reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
                    {
                        html = reader.ReadToEnd();

                        dynamic tempResult = Newtonsoft.Json.JsonConvert.DeserializeObject(html);
                        //解决“企业\r\n学习”多行文本没有显示全部翻译
                        var           resarry = Newtonsoft.Json.JsonConvert.DeserializeObject(tempResult[0].ToString());
                        var           length  = (resarry.Count) - 1;
                        StringBuilder str     = new StringBuilder();
                        for (int i = 0; i < length; i++)
                        {
                            var res = Newtonsoft.Json.JsonConvert.DeserializeObject(resarry[i].ToString());
                            str.Append(res[0].ToString());
                        }

                        apiResult.Code    = (int)webResponse.StatusCode;
                        apiResult.Message = webResponse.StatusCode.ToString();
                        apiResult.Data    = str.ToString();
                        apiResult.Tags.Add("from-language", fromLanguage);
                        apiResult.Tags.Add("to-language", toLanguage);
                        apiResult.Tags.Add("translate-success", "true");

                        reader.Close();
                        webResponse.Close();
                    }
                }
            }
            catch (Exception e)
            {
                apiResult.Code    = -1;
                apiResult.Message = e.Message;
                apiResult.Data    = "";
            }
            return(apiResult);
        }