时间:2017-08-10 来源:u小马 访问:次
1、首先介绍原理
就是调用百度翻译开放平台的在线API进行英汉单词互译。该API为 http://api.fanyi.baidu.com/api/trans/vip/translate 后面加参数,参数列表如下:
q:要翻译的单词
from:要翻译的单词的语言(zh / en)
to :要翻译成的语言(zh / en)
appid:百度翻译开放平台申请的开发appid
salt:Unix时间戳(就是从1970/1/1零点到当前时间的总毫秒数,13位)
sign:验证参数,将appid + q + salt + key(同样是在百度翻译开放平台里获取)进行md5混淆
2、逐行介绍代码
文章最后面有完整代码,所以头疼代码的朋友可以跳过此段直接滚动到最后
function SimpleTranslate ($word) { ***(其余所有代码都在该函数体内) }
声明函数,函数名为SimpleTranslate,该方法只有一个参数,参数名为word(就是要翻译的单词)
$timeStamp = [Long]([Double]::Parse((Get-Date -UFormat %s)) * 1000)
获取Unix时间戳,这一行先用PowerShell命令 Get-Date -UFormat %s获取当前时间并格式化为Unix时间(带秒的小数)
但是这个时间值是字符串类型,所以用.NET的类 [Double]::Parse来转为数值类型,之后乘以1000,并强转为Long来转为整型
$appid = "2015063000000001"
$key = "12345678"
$tohash = $appid + $word + $timeStamp + $key
这三行声明appid和key的变量,并且将appid, word(q), timeStamp(salt), key四个字符串连接起来准备进行md5混淆
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$utf8 = new-object -TypeName System.Text.UTF8Encoding
$sign = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($tohash))).Replace("-", "").ToLower()
这三行使用.NET的方法进行md5,new-object相当于C#中的new,所以这三行相当于
var md5 = new MD5CryptoServiceProvider();
var utf8 = new UTF8Encoding();
BitConverter.ToString(md5.ComputeHash(utf8.GetBytes(tohash))).Replace("-","").ToLower();
因为 BitConverter处理过的字符串是98-62-51-6D-7E-7A-30-D3-17-1F-B8-42-B1-50-E0-88这种样子,所以去除“-”,并且转为小写
这一段声明params变量,类型其实是HashTable
$lngCheck = [System.Text.RegularExpressions.Regex]::Match($word, "[u4e00-u9fa5]").Success
这一段又是.NET的方法,相当于
var lngCheck = Regex.Match(word,"[u4e00-u9fa5]").Success
判断字符串word中是否有中文,如果有为true,否则为false
很简单,如果单词是中文,那么从中文翻译为英文,所以from = zh, to = en;反之则反
到此时所有参数都已经准备好了,之后准备调用了
$querystring = ""
$params.GetEnumerator() | ForEach-Object {$querystring += $_.Name + "=" + $_.Value + "&"}
这段比较复杂,|符号是管道传递,把符号左面的运算结果作为参数传到符号右面的表达式中
左面的表达式$params.GetEnumerator()返回了哈希表类型params的枚举数,传递到 ForEach-Object,所以这一行就是把params中的每一个值进行一次大括号里的操作,key=value并且后面加&(虽然感觉和c#里的foreach一样,功能也一样,但是这里是PowerShell标准表达式)
$url = "http://api.fanyi.baidu.com/api/trans/vip/translate?" + $querystring
所以这里的url就是最后要访问的完整url了
$rsp = wget $url | ConvertFrom-Json
使用 wget 来访问url(了解unix的朋友会发现这里的wget和unix命令相似,是的,PowerShell中把很多命令通过Alias重命名为unix相似的命令,就是为了让习惯unix命令的开发人员容易上手,包括ls,ps等等)这里的wget实际上是Invoke-WebRequest
这个url获取的结果是一个json,格式为
{"from":"en","to":"zh","trans_result":[{"src":"apple","dst":"u82f9u679c"}]}
同样的,通过|管道传递给命令 ConvertFrom-Json将json转化为可操作的类型(PSCustomeObject)
echo $rsp.trans_result[0].dst
最后通过echo命令输出到控制台,一切就ok了
3、完整代码
下载地址:点击这里
4、使用方法
将完整代码拷贝并保存为psm1文件,比如translate.psm1(注意扩展名)
然后在左下角win徽标上点右键->windows PowerShell,或者小娜搜索PowerShell来打开PowerShell
然后通过Import-Module来加载刚才保存的translate.psm1文件
然后就可以通过SimpleTranslate +词语来进行翻译了
5、写在最后的话
PowerShell因为可以原生调用.NET类库,所以几乎可以完成所有你能想到或想不到的工作。