Python 编写一个有道翻译的 workflow 教程
最近使用有道翻译的 workflow 总是翻译不了,可能是 appKey 失效了或者超过调用上限,所以打算自己实现一个。
创建 workflow
打开 Alfred3 的 Preferences,选择 Workflows。
下方有个+,单击后选择 Blank Workflow。完成基本信息的填写。
然后右击添加:Inputs->Script Filter。
Keyword 输入 yd,代表我们用'yd' 激活我们的 workflow。
写上合适的提示文字
Language 选择
/bin/bash或者/bin/zsh选择
with input as {query}脚本填入
python translate.py {query}, translate.py 是自己编写的 python 脚本。

可以找一个合适的图标拖到右上角图标的位置。
安装 Alfred-Workflow 库:
点击 Cancel 左边的图标,进入到 workflow 所在的目录。
或者右击 workflow 选择 Open in Finder

如果需要将自己编写的 workflow 分享给别人使用,则需要将 Alfred-Workflow 安装到 workflow 所在的目录。
# 进入到 workflow 所在目录
pip install Alfred-Workflow --target=.
申请 appKey
有道翻译的 api 现在是计费的,申请实例之后可以获得100元体验金,那就先用着吧。
先打开http://ai.youdao.com/,然后注册登录。接下来:
- 自然语言翻译=》翻译实例=》创建实例,选择文本翻译。
- 应用管理=》我的应用=》创建应用,接入方式选择API。创建成功后绑定服务。
- 点击应用的名称,进入应用详情页面,可以看到用来调用 api 的应用ID 和应用密钥。
编写 translate.py
# -*- coding:utf8 -*-
import sys
from workflow import Workflow3, web
def translate(wf):
import md5
import random
# 此处修改为你的应用 ID
appKey = '024b716exxxxxxxx'
# 此处修改为你的应用密钥
key = 'XWLYKxGoMK7474Ux1NXFxxxxxxxxxxxx'
query = sys.argv[1]
salt = str(random.randint(1, 65536))
sign = appKey + query + salt + key
m1 = md5.new()
m1.update(sign)
sign = m1.hexdigest()
params = dict(appKey=appKey, q=query, salt=salt, sign=sign)
r = web.get('https://openapi.youdao.com/api', params)
r.raise_for_status()
res = r.json()
if res.get('web'):
posts = res['web']
for post in posts:
wf.add_item(title=u" ".join(post['value']), subtitle=post['key'])
else:
wf.add_item(title=u"No result", subtitle="errorCode:"+res["errorCode"])
wf.send_feedback()
if __name__ == "__main__":
wf = Workflow3()
sys.exit(wf.run(translate))
测试
保存代码后,可以打开 workflow 的 debug,输入 yd hello进行测试。

如果出现错误,可以在有道的 API 文档中查询错误码列表,如上108代表的是appKey无效。
使用有效的appKey 后,效果如下:

参考链接:
Python 编写一个有道翻译的 workflow 教程的更多相关文章
- 用Python编写一个简单的Http Server
用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...
- 使用 python 编写一个授权登录验证的模块
使用 python 编写一个授权登录验证的模块 我们编写的思路: 1.登录的逻辑:如果用户名和密码正确,就返回 token . 2.生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时 ...
- 再也不怕和老外交流了!我用python实现一个微信聊天翻译助手!
前言 在前面的一篇文章如何用python“优雅的”调用有道翻译中咱们清楚的写过如何一层一层的解开有道翻译的面纱,并且笔者说过那只是脑洞的开始.现在笔者又回来了.当你遇到一些外国小哥哥小姐姐很心动.想结 ...
- 用Python做一个简单的翻译工具
编程本身是跟年龄无关的一件事,不论你现在是十四五岁,还是四五十岁,如果你热爱它,并且愿意持续投入其中,必定会有所收获. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过 ...
- 如何用Python编写一个聊天室
一.课程介绍 1.简介 本次项目课是实现简单聊天室程序的服务器端和客户端. 2.知识点 服务器端涉及到asyncore.asynchat和socket这几个模块,客户端用到了telnetlib.wx. ...
- 为Python编写一个简单的C语言扩展模块
最近在看pytorh方面的东西,不得不承认现在这个东西比较火,有些小好奇,下载了代码发现其中计算部分基本都是C++写的,这真是要我对这个所谓Python语音编写的框架或者说是库感觉到一丢丢的小失落,细 ...
- 用python编写一个合格的ftp程序,思路是怎样的?
经验1.一般在比较正规的类中的构造函数.都会有一个verify_args函数,用于验证传入参数.尤其是对于系统传参.2.并且系统传参,其实后面大概都是一个函数名 例如:python server. ...
- Python编写一个Python脚本
我想要一个可以为我的所有重要文件创建备份的程序.(下面测试环境为python2.7) 1.backup_ver1.py #!/usr/bin/python import os import time ...
- python爬虫之有道翻译
import urllib.request import urllib.parse import json class Translate(): def __init__(self): ...
随机推荐
- oracle学习笔记(二) 基本数据类型
常用的数据类型 int number number(4,1) 999.1 四个数字,小数位一位 decimal date 日期 格式如下: 注意:日期类型的字段格式,可以通过以下三种方式: 1. da ...
- Effective Java目录
创建和销毁对象 考虑用静态工厂方法代替构造器 遇到多个构造器参数时要考虑用构建器 用私有构造器或者枚举类型强化Singleton属性 通过私有构造器强化不可实例化能力 避免创建不必要的对象 消除过期的 ...
- Eclipse常用快捷键速记
补充 15 个 Eclipse 常用开发快捷键使用技巧 1.alt+? 或 alt+/:自动补全代码或者提示代码 2.ctrl+o:快速outline视图 3.ctrl+shift+r:打开资源列表 ...
- Python数据描述与分析
在进行数据分析之前,我们需要做的事情是对数据有初步的了解,比如对数据本身的敏感程度,通俗来说就是对数据的分布有大概的理解,此时我们需要工具进行数据的描述,观测数据的形状等:而后才是对数据进行建模分析, ...
- 《.NET 进阶指南》读书笔记1------NET程序集与普通EXE文件的区别
开发人员将源文件编译之后生成的中间件,我们称之为"程序集".因为程序集文件名一般以.EXE(或者DLL)结尾,因此很容易将它与传统开发过程中的EXE文件(或者DLL文件)搞混淆.虽 ...
- C# 通用单例窗体类
/// <summary> /// 通用的单例制作器 /// </summary> /// <typeparam name="T"></t ...
- MyDAL - .IsExistAsync() 使用
索引: 目录索引 一.API 列表 .IsExistAsync() 用于 单表 / 多表连接 查询 二.API 单表-便捷 方法 举例 1.单表-便捷, 判断是否存在方法 var date = Dat ...
- git开发常用命令
1.基本命令git branch 查看本地分支git branch -r 查看远程分支git checkout xxx 切换分支git pull origin master //从远程同步到本地,ma ...
- 在cmd里,java运行jar包中指定Class的命令
java -classpath ****.jar ****.****.className
- AngularJS学习之旅—AngularJS 事件(十四)
1.AngularJS 事件 ng-click ( 适用标签 :所有,触发事件:单击): ng-dblclick( 适用标签 :所有,触发事件:双击): ng-blur(适用标签 : a,input, ...