百度翻译(调用百度翻译接口做一个 node 命令行翻译工具)

频道:产品百科 日期: 浏览:137

百度翻译(调用百度翻译接口做一个 node 命令行翻译工具)

效果
实现的是如下效果:
  1. 在命令行中输入  能够翻译英文
  2. fy 方
  3. 输入 能够翻译中文
  4. 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 这个文件
  1. 为了方便代码管理,放在一个单独的文件容易维护。
  2. 为了防止泄密,一旦将代码上传到 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
  1. 进入百度翻译开发平台,注册完善账户
  2. 点击总览,拉到最下面。有申请信息: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 还是泄密了
  1. 因为代码运行时需要使用 appSecret 生成 sign,所以任何人都能通过断点拿到 appSecret
  2. 虽然没有泄密到 GitHub,但是 private.js 上传到了 npm,所以还是泄密了
  3. 只有将生成 sign 的过程放到自己的私有服务器,才能彻底避免泄密


关键词:百度翻译