C#实现百度翻译功能
2017-03-09 15:29
162 查看
最近工作上没有什么事情,比较清闲,但是闲着又不舒服,在浏览码农网,看到一个博客,自己实现百度翻译的功能,感觉挺有意思的,就自己也学着实现了一下,用了接近一天的时间,最终完成了最基本的功能—–翻译英文单词。这里建议自己(毕竟编程小白的博客也没有几个看)没事多看看码农网,虽然活跃用户不多,但是里面的文章质量都非常高,费说少说,下面进入正题。
要实现翻译功能,其核心就是调用百度开放的翻译API接口,具体内容和文档请查看百度开发者平台–翻译。从开发文档中,可以总结出完成翻译功能的三个步骤:
利用得到APP ID和秘钥,使用MD5算法生成签名
对签名进行加密
将加密后的签名,APPID 秘钥 随机数写入请求字符串
发送请求字符串
接受反馈回来的json数据,进行json数据进行反序列化
最终得到翻译后的中文意思
步骤明确了,剩下来的就是用代码实现了。
百度反馈回来的数据是json格式的,为了写代码方便,首先创建一个类,用于存放json数据,具体代码如下:
由于要实现的功能仅仅只是翻译而已,因此界面非常简单,我的界面如下:
因为秘钥和APPID都是固定的,而随机数不是固定的因此分别定义如下:
双击翻译按钮,得到按钮响应函数:
对签名进行MD5加密函数如下:
获取随机数的函数,虽然在百度开发文档中介绍 salt随机数是整数,但是在整合到请求字符串中,还是会转换为字符串,只不过是一个纯数字字符串罢了,因此下面的函数直接得到一个随机的纯数字字符串。
为了方便,程序还增加了一个快捷键功能,按下回车键时,调用按钮响应函数。
以上代码就是所有的代码,虽然代码比较简单,但是我在写代码的过程中仍然遇到了几个问题,因为我的不熟悉。
定义类存放json数据的时候,属性名称一定要和json数据的key名称一致,否则在对json进行反序列化的时候该属性为null。
当然该程序现在仅有的功能就是翻译单词和简单的句子
总结该程序用到的我不熟悉的知识点:
WebClient类。提供用于将数据发送到和接收来自通过 URI 确认的资源数据的常用方法。具体详情参考WebClient类详解
json数据的序列化和反序列化,json数据序列化和反序列化网上有很多种方法,本程序用的是nuget管理器下载安装的第三方类库Netonsoft.Json,在json反序列化用到了泛型方法
MD5加密算法。C#有一个专门的类库用来实现MD5加密算法的。关于MD5加密,网上已经有很多好的解释,我就不在说了。MD5加密介绍实现
加密主要由下面几句代码完成。
自己都感觉写的好乱,没有把自己的想法清晰的表达出来,唯一的进步或许就是自己已经开始写博客了,相信自己以后会越写条理越清晰。
要实现翻译功能,其核心就是调用百度开放的翻译API接口,具体内容和文档请查看百度开发者平台–翻译。从开发文档中,可以总结出完成翻译功能的三个步骤:
利用得到APP ID和秘钥,使用MD5算法生成签名
对签名进行加密
将加密后的签名,APPID 秘钥 随机数写入请求字符串
发送请求字符串
接受反馈回来的json数据,进行json数据进行反序列化
最终得到翻译后的中文意思
步骤明确了,剩下来的就是用代码实现了。
百度反馈回来的数据是json格式的,为了写代码方便,首先创建一个类,用于存放json数据,具体代码如下:
using System.Collections.Generic; namespace baidufanyi { class TransObj { //注意:就是此类的三个属性名称必须和json数据里面的key一致 public string from { set; get; } public string to { set; get; } public List<TransResult> trans_result { set; get; } } class TransResult { public string src { set; get; } public string dst { set; get; } } }
由于要实现的功能仅仅只是翻译而已,因此界面非常简单,我的界面如下:
因为秘钥和APPID都是固定的,而随机数不是固定的因此分别定义如下:
双击翻译按钮,得到按钮响应函数:
private void translate_Click(object sender, EventArgs e) { zh.Text = null; //WebClient类 提供用于将数据发送到由URI标识的资源,以及从由URI标识的资源接受数据的常用方法 WebClient client = new WebClient(); string txtInput = en.Text; string sign = GetMd5Sign(); string url = string.Format("http://api.fanyi.baidu.com/api/trans/vip/translate?q={0}&from=en&to=zh&appid={1}&salt={2}&sign={3}",txtInput, appid, randomString, sign); byte[] buffer = client.DownloadData(url); //从指定url加载资源 string result = Encoding.UTF8.GetString(buffer); //将指定字节数组中的所有字节解码为一个字符串 TransObj transObj = JsonConvert.DeserializeObject<TransObj>(result); zh.Text = transObj.trans_result[0].dst; }
对签名进行MD5加密函数如下:
private String GetMd5Sign() { ASCIIEncoding encoding = new ASCIIEncoding(); string sign = null; randomString = GetRandomString(); sign = appid + en.Text + randomString + secretKey; byte[] buffer = encoding.GetBytes(sign); //将指定的字符串中的所有字符编码为一个UTF-8字节序列 MD5 md5 = MD5.Create(); //使用Create() 创建默认实例 byte[] hash = md5.ComputeHash(buffer); //开始加密 StringBuilder sb = new StringBuilder(); for(int i = 0; i<hash.Length;i++) { sb.AppendFormat("{0:x2}",hash[i]); } return sb.ToString(); //输出MD5加密后的字符串 }
获取随机数的函数,虽然在百度开发文档中介绍 salt随机数是整数,但是在整合到请求字符串中,还是会转换为字符串,只不过是一个纯数字字符串罢了,因此下面的函数直接得到一个随机的纯数字字符串。
private String GetRandomString() { StringBuilder stringBuilder = new StringBuilder(); Random random = new Random(); for(int i = 0; i<10;i++) { stringBuilder.Append(random.Next(0,9)); } return stringBuilder.ToString(); }
为了方便,程序还增加了一个快捷键功能,按下回车键时,调用按钮响应函数。
private void TranslateForm_KeyDown(object sender, KeyEventArgs e) { if(e.KeyValue == Convert.ToInt32(Keys.Enter)) { translate_Click(null,null); } }
以上代码就是所有的代码,虽然代码比较简单,但是我在写代码的过程中仍然遇到了几个问题,因为我的不熟悉。
定义类存放json数据的时候,属性名称一定要和json数据的key名称一致,否则在对json进行反序列化的时候该属性为null。
当然该程序现在仅有的功能就是翻译单词和简单的句子
总结该程序用到的我不熟悉的知识点:
WebClient类。提供用于将数据发送到和接收来自通过 URI 确认的资源数据的常用方法。具体详情参考WebClient类详解
json数据的序列化和反序列化,json数据序列化和反序列化网上有很多种方法,本程序用的是nuget管理器下载安装的第三方类库Netonsoft.Json,在json反序列化用到了泛型方法
public static T DeserializeObject<T>(string value);
MD5加密算法。C#有一个专门的类库用来实现MD5加密算法的。关于MD5加密,网上已经有很多好的解释,我就不在说了。MD5加密介绍实现
加密主要由下面几句代码完成。
//需要加密的字符串 sign = appid + en.Text + randomString + secretKey; //将指定的字符串中的所有字符编码为一个UTF-8字节序列 byte[] buffer = encoding.GetBytes(sign); //使用Create() 创建默认实例 MD5 md5 = MD5.Create(); //开始加密 byte[] hash = md5.ComputeHash(buffer);
自己都感觉写的好乱,没有把自己的想法清晰的表达出来,唯一的进步或许就是自己已经开始写博客了,相信自己以后会越写条理越清晰。
相关文章推荐
- C# 调用百度翻译API实现翻译功能
- C#借助谷歌翻译实现翻译小工具(一)基本功能实现
- C#调用微软在线翻译API实现简单的翻译功能
- C#实现百度ping推送功能的方法
- C# 实现百度搜索框智能提示功能
- C#实现百度ping功能
- C# 实现百度搜索框智能提示功能
- asp.net c# 调用百度pai实现在线翻译,英文转中文
- 详解Gson使用(五)实现百度翻译功能
- C#调用微软在线翻译API实现简单的翻译功能
- java翻译到mono C#实现系列(4) 利用CountDownTimer类实现倒计时功能 mono版
- Winform实现百度搜索框智能提示功能( C# )
- c#调用google api 实现google网站上翻译全功能(原创)
- Asp.net(C#)实现验证码功能
- 在C#程序中实现插件架构 - Sunmast翻译(转载)
- 怎样用C#实现完整文档打印功能
- 超强功能的正则时间验证,C#实现
- C#函数实现的小功能集合
- Asp.net(C#)实现验证码功能