自己动手用Python3+Requests库写百度翻译API
发布日期:2022-02-22 18:04:24 浏览次数:14 分类:技术文章

本文共 3539 字,大约阅读时间需要 11 分钟。

阿里上线了少数语言产品页面,想要把一部分英文listing自动翻译称西班牙等语言再传回去。所以准备用百度翻译API。28种语言自动翻译,每月免费翻译200万字,各种心动有没有!

结果下了baidu的python demo后发现,他的代码是这样的:

#/usr/bin/env python#coding=utf8import httplibimport md5import urllibimport randomappid = '20151113000005XXX'secretKey = 'osubCEzlGjzvw8qdQXXX'httpClient = Nonemyurl = '/api/trans/vip/translate'q = 'apple'fromLang = 'en'toLang = 'zh'salt = random.randint(32768, 65536)sign = appid+q+str(salt)+secretKeym1 = md5.new()m1.update(sign)sign = m1.hexdigest()myurl = myurl+'?appid='+appid+'&q='+urllib.quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+signtry:    httpClient = httplib.HTTPConnection('api.fanyi.baidu.com')    httpClient.request('GET', myurl)    #response是HTTPResponse对象    response = httpClient.getresponse()    print response.read()except Exception, e:    print efinally:    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-8import requestsimport hashlibimport randomdef 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_resultif __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)

转载地址:https://blog.csdn.net/earth9/article/details/80026869 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:不用抓包直接使用Selenium模拟登录新浪微博。
下一篇:Eclipse中使用Maven关联Spring源码包

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月13日 09时19分45秒