百度翻译(调用百度翻译接口做一个 node 命令行翻译工具)
效果
实现的是如下效果:
- 在命令行中输入 能够翻译英文
- fy 方
- 输入 能够翻译中文
- fy round
点击输入图片描述(最多30字)
安装依赖
yarn global add typescript # 用来编译ts文件成jsyarn global add ts-node-dev@1.19.1 # 在开发时用来运行ts文件yarn add commander@3.0.2 # 命令行库yarn add md5@2.3.0 # md5加密库yarn add --dev @types/md5@2.1.33 # ts代码提示的yarn add --dev @types/node@12.11.2 # ts代码提示的yarn global add nrm # 管理npm源的工具
如果你的ts-node-dev版本太高,写ts的时候特别严格,如果你解决不了建议小白使用1.19.1版本以下的
点击输入图片描述(最多30字)
创建文件
在 src 目录下创建 , ,
cli.ts
main.ts
private.ts
cli.ts
#!/usr/bin/env nodeimport * as commander from 'commander';import {translate} from './main';
const program = new commander.Command();
program.version('0.0.1') .name('fy') .usage(') .arguments('English') .action(function (english) { translate(english); });
program.parse(process.argv);
'
private.ts
appId 和 appSecret 填写百度翻译的账号配置,下面会说。
将 appId 和 appSecret 单独写在一个文件,并且 ignore 这个文件
- 为了方便代码管理,放在一个单独的文件容易维护。
- 为了防止泄密,一旦将代码上传到 github,就 appSecret 就公开了
export const appId='???'export const appSecret='???'
main.ts
- 使用 构造 查询参数
- querystring
- query
- 使用 发起 请求
- https.request
- https
import * as https from 'https';import * as querystring from 'querystring';import md5 = require('md5');import {appId, appSecret} from './private';
type ErrorMap = { [key: string]: string}const errorMap: ErrorMap = { 52001: '请求超时', 52002: '系统错误', 52003: '未授权用户', 54000: '必填参数为空', 54001: '签名错误', 54003: '访问频率受限', 54004: '账户余额不足', 54005: '长query请求频繁', 58000: '客户端IP非法', 58001: '译文语言方向不支持', 58002: '服务当前已关闭', 90107: '认证未通过或未生效',};
export const translate = (word: string) => { const salt = Math.random(); const sign = md5(appId + word + salt + appSecret); let from, to; if (/[a-zA-Z]/.test(word[0])) { // 英译中 from = 'en'; to = 'zh'; } else { // 中译英 from = 'zh'; to = 'en'; } const query: string = querystring.stringify({ q: word, from, to, salt, sign, appid: appId, }); const options = { hostname: 'api.fanyi.baidu.com', port: 443, path: '/api/trans/vip/translate?' + query, method: 'GET' }; const request = https.request(options, (response) => { let chunks: Buffer[] = []; response.on('data', (chunk) => { 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 { object.trans_result.map(obj => { console.log(obj.dst); }); process.exit(0); } }); });
request.end();};
使用百度翻译API
- 进入百度翻译开发平台,注册完善账户
- 点击总览,拉到最下面。有申请信息:APP ID 和 secret 秘钥
点击输入图片描述(最多30字)
点击输入图片描述(最多30字)
2. 进入通用翻译API接入文档
点击输入图片描述(最多30字)
经过阅读API文档知道,完整的请求地址应该是这样的
http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4
字段名
类型
是否必填
描述
备注
发布到npm
在命令行中输入下列命令,初始化
tsc --init
在命令行中输入下列命令,将 ts 文件编译成 js 文件。
如果 ts 没有明确定义类型,可能会有报错,需要你严格定义类型。
tsc -p .
在 package.json 中加入如下配置
"name": "fanyi-sili-1","version": "0.0.1","main": "dist/main.js","bin": { "fy": "dist/cli.js"},"files": [ "dist/**/*.js"],
使用 npm 官方源
nrm use npm
登录
npm login
发布
npm publish
最终 appSecret 还是泄密了
- 因为代码运行时需要使用 appSecret 生成 sign,所以任何人都能通过断点拿到 appSecret
- 虽然没有泄密到 GitHub,但是 private.js 上传到了 npm,所以还是泄密了
- 只有将生成 sign 的过程放到自己的私有服务器,才能彻底避免泄密