百度翻译API接入

邱秋 • 2022年03月31日 • 阅读:437 • javascript

注册开发者平台

注册之后顺利拿到APP ID和密钥

开通服务

开通服务之后才能使用对应的api, 这步必不可少。

接入

import axios from 'axios';
import CryptoJS from 'crypto-js'

let text = '要翻译的文字'
let appid = '123456789'  //开发者APP ID
let salt = Date.now().toString()
let key = 'abcdefghijklmn'; //开发者密钥

let sign = CryptoJS.MD5(appid + text + salt + key).toString()

axios({
  method:'post',
  headers:{
    'Content-Type':'application/x-www-form-urlencoded'
  },
  url:'https://fanyi-api.baidu.com/api/trans/vip/translate',
  q:text.toString(CryptoJS.enc.Utf8),
  from:'auto',
  to:'en',
  salt,
  sign
}).then(res=>{
  console.log(res)
  //output 
  /*
  {
    "from": "zh",
    "to": "en",
    "trans_result": [
      {
        "src": "要翻译的文字",
        "dst": "Text to be translated"
      }
    ]
  }
  */
}).catch(e=>{

})

问题

52003 未授权用户

没有开通对应的服务, 开通服务即可。(第二步)

54001 签名错误

先试试翻译英文,看看能否正确翻译。

  • 如果使用 get 请求, q 字段需要 做 URL encode 即: encodeURI(q)

  • 如果使用 post 请求,需要改两处: 1) headers 增加 'Content-Type''application/x-www-form-urlencoded' 2) q 字段进行 Utf8转码

按照文档 提示 :如遇到报 54001 签名错误,请检查您的签名生成方法是否正确,在对 sign 进行拼接和加密时,q 不需要做 URL encode,很多开发者遇到签名报错均是由于拼接 sign 前就做了 URL encode;

让人看成了,签名之后要做 URL encode,感觉误导。所以折腾成这样

let text = '要翻译的文字'

axios({
  method: 'post',
  ...
  url: 'https://fanyi-api.baidu.com/api/trans/vip/translate',
  q: encodeURI(text), //❎ 错误的方法
  ...
})

encodeURI 会进行转码,api无识别。导致签名错误。

let test = encodeURI('要翻译的文字')
console.log(test)
// output
// '%E8%A6%81%E7%BF%BB%E8%AF%91%E7%9A%84%E6%96%87%E5%AD%97'

正确的姿势是进行uft8转码, 而不是url 转码:

import CryptoJS from 'crypto-js'

let test = encodeURI('要翻译的文字')
test = test.toString(CryptoJS.enc.Utf8) // ✅

console.log(test)
// output utf8 code
// '要翻译的文字'

我,秦始皇,打钱!