结合node commander的命令行工具,和百度翻译接口,以及https模块的request构造请求,制作一个命令行翻译工具
一. 百度翻译接口
百度翻译有免费可用的翻译API接口。输入需要将要翻译的单词,源语言,目标语言,用户id,随机码salt,密钥作为参数放在请求url中,其中还需要一个签名sign,它就是用md5对上述信息加密后的32位小写字母。
将以上形成的网址向服务器发出请求,就会得到如下的翻译内容:其中真正的翻译结果在trans_result 里边的dst属性中。这里显示的是utf-8编码。
所以我们要做的就是,通过https的request方法,构造上述的一个请求。用户通过命令行输入要翻译的单词,我们通过node 命令行工具拿到这个单词,发请求,然后得到响应,也就是翻译结果。
二. 在ts文件中运行node
因为node是用js写的,所以在ts文件中引入node模块会找不到。需要安装node的ts类型声明文件。 yarn add --dev @types/node 一般类型文件是给开发者看的,所以加--dev
三. commander js
创建一个cli.ts 。还是按照commander的文档,本次我们熟悉一下.name .usage .arguments 的用法。
const {translate}=require('./main')
const { program } = require('commander');
program.version('0.0.1')
.name('fy')
.usage('<english>')
.arguments('<English>')
.action((english)=>{
translate(english)
})
program.parse(process.argv);
如果不添加这些选项,我们在终端运行ts-node-dev cli -h 打印出帮助信息是这样的:
帮助信息的首行提示是:Usage: cli [options] Usage后边正常是node运行的文件名。
添加.name .usage 后,再次运行,帮助信息的首行提示就是我们指定的选项:代表<english> 是一个必选项
然后用户需要传一个参数,即要翻译的单词。需要用到.arguments 命令行参数。使用<>表示必填项,后可接.action 定义处理函数。所以我们要接收到用户传的参数,然后调用一个translate函数,进行翻译。
四. https.request
通过命令行拿到用户给的单词后,就需要使用https.request函数构造一个请求,向那个百度翻译接口发出。
以下是node 官网上的示例代码。构造一个options对象,里边包含请求url的各种信息,比如主机,端口,路径,请求方法。然后通过https.request方法创建一个请求,在第二个参数回调中,打印出响应内容。
const https = require('https');
const options = {
hostname: 'encrypted.google.com',
port: 443,
path: '/',
method: 'GET'
};
const req = https.request(options, (res) => {
console.log('状态码:', res.statusCode);
console.log('请求头:', res.headers);
res.on('data', (d) => {
process.stdout.write(d);
});
});
req.on('error', (e) => {
console.error(e);
});
req.end();
我们只需要把options对象中的url信息修改为那个翻译端口url就可以了。这是给的一个url例子:https://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4
新的路径就是/api/trans/vip/translate ,多了很多查询字符串。我们需要把各种信息拼接成查询字符串。这里要用到一个新的node模块-querystring
1. node - querystring
querystring 模块提供用于解析和格式化 URL 查询字符串的实用工具。
在这里我们只需使用querystring.stringify这个方法,通过遍历对象的自身属性从给定的 obj 生成 URL 查询字符串。
querystring.stringify({ q: 'apple', x: 'xxx' });
// 返回 'q=apple&x=xxx'
2. md5
查询字符串中还有一个sign,它是用md5对各种信息加密得到的一个字符串。node里没有md5,但是有一个md5的npm包。 md5官网
首先安装:yarn add md5
但是这个md5中没有类型声明文件,也就是说不能在ts文件中使用,所以还需要再安装一个类型文件 yarn add --dev @types/md5 然后就可以看到目录中的node_modules目录下有了md5的声明文件:
使用非常简单:
const md5 = require('md5');
console.log(md5('message'));
传入一个字符串,返回经过md5加密的:78e731027d8fd50ed642340b7c9a63b3
3. 构造请求并接收响应内容
与POST方法上传数据类似。我们发出一个请求,在回调中接收响应过来的数据。通过监听response的data 事件,每有一块数据发过来,就推到数据中。监听end事件,当不再有数据,接收完毕,将Buffer类型的数据转换成我们想要的类型的形式。
const request = https.request(options, (response) => {
console.log('状态码:', response.statusCode);
const chunks=[]
response.on('data',(chunk)=>{
chunks.push(chunk)
})
response.on('end',()=>{
const data=Buffer.concat(chunks) // 把数据块连接到一起
console.log(data);
const string=data.toString()
console.log(string);
const result=JSON.parse(string)
console.log(result);
})
});
在终端输入以下命令:ts-node-dev cli hello 就会向百度翻译接口发起一个翻译hello这个单词的请求。会得到以下内容:
通过Buffer.concat连接起来的data,是一堆Buffer类型的编码。然后用data.toString()变成字符串,就是返回结果的一个JSON字符串格式。最后用JSON.parse变成相应的对象,就是真正的结果了。
最后我们要做的就是拿出这个结果的trans_result中的dst,才是真正的翻译结果。