自己动手用Python3+Requests库写百度翻译API

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




猜你喜欢

转载自blog.csdn.net/earth9/article/details/80026869