阿里上线了少数语言产品页面,想要把一部分英文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)