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();
}
}
}
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
});
}
}
}