阿里上线了少数语言产品页面,想要把一部分英文listing自动翻译称西班牙等语言再传回去。所以准备用百度翻译API。28种语言自动翻译,每月免费翻译200万字,各种心动有没有!
结果下了baidu的python demo后发现,他的代码是这样的:
#/usr/bin/env python
#coding=utf8
import httplib
import md5
import urllib
import random
appid = '20151113000005XXX'
secretKey = 'osubCEzlGjzvw8qdQXXX'
httpClient = None
myurl = '/api/trans/vip/translate'
q = 'apple'
fromLang = 'en'
toLang = 'zh'
salt = random.randint(32768, 65536)
sign = appid+q+str(salt)+secretKey
m1 = md5.new()
m1.update(sign)
sign = m1.hexdigest()
myurl = myurl+'?appid='+appid+'&q='+urllib.quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign
try:
httpClient = httplib.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)
#response是HTTPResponse对象
response = httpClient.getresponse()
print response.read()
except Exception, e:
print e
finally:
if httpClient:
httpClient.close()
各种凌乱有没有,httplib这个东东我压根就没见过啊!httpClient = httplib.HTTPConnection('api.fanyi.baidu.com') 这又是什么鬼?难道我要重新先学习httplib?不管他,先运行一遍再说。结果一运行显示print 格式错误,瞬间明白这尼玛还是python2写的demo。这么老旧的东西什么时候写的啊。。。。。。。
缓过神来一想,这不就是post一个带有需要翻译内容的链接么,这都python3时代了,当然要用为人类设计的requests库啊!这百度,虽然是免费的,也真心也太敷衍了。。。
好,自己动手丰衣足食!
百度翻译api文档是这样要求的:
您需要向该地址通过POST或GET方法发送下列字段来访问服务
字段名 类型 必填参数 描述 备注
q TEXT Y 请求翻译query UTF-8编码
from TEXT Y 翻译源语言 语言列表(可设置为auto)
to TEXT Y 译文语言 语言列表(不可设置为auto)
appid INT Y APP ID 可在管理控制台查看
salt INT Y 随机数
sign TEXT Y 签名 appid+q+salt+密钥 的MD5值
换句话说,我要post一个链接,并且带有q, from, to, appid, salt, sign这6个参数。
requests中post方式为:
response = requests.post(url,data)
这里面,url百度翻译api的网址是 http://api.fanyi.baidu.com/api/trans/vip/translate
6个参数的data,在requests中是以字典形式构建:
data = {'appid' : appid,
'q' : q,
'from' : fromLang,
'to' : toLang,
'salt' : salt,
'sign' : sign
}
最后这个sign是一个md5的数字签名,百度翻译API文档中要求如下:
签名生成方法如下:
1、将请求参数中的 APPID(appid), 翻译query(q, 注意为UTF-8编码), 随机数(salt), 以及平台分配的密钥(可在管理控制台查看)
按照 appid+q+salt+密钥 的顺序拼接得到字符串1。
2、对字符串1做md5,得到32位小写的sign。
即:先把这4个参数组成一个字符串,
sign_raw = appid + q + salt + secretKey
再通过python3中hashlib模块处理sing_raw,
sign = hashlib.md5(sign_raw.encode('utf8')).hexdigest()
注意点:给hashlib.md5提交字符串是,必须是byte类型,所以需要sign_raw.encode('utf8')。后面跟的.hexdigest()是要求返回一个16进制的数。
好了,就这么简单。两个步骤,一、生成MD5签名组成参数字典,二、requests.post(url,data),就可以得到一串百度翻译的回复:
{'from': 'en', 'to': 'zh', 'trans_result': [{'src': '这里是需要翻译的内容', 'dst': '这里翻译的内容'}]}
就这么简单!两步搞定!
完整代码
# coding=utf-8
import requests
import hashlib
import random
def baidu_fanyi(content,appid,secretKey,fromLang,toLang):
#生成随机数
salt = str(random.randint(32768, 65536))
#生成MD5加密的签名
sign_raw = appid + content + salt + secretKey
sign = hashlib.md5(sign_raw.encode('utf8')).hexdigest()
#以字典方式构建需要post传入的6个参数
data = {'appid' : appid,
'q' : content,
'from' : fromLang,
'to' : toLang,
'salt' : salt,
'sign' : sign
}
# 百度翻译api调用网址
url = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
response = requests.post(url,data)
print ('百度api返回值:%s\n'%response.text)
result = eval(response.text)
trans_result = result['trans_result'][0]['dst']
return trans_result
if __name__ == '__main__':
content = 'I love who I love, hate who I hate' #待翻译内容
appid = '20180313000135XXX' #申请api得到
secretKey = 's0oBI7VMkrsm4yDpTXXX' #申请api得到
fromLang = 'en' #原语言
toLang = 'zh' #目标语言
trans_result = baidu_fanyi(content,appid,secretKey,fromLang,toLang)
print (trans_result)