寒假闲暇无事,正好有一个朋友写论文,让我写个脚本帮助其降重
本脚本利用百度翻译api进行,原理非常简单:中文翻译中文,也就是说先利用中文翻译成外国语言,再将其翻译成为中文。
在input输入需要翻译的文字,然后通过powershell运行,就能在powershell窗口或者output文件夹获取降重结果。
你需要自己申请一个百度翻译的接口,将你自己的APP ID与密钥分别写入图示1与2的位置。
然后直接运行就行了。
签名生成方法
签名是为了保证调用安全,使用 MD5 算法生成的一段字符串,生成的签名长度为 32 位,签名中的英文字符均为小写格式。
生成方法:
Step1. 将请求参数中的 APPID(appid), 翻译 query(q,注意为UTF-8编码),随机数(salt),以及平台分配的密钥(可在管理控制台查看) 按照 appid+q+salt+密钥的顺序拼接得到字符串 1。
Step2. 对字符串 1 做 md5 ,得到 32 位小写的 sign。
注:
1. 待翻译文本(q)需为 UTF-8 编码;
2. 在生成签名拼接 appid+q+salt+密钥 字符串时,q 不需要做 URL encode,在生成签名之后,发送 HTTP 请求之前才需要对要发送的待翻译文本字段 q 做 URL encode;
3.如遇到报 54001 签名错误,请检查您的签名生成方法是否正确,在对 sign 进行拼接和加密时,q 不需要做 URL encode,很多开发者遇到签名报错均是由于拼接 sign 前就做了 URL encode;
4.在生成签名后,发送 HTTP 请求时,如果将 query 拼接在 url 上,需要对 query 做 URL encode。
输入参数
请求方式: 可使用 GET 或 POST 方式,如使用 POST 方式,Content-Type 请指定为:application/x-www-form-urlencoded
字符编码:统一采用 UTF-8 编码格式
query 长度:为保证翻译质量,请将单次请求长度控制在 6000 bytes以内(汉字约为输入参数 2000 个)
字段名 | 类型 | 是否必填 | 描述 | 备注 |
---|---|---|---|---|
q | string | 是 | 请求翻译query | UTF-8编码 |
from | string | 是 | 翻译源语言 | 可设置为auto |
to | string | 是 | 翻译目标语言 | 不可设置为auto |
appid | string | 是 | APP ID | 可在管理控制台查看 |
salt | string | 是 | 随机数 | 可为字母或数字的字符串 |
sign | string | 是 | 签名 | appid+q+salt+密钥的MD5值 |
以下字段仅开通了词典、TTS用户需要填写 | ||||
tts | integer | 否 | 是否显示语音合成资源 | 0-显示1-不显示 |
dict | integer | 否 | 是否显示词典资源 | 0-显示1-不显示 |
以下字段仅开通了”我的术语库“用户需要填写 | ||||
action | integer | 否 | 判断是否需要使用自定义术语干预API | 1-是0-否 |
输出参数
返回的结果是json格式,包含以下字段:
字段名 | 类型 | 描述 | 备注 | |
---|---|---|---|---|
from | string | 源语言 | 返回用户指定的语言,或者自动检测出的语种(源语言设为 auto 时) | |
to | string | 目标语言 | 返回用户指定的目标语言 | |
trans_result | array | 翻译结果 | 返回翻译结果,包括 src 和 dst 字段 | |
trans_result.*.src | string | 原文 | 接入举例中的“apple” | |
trans_result.*dst | string | 译文 | 接入举例中的“苹果” | |
error_code | integer | 错误码 | 仅当出现错误时显示 | |
以下字段仅开通了词典、TTS用户可见 | ||||
src_tts | string | 原文tts链接 | mp3格式,暂时无法指定发音 | |
dst_tts | string | 译文tts链接 | mp3格式,暂时无法指定发音 | |
dict | string | 中英词典资源 | 返回中文或英文词典资源,包含音标,简明释义等内容 |
接入举例
例如:将英文单词 apple 翻译成中文:
请求参数:
q=apple
from=en
to=zh
appid=2015063000000001(请替换为您的appid)
salt=1435660288(随机码)
平台分配的密钥: 12345678
生成签名sign:
step1:拼接字符串1:
拼接appid=2015063000000001+q=apple+salt=1435660288+密钥=12345678得到 字符串1:“2015063000000001apple143566028812345678”
step2:计算签名:(对字符串1做md5加密)
sign=md5(2015063000000001apple143566028812345678),得到sign=f89f9594663708c1605f3d736d01d2d4
拼接完整的请求如下:
http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4
主要代码如下
# 导入相关模块
import hashlib
import random
import requests
import time
# 你的APP ID
appID = '***************'
# 你的密钥
secretKey = '***************'
# 百度翻译 API 的 HTTP 接口
apiURL = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
def baiduAPI_translate(query_str, to_lang):
'''
传入待翻译的字符串和目标语言类型,请求 apiURL,自动检测传入的语言类型获得翻译结果
:param query_str: 待翻译的字符串
:param to_lang: 目标语言类型
:return: 翻译结果字典
'''
# 生成随机的 salt 值
salt = str(random.randint(32768, 65536))
# 准备计算 sign 值需要的字符串
pre_sign = appID + query_str + salt + secretKey
# 计算 md5 生成 sign
sign = hashlib.md5(pre_sign.encode()).hexdigest()
# 请求 apiURL 所有需要的参数
params = {
'q': query_str,
'from': 'auto',
'to': to_lang,
'appid': appID,
'salt':salt,
'sign': sign
}
try:
# 直接将 params 和 apiURL 一起传入 requests.get() 函数
response = requests.get(apiURL, params=params)
# 获取返回的 json 数据
result_dict = response.json()
# 得到的结果正常则 return
if 'trans_result' in result_dict:
return result_dict
else:
print('Some errors occured:\n', result_dict)
except Exception as e:
print('Some errors occured: ', e)
def baiduAPI_translate_main(query_str, dst_lang=''):
'''
解析翻译结果后输出,默认实现英汉互译
:param query_str: 待翻译的字符串,必填
:param dst_lang: 目标语言类型,可缺省
:return: 翻译后的字符串
'''
if dst_lang:
# 指定了目标语言类型,则直接翻译成指定语言
result_dict = baiduAPI_translate(query_str, dst_lang)
else:
# 未指定目标语言类型,则默认进行英汉互译
result_dict = baiduAPI_translate(query_str, 'zh')
if result_dict['from'] == 'zh':
result_dict = baiduAPI_translate(query_str, 'en')
# 提取翻译结果字符串,并输出返回
dst = result_dict['trans_result'][0]['dst']
#print('{}: {} -> {}: {}'.format(result_dict['from'], query_str, result_dict['to'], dst))
return dst
if __name__ == '__main__':
with open('output.txt', 'w', encoding='UTF-8') as ouput:
ouput.truncate() #清空文件
with open('input.txt','r', encoding='UTF-8') as input:
line = input.readline()
while line:
#如果该行为空,不循环,直接输出空
if line.strip() == "" :
line = input.readline()
with open('output.txt', 'a') as ouput:
ouput.write('\n')
continue
if(line == '' or line == ' '):
continue
# time.sleep(1)
print(line)
try:
ans = baiduAPI_translate_main(line, 'en') # 这里调节参数选择中间层语言
time.sleep(1)
ans = baiduAPI_translate_main(ans, 'zh')
print(ans)
with open('output.txt', 'a') as ouput:
ouput.write(ans + '\n')
except Exception as e:
print(e)
line = input.readline()
time.sleep(1)
想下载参考的可以点下面链接