调用google翻译

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using LT.Components.Utility;
using Newtonsoft.Json.Linq;


namespace ePlatform.Processor
{
    public static class Google
    {
        /// <summary>
        /// 每个跳转口的状态
        /// </summary>
        class state
        {
            /// <summary>
            /// 自上次成功后失败次数
            /// </summary>
            public int fails;


            /// <summary>
            /// 最后活动时间
            /// </summary>
            public DateTime lasttime;
        }


        /// <summary>
        /// 使用接口的索引号
        /// </summary>
        private volatile static int index = 0;


        /// <summary>
        /// 限制每次取索引的线程锁
        /// </summary>
        private static object locker = new object();


        /// <summary>
        /// 所有外部跳转口队列,self为自身
        /// </summary>
        private volatile static Dictionary<string, state> alls = new Dictionary<string, state>();


        /// <summary>
        /// 有效的跳转口
        /// </summary>
        private static List<string> valids = new List<string>();


        /// <summary>
        /// 自身翻译的代号
        /// </summary>
        private static string self = "self";


        /// <summary>
        /// 调用Google翻译
        /// </summary>
        /// <param name="sl"></param>
        /// <param name="tl"></param>
        /// <param name="text"></param>
        /// <returns></returns>
        public static string Translate(string sl, string tl, string text)
        {
            if (string.IsNullOrEmpty(text))
            {
                return null;
            }
            if (Regex.IsMatch(text, "^[\\s\\d\\--\\.+]+$"))
            {
                return text;
            }
            if (Strings.IsEmail(text))
            {
                return text;
            }


            if (sl == "cn")
            {
                sl = "zh-CN";
            }
            if (tl == "cn")
            {
                tl = "zh-CN";
            }


            /*
             * 随机使用以下地址作为翻译中转
             * 
             * 每次调用时检查,做以下操作
             * 1. 把新的跳转口加入【alls】中
             * 2. 把【alls】中已无效的删除
             * 3. 把失败大于5的且超过5小时的,设置为0
             * 4. 从中产生有效的队列
             * 
             * http://101.1.5.17/htmlgetor.php
             * http://101.1.5.103/data/htmlgetor.php
             * http://demo.sinowg.com/htmlgetor.php
             * http://42.121.121.21/htmlgetor.php
             * http://wogoo2011.hkec01.world-dns.com/htmljumper.php
             * 
             */




            //提交的数据
            text = HttpUtility.UrlEncode(text);
            string data = string.Format("client=t&text={0}&hl=en&sl={1}&tl={2}&ie=UTF-8&oe=UTF-8", text, sl, tl);
            string linker = "";
            int trys = 0;


        //重试一次
        TryAgain:
            trys++;


            //获取索引号
            lock (locker)
            {
                //原始jumpers
                var jumpers = SYS.HtmlJumper.GetList();


                //把新的加入
                foreach (var item in jumpers)
                {
                    if (!alls.ContainsKey(item.Name))
                    {
                        alls.Add(item.Name, new state()
                        {
                            fails = 0,
                            lasttime = DateTime.Now
                        });
                    }
                }


                //把自身加加入
                if (!alls.ContainsKey(self))
                {
                    alls.Add(self, new state()
                    {
                        fails = 0,
                        lasttime = DateTime.Now
                    });
                }


                //把旧的去掉
                foreach (var item in alls.Keys.ToArray<string>())
                {
                    if (item == self)
                    {
                        continue;
                    }
                    if (!jumpers.Exists(delegate(Model.JsonCommonObject jco) { return (jco.Name == item); }))
                    {
                        alls.Remove(item);
                    }
                }


                //清除之前数据
                valids.Clear();
                foreach (var item in alls.Keys.ToArray<string>())
                {
                    //把失败大于5的且超过5小时的,设置为0
                    if (alls[item].fails > 5)
                    {
                        if (((TimeSpan)(DateTime.Now - alls[item].lasttime)).TotalHours > 5)
                        {
                            alls[item].fails = 0;
                        }
                    }


                    //把失败小于等于5加入有效队列中
                    if (alls[item].fails <= 5)
                    {
                        valids.Add(item);
                    }
                }


                //按顺序输出下一条(非严格要求)
                index++;
                if (index >= valids.Count)
                {
                    index = 0;
                }
                linker = valids[index];
            }


            //如果没有外链
            if (linker == "")
            {
                return null;
            }


            //根据随机地址提交翻译内容
            var cookie = new CookieCollection();
            if (linker == self)
            {
                text = Http.PostData("http://translate.google.com.hk/translate_a/t", ref cookie, "utf-8", data);
            }
            else
            {
                text = Http.PostData(linker + "?url=" + HttpUtility.UrlEncode("http://translate.google.com.hk/translate_a/t"), ref cookie, "utf-8", "data=" + HttpUtility.UrlEncode(data));
            }


            //如果为NULL值重试
            if (string.IsNullOrEmpty(text))
            {
                //如果超过2次后
                if (trys > 2)
                {
                    //更新状态
                    if (alls.ContainsKey(linker))
                    {
                        alls[linker].fails++;
                        alls[linker].lasttime = DateTime.Now;
                    }


                    //写入日志
                    SYS.Log.Instance.Error("Google.Translate", "[" + linker + "] null");


                    //返回空值
                    return null;
                }


                //再重试
                goto TryAgain;
            }


            //解释出翻译后的内容
            var o = new StringBuilder();
            var t = "{t:" + text + "}";
            var j = JObject.Parse(t);


            foreach (var item in j["t"][0])
            {
                o.Append(item[0].ToString());
            }


            //返回内容
            return o.ToString();
        }
    }

}


Processor.SYS  下面的一些方法



using System.Collections.Generic;
using ePlatform.Model;


namespace ePlatform.Processor.SYS
{
    public class HtmlJumper
    {
        /// <summary>
        /// 缓存Key
        /// </summary>
        const string CACHEKEY = "SYS.HtmlJumper";


        /// <summary>
        /// 获取列表
        /// </summary>
        /// <returns></returns>
        public static List<JsonCommonObject> GetList()
        {
            //获取缓存
            var cacheobj = Cache.Container.Instance.GetObject(CACHEKEY);
            if (cacheobj != null)
            {
                return (List<JsonCommonObject>)cacheobj;
            }


            //输出容器
            var outs = new List<JsonCommonObject>();


            //当前参数对象
            var content = StcDict.Instance.GetString("SYS.HtmlJumper");
            if (string.IsNullOrEmpty(content))
            {
                return outs;
            }


            //state的数据格式
            //0-0/1,1-0/1,2-0/1
            //0:自身
            //1:Google翻译
            //2:Google搜索
            //3:Baidu搜索


            var list = Utility.JsonToArray(content);
            foreach (var item in list)
            {
                outs.Add(new JsonCommonObject()
                {
                    ID = item["id"].ToString(),
                    Key = item["key"].ToString(),
                    Name = item["name"].ToString(),
                    Value = (item["state"] ?? "").ToString()
                });
            }


            //加入缓存
            Cache.Container.Instance.AddObject(CACHEKEY, outs);


            //返回
            return outs;
        }


        /// <summary>
        /// 保存数据
        /// </summary>
        /// <param name="content"></param>
        public static void Save(string content)
        {
            //更新数据
            StcDict.Instance.Save("SYS.HtmlJumper", content);


            //清除缓存
            StcDict.Instance.ClearCacheData();
            Cache.Container.Instance.Remove(CACHEKEY);
        }
    }
}


json格式数据




namespace ePlatform.Model
{
    /// <summary>
    /// Json数据格式通用对象Model
    /// </summary>
    public class JsonCommonObject
    {
        /// <summary>
        /// JsonCommonObject
        /// </summary>
        public JsonCommonObject()
        {


        }


        /// <summary>
        /// JsonCommonObject
        /// </summary>
        /// <param name="id"></param>
        /// <param name="key"></param>
        /// <param name="name"></param>
        public JsonCommonObject(string id, string key, string name)
        {
            ID = id;
            Key = key;
            Name = name;
        }


        /// <summary>
        /// JsonCommonObject
        /// </summary>
        /// <param name="id"></param>
        /// <param name="key"></param>
        /// <param name="name"></param>
        /// <param name="other"></param>
        public JsonCommonObject(string id, string key, string name, string other)
        {
            ID = id;
            Key = key;
            Name = name;
            Other = other;
        }


        /// <summary>
        /// JsonCommonObject
        /// </summary>
        /// <param name="id"></param>
        /// <param name="key"></param>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <param name="other"></param>
        public JsonCommonObject(string id, string key, string name, string value, string other)
        {
            ID = id;
            Key = key;
            Name = name;
            Value = value;
            Other = other;
        }


        /// <summary>
        /// ID
        /// </summary>
        public string ID
        {
            get;
            set;
        }


        /// <summary>
        /// Key
        /// </summary>
        public string Key
        {
            get;
            set;
        }


        /// <summary>
        /// Name
        /// </summary>
        public string Name
        {
            get;
            set;
        }


        /// <summary>
        /// Value
        /// </summary>
        public string Value
        {
            get;
            set;
        }


        /// <summary>
        /// Other
        /// </summary>
        public string Other
        {
            get;
            set;
        }


        /// <summary>
        /// 复制
        /// </summary>
        /// <returns></returns>
        public JsonCommonObject Clone()
        {
            return (new JsonCommonObject()
            {
                ID = ID,
                Key = Key,
                Name = Name,
                Value = Value,
                Other = Other
            });
        }
    }
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值