IT之家学院:编写可在PowerShell中运行的命令行版中英互译词典程序

2017-08-09 17:33IT之家 - 贾福泰
感谢IT之家网友 软媒用户1147623 的线索投递!

感谢IT之家网友 贾福泰 的原创投稿

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":"\u82f9\u679c"}]}

同样的,通过|管道传递给命令 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类库,所以几乎可以完成所有你能想到或想不到的工作。

广告声明:文内含有的对外跳转链接(包括不限于超链接、二维码、口令等形式),用于传递更多信息,节省甄选时间,结果仅供参考,IT之家所有文章均包含本声明。

文章价值:
人打分
有价值还可以无价值
置顶评论
    热门评论
      文章发布时间太久,仅显示热门评论
      全部评论
      一大波评论正在路上
        取消发送
        软媒旗下人气应用

        如点击保存海报无效,请长按图片进行保存分享