网易的有道智云,提供了各种 Api,一部分呢可以免费试用。
这里使用自然语言翻译的 Api 来写一个简单的翻译软件。
获取 Api
首先呢,登录有道智云,网易账号可以直接登录。
创建应用
首先进入我的应用,先创建一个应用。
进入应用创建界面:
再进入
自然语言翻译>创建一个实例
,最后再右边绑定应用即可。
回到我的实例,点击实例进入实例详情页面:
查看你的 应用ID 和 应用密钥,后面调用翻译接口的时候会用到。
查看 API 文档
要调用接口,肯定必须要知道接口地址、请求方法、参数、返回值。否则你都没法调用。
有道智云每个接口都有非常详细的 API 和不同原因的调用示例(毕竟是赚钱的嘛,写不清楚别人用不了),点这里进入翻译 API 文档。
文档有兴趣的同学可以看看,这对于了解前后端开发的文档沟通过程和理解接口测试很有帮助。
或者你可以直接搜索 Python3 示例
,下面的代码我修改了一下,你只需要把上面你的应用ID和应用密钥填进去即可。
# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import hashlib
import time
YOUDAO_URL = 'https://openapi.youdao.com/api'
APP_KEY = '您的应用ID'
APP_SECRET = '您的应用密钥'
def encrypt(signStr):
hash_algorithm = hashlib.sha256()
hash_algorithm.update(signStr.encode('utf-8'))
return hash_algorithm.hexdigest()
def truncate(q):
if q is None:
return None
size = len(q)
return q if size <= 20 else q[0:10] + str(size) + q[size - 10:size]
def connect(q):
data = {}
data['from'] = 'auto'
data['to'] = 'auto'
data['signType'] = 'v3'
curtime = str(int(time.time()))
data['curtime'] = curtime
salt = str(uuid.uuid1())
signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
sign = encrypt(signStr)
data['appKey'] = APP_KEY
data['q'] = q
data['salt'] = salt
data['sign'] = sign
return requests.post(YOUDAO_URL, data=data, headers=headers).json()
if __name__ == '__main__':
from pprint import pprint
pprint(connect('test'))
运行一下,可以看到返回的 JSON 数据:
{'basic': {'exam_type': ['高中', '初中'],
'explains': ['n. 测验,考查;测试;检验;化验', 'v. 测验;化验,检查;试验,测试;考验'],
'phonetic': 'test',
'uk-phonetic': 'test',
'uk-speech': 'http://openapi.youdao.com/ttsapi?q=test&langType=en&sign=24FBE24DDFAA2AD763C2B2D9BA8645A3&salt=1571234222837&voice=5&format=mp3&appKey=4aaf4f0434b6bd8e',
'us-phonetic': '',
'us-speech': 'http://openapi.youdao.com/ttsapi?q=test&langType=en&sign=24FBE24DDFAA2AD763C2B2D9BA8645A3&salt=1571234222837&voice=6&format=mp3&appKey=4aaf4f0434b6bd8e'},
'dict': {'url': 'yddict://m.youdao.com/dict?le=eng&q=test'},
'errorCode': '0',
'l': 'en2zh-CHS',
'query': 'test',
'returnPhrase': ['test'],
'speakUrl': 'http://openapi.youdao.com/ttsapi?q=test&langType=en&sign=24FBE24DDFAA2AD763C2B2D9BA8645A3&salt=1571234222837&voice=4&format=mp3&appKey=4aaf4f0434b6bd8e',
'tSpeakUrl': 'http://openapi.youdao.com/ttsapi?q=%E6%B5%8B%E8%AF%95&langType=zh-CHS&sign=A83C7003EFF5A97BAD6FE023F95D4FBE&salt=1571234222837&voice=4&format=mp3&appKey=4aaf4f0434b6bd8e',
'translation': ['测试'],
'web': [{'key': 'Test', 'value': ['测试', '测验', '试验', '考试']},
{'key': 'Test engineer',
'value': ['测试工程师', '测试员', '软件测试工程师', '产品试验工程师']},
{'key': 'stress test', 'value': ['压力测试', '应力测试', '负荷试验', '压力试验']}],
'webdict': {'url': 'http://m.youdao.com/dict?le=eng&q=test'}}
返回内容很复杂,我相信业务繁忙的各位也没太多心思细看。(详细的说明可以查看接口文档)
这里我们只做简单的翻译,所以只取其中的 translation
部分。
简单的设计界面
简单的翻译,先不要考虑那么多,能输入要翻译的内容,并且把翻译后的输出即可。
这里只设计了两行:
- 第一行,一个多行文本输入区域,一个翻译按钮;
- 第二行,一个 Frame 框架内部嵌套一个多行文本输出区域(最能查看不能修改)。
在 PySimpleGUI 中,Multiline
可以作为多行文本输入区域,也可以作为多行文本输出区域。
sg.Multiline('')
之前一篇文章也演示过 PySimpleGUI 的基本用法, PySimpleGUI 中布局使用的是列表。把页面元素都加到列表中,在把列表加入窗口布局。
如果用到 Frame,Frame 本身也是一个列表,要先把元素加到 Frame 的列表中,再把 Frame 加入到整体布局列表中,最后再把整体布局列表加入窗口。
simple_frame = [[sg.Multiline('', key='_RES_', disabled=True)]]
layout = [[sg.Multiline('', key='_Q_', focus=True), sg.Button('翻译', key='_TRANS_')],
[sg.Frame('翻译结果', simple_frame, title_color='gray')],]
翻译按钮的 _key='TRANS_'
,那么当窗口事件为 _TRANS_
时就调用有道翻译接口,把从多行文本key='_Q_'
中读取的文本内容传递过去,然后把返回结果中的 translation
部分展示在下方 Frame 中的输出文本中。
import PySimpleGUI as sg
import os, sys
from yodao import connect # 把上面的有道获取的代码保存为 yodao.py
# 构造 Frame
simple_frame = [[sg.Multiline('', key='_RES_', disabled=True)]]
# 构造整体窗口布局
layout = [[sg.Multiline('', key='_Q_', focus=True), sg.Button('翻译', key='_TRANS_')],
[sg.Frame('翻译结果', simple_frame, title_color='gray')]]
# 生成窗口
window = sg.Window('翻译小工具', layout)
while True:
event, value = window.Read()
# 如果点击翻译按钮
if event == '_TRANS_':
result = connect(value.get('-Q-')).get('translation')[0]
# 把翻译结果展示到Frame中的文本区域
window['_RES_'].update(result)
if event is None:
break
window.close()
运行结果如下:
,没有做任何异常处理和稳定性代码,请自行添加。