R语言调用百度翻译API接口

httr
rvest
Author

hcl

Published

October 25, 2022

API接口文档

百度翻译API的url http://api.fanyi.baidu.com/api/trans/vip/translate 接口文档:https://fanyi-api.baidu.com/product/113

接入方式 通用翻译API通过 HTTP 接口对外提供多语种互译服务。您只需要通过调用通用翻译API,传入待翻译的内容,并指定要翻译的源语言(支持源语言语种自动检测)和目标语言种类,就可以得到相应的翻译结果。

通用翻译API HTTPS 地址: https://fanyi-api.baidu.com/api/trans/vip/translate

签名生成方法

签名是为了保证调用安全,使用 MD5 算法生成的一段字符串,生成的签名长度为 32 位,签名中的英文字符均为小写格式。

生成方法:

  • Step1. 将请求参数中的APPID(appid),翻译query(q,注意为UTF-8编码),随机数(salt),以及平台分配的密钥(可在管理控制台查看)按照 appid+q+salt+密钥的顺序拼接得到字符串 1。 Step2. 对字符串 1 做 MD5,得到 32 位小写的 sign。 注: 1. 待翻译文本(q)需为 UTF-8 编码;
  • 2.在生成签名拼接 appid+q+salt+密钥字符串时,q不需要做URLencode,在生成签名之后,发送 HTTP 请求之前才需要对要发送的待翻译文本字段q 做 URL encode;
  • 3.如遇到报 54001签名错误,请检查您的签名生成方法是否正确,在对sign进行拼接和加密时,q不需要做 URL encode,很多开发者遇到签名报错均是由于拼接 sign 前就做了URL encode; - 4.在生成签名后,发送 HTTP 请求时,如果将 query拼接在URL上,需要对 query 做 URL encode。

输入参数

请求方式: 可使用 GET 或 POST 方式,如使用POST方式,Content-Type请指定为:application/x-www-form-urlencoded字符编码:统一采用UTF-8编码格式

query长度:为保证翻译质量,请将单次请求长度控制在 6000bytes以内(汉字约为输入参数 2000 个)

输出参数

返回的结果是json格式,包含以下字段:

字段名 类型 描述 备注
from string 源语言 返回用户指定的语言,或者自动检测出语种
to string 目标语言 返回用户指定的目标语言
trans_result array 翻译结果 包括src和dst字段

R语言代码

创建URL

下面使用R语言代码实现说明文档中的接入举例,即创建URL。 首先需要准备以下字段(变量):

q = "apple" # 翻译内容
from = "en" # 输入语种
to = "zh" # 输出语种
appid = "2015063000000001" # 用户APP ID
salt = "1435660288" # 随机码
key = "12345678" # 用户密钥
提示

需要将appid和key替换成自己申请的账户ID和密钥。

# URL的通用地址:
url1 = "https://fanyi-api.baidu.com/api/trans/vip/translate"

# 生成签名sign。说明文档中介绍这个过程需要进行MD5加密,在R语言中可以使用openssl工具包中的md5()函数:
sign = paste0(appid, q, salt, key)
library(openssl)
sign = md5(sign)
 
sign
[1] "ac5d3d18797ba7462a02122cbbb5c17f"
# URL的查询地址
url2 <- paste0("q=",q, "&from=", from, "&to=", to,
               "&appid=", appid, "&salt=", salt,
               "&sign=", sign)
url2
[1] "q=apple&from=en&to=zh&appid=20191211000365104&salt=143566022288&sign=ac5d3d18797ba7462a02122cbbb5c17f"
# 拼接形成完整的URL
url = paste0(url1, "?", url2)

url
[1] "https://fanyi-api.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=20191211000365104&salt=143566022288&sign=ac5d3d18797ba7462a02122cbbb5c17f"

modify_url函数

上节拼接URL的查询地址的过程显得非常繁琐,我们可以使用httr工具包中的modify_url()函数简化这一过程:

library(httr)
url = modify_url("http://api.fanyi.baidu.com/api/trans/vip/translate",
                 query = list(q = q, from = from, to = to,
                              appid = appid, 
                              salt = salt,
                              sign = sign))
url
[1] "http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=20191211000365104&salt=143566022288&sign=ac5d3d18797ba7462a02122cbbb5c17f"

get函数

使用上面创建的url作为GET()函数的参数:

GET(url)
Response [http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=20191211000365104&salt=143566022288&sign=ac5d3d18797ba7462a02122cbbb5c17f]
  Date: 2022-10-31 08:43
  Status: 200
  Content-Type: application/json
  Size: 77 B

输出结果中,Status为200,表示请求成功;此外,404表示请求文件不存在(file not found),403表示请求被拒绝(permission denied)。 Content-Type为application/json表示响应数据为json类型,可以使用jsonlite工具包中的fromJSON()函数抓取数据。 另外,GET()函数继承了modify_url()函数的参数,因此3.2节和本节的代码可以合并成如下形式:

result = GET("http://api.fanyi.baidu.com/api/trans/vip/translate",
    query = list(q = q, from = from, to = to,
                 appid = appid, 
                 salt = salt,
                 sign = sign))
content(result)
$from
[1] "en"

$to
[1] "zh"

$trans_result
$trans_result[[1]]
$trans_result[[1]]$src
[1] "apple"

$trans_result[[1]]$dst
[1] "苹果"

可以看出翻译结果提取方式如下(没用到fromJSON函数):

content(result)$trans_result[[1]]$dst
[1] "苹果"

上述代码封装成函数

trans <- function(q = "apple",
                  from = "auto",
                  to = "zh",
                  appid = "",
                  salt = "1435660288",
                  key = ""
                  ) {   
  require(httr)
  require(jsonlite)
  require(openssl)
  
  sign = paste0(appid, q, salt, key)
  sign = md5(sign)
  url = GET("http://api.fanyi.baidu.com/api/trans/vip/translate",
                   query = list(q = q, from = from, to = to,
                                appid = appid, 
                                salt = salt,
                                sign = sign))
}

测试下函数功能

trans()
[1] "苹果"
trans("Amplified networking debugging features")
[1] "增强的网络调试功能"
# 转英语
trans("R语言学堂", from = "auto", to = "en")
[1] "R Language School"
鄂ICP备2022016232号-1