前几天写了一个翻译小工具,使用了node.js的http服务器请求,在这里记录一下使用的步骤和注意事项
本章知识点
- 百度翻译平台接口
- md5加密转换
- http.request请求
- typescript转JavaScript并发送的npm
百度翻译平台
首先在 百度翻译平台 注册,申请一个通用翻译的api,标准版的就够用
然后根据文档与支持里的通用翻译文档进行查看和操作
在操作过程中,app ID和密钥都需要保密,如果泄漏有可能别人也会调用,调用的多的话就会扣钱
拼接完整请求:
http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&
salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4
请求参数:
q=apple
from=en
to=zh
appid=2015063000000001(请替换为您的appid)
salt=1435660288(随机码)
平台分配的密钥: 12345678
生成签名sign:
Step1. 拼接字符串1:
拼接appid=2015063000000001+q=apple+salt=1435660288+密钥=12345678得到字符串1:“2015063000000001apple143566028812345678”
Step2. 计算签名:(对字符串1做md5加密)
sign=md5(2015063000000001apple143566028812345678),得到sign=f89f9594663708c1605f3d736d01d2d4
代码会上传的github或其他开源网站,所以这个时候就要使用md5进行加密了
md5加密
百度翻译的请求链接中的请求参数需要用到md5加密转化使用的是32位小写
项目中使用md5
在项目中如果要使用md5需要下载md5库
yarn add md5
因为我使用的是typescript;所以MD5也要搭配typescript使用
yarn add --dev @types/md5
在项目中引入md5
然后直接使用,转化为md5加密
const sign = md5(要加密的内容) ;
http.request请求的使用方式
url地址的请求参数是 ?后面的 :http://api.fanyi.baidu.com/translate?q=apple&from=en&to=zh&appid=2015063000000001& salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4
它并不是固定不变的,当请求的内容不一样时,里面的参数会变化;
所以需要把它拼装在一起
这个时候可以使用querystring.stringify(),它是将参数变成由 & 相连的字符串 q=hi&sign=1234
querystring.stringify({q: 'hi', sign: '1234'})
// q=hi&sign=1234
https.request需要有两个参数,一个是options参数,另一个是回调函数;
options会自动拼接成url,回调函数是请求后对返回数据的操作
response.on是对数据的监控; req.end() 来表示请求的结束
const options = {
hostname: 'api.fanyi.baidu.com',
port: 443,
path: '/api/trans/vip/translate?'+query,
method: 'GET'
};
const req = https.request(options, (response) => {
response.on('data', (d) => {
});
});
req.on('error', (e) => {
console.error(e);
});
req.end();
请求返回来的数据都是Buffer类型的,有时候一次性传不完,还会接着几次传递,所以要拼接数据
完整的代码:
const request = https.request(options, (response) => {
// console.log('状态码:', response.statusCode);
// console.log('请求头:', response.headers);
//监听请求到的结果,并把它变成字符串
let chunks:Buffer[] = [];
response.on('data', (chunk:Buffer) => {
chunks.push(chunk)
});
response.on('end',()=>{
const string = Buffer.concat(chunks).toString();
//定义一个返回结果的类型
type BaiduResult={
error_code?:string;
error_msg?:string;
from:string;
to:string;
trans_result:{src:string,dst:string}[];
}
const object:BaiduResult = JSON.parse(string);
if(object.error_code){
console.log(errorMap[object.error_code] || object.error_msg);
//退出当前任务
process.exit(2)
}else {
console.log(object.trans_result[0].dst)
//退出当前进程,0表示没有错误
process.exit(0)
}
})
});
request.on('error', (e) => {
console.error(e);
});
request.end();
上传到npm
上传之前需要将typescript转化为JavaScript,并且生成dist目录,只上传dist目录的文件
初始化
会生成一个配置文件tsconfig.json
tsc --init
将outDir修改
"outFile": "dist/",
在cli.ts里第一行添加,告诉程序使用node执行
#!/usr/bin/env node
执行tsc,会生成dist目录,所有的ts文件都会转化为js文件
tsc
修改package.json
{
"name": "uath-translate",
"version": "0.0.1",
"main": "dist/main.js",
//使用fy代替 "dist/cli.js"使用时只需要执行 fy 单词
"bin": {
"fy": "dist/cli.js"
},
//只上传dist目录下的js文件
"files": [
"dist/**/*.js"
],
"scripts": {
"start": "ts-node-dev src/main.ts"
},
开始上传
发送之前要把淘宝源修改为npm的官方源
使用 nrm ls 查看源
如果此时你使用的是淘宝源,切换到npm的官方源
nrm use npm
登录你的npm账户
npm adduser
上传
npm public
下载安装测试
在另一个命令行窗口下载,测试
我的npm包名字是uath-translate
npm i -g uath-translate