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

本文介绍如何使用百度翻译API实现自动翻译功能。从Python2到Python3的代码迁移,利用requests库简化HTTP请求过程,最终实现了从英语到中文的翻译。

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




要调用百度翻译API来实现一个翻译窗口,你需要先注册百度翻译开放平台,然后获取到你的 `APP ID` 和 `Secret Key`。接下来,你可以使用Python的 `requests` 来发送HTTP请求并获取翻译结果。 下面是一个简单的示例代码: ```python import hashlib import random import requests # 将需要翻译的文本通过百度翻译API进行翻译 def baidu_translate(q, from_lang='auto', to_lang='zh'): # 百度翻译API的请求URL url = 'http://api.fanyi.baidu.com/api/trans/vip/translate' # 将 appid、secret key、随机数和要翻译的文本进行拼接并进行MD5加密 appid = 'your_app_id' secret_key = 'your_secret_key' salt = random.randint(32768, 65536) sign = hashlib.md5((appid + q + str(salt) + secret_key).encode('utf-8')).hexdigest() # 构造请求参数 params = { 'q': q, 'from': from_lang, 'to': to_lang, 'appid': appid, 'salt': salt, 'sign': sign } # 发送HTTP请求并获取响应 response = requests.get(url, params=params) result = response.json() # 解析翻译结果 if 'trans_result' in result: return result['trans_result'][0]['dst'] else: return None ``` 上面的代码中,我们使用了 `hashlib` 生成MD5加密的签名,并使用了 `random` 生成随机数。然后,我们将这些参数和要翻译的文本一起发送到百度翻译API的请求URL中,并使用 `requests` 发送HTTP请求。最后,我们解析返回的JSON格式的翻译结果并返回翻译后的文本。 你可以将上面的代码放入一个GUI应用程序中,例如使用 `tkinter` 创建一个简单的窗口,让用户输入要翻译的文本,然后将翻译结果显示在窗口中。以下是一个示例: ```python import tkinter as tk # 创建主窗口 root = tk.Tk() root.title('翻译窗口') # 创建文本框和翻译结果标签 text = tk.Text(root, height=10, width=50) text.pack() result_label = tk.Label(root, text='翻译结果:') result_label.pack() result_text = tk.Text(root, height=10, width=50) result_text.pack() # 将需要翻译的文本通过百度翻译API进行翻译 def translate(): q = text.get('1.0', 'end').strip() result = baidu_translate(q) result_text.delete('1.0', 'end') result_text.insert('end', result) # 创建翻译按钮 translate_button = tk.Button(root, text='翻译', command=translate) translate_button.pack() # 运行窗口 root.mainloop() ``` 在上面的代码中,我们使用 `tkinter` 创建了一个主窗口,并在窗口中创建了一个文本框和一个翻译结果标签,以及一个翻译按钮。当用户点击翻译按钮时,我们将调用 `baidu_translate` 函数进行翻译,并将翻译结果显示在窗口中的另一个文本框中。 这只是一个简单的示例,你可以根据自己的需求对代码进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值