——本文前段时间在 Matrix 发布过,后来发现 Workflow 还有一些 Bug,又来不及调试,只能把文章临时删除,所以现在是2.0,完善了正则表达式,增加有道翻译参考。
引言
自从去年重拾日语(我相信读者都是理性的,我们只谈文化不谈政治),基本每天都会在微信公众号 NewsWebEasy1 看日语新闻。文章内容虽然用的都是基础词汇,但仍会经常遇到生词。如何快速记录它们成为一件棘手的事。更重要的是,记录不代表记住,如何复习也是个问题。
有读者应该已经想到,用 Workflow for iOS 这款效率 App。嗯,我也确实这么做的,不过早期对 Workflow 功能浅尝辄止,自建的动作也比较低级,遇到生词复制后运行,跳出输入框,手动输入生词的假名、音调、词性和解释,同步到 Evernote。
一个日语词汇需要掌握的内容包括:汉字写法-假名-音调-词性-解释。比如:中国(这里是日文)-ちゅうごく-①-名詞-中国,中华人民共和国。分别对应上述五项。(话说新版的引用显示效果好难看,页面占用过大。)
至于复习,就是经常去翻看记录的生词。话虽如此,可是然并卵,首先是会忘记去看,其次随着记录的生词越来越多,打开后看见满满的生词也就不想看了ヾ(。 ̄□ ̄)ツ゜゜゜。
改进后
复制生词,通知中心运行 Workflow 动作,提取沪江小D上该词相关信息,通过 Quizlet2 API 添加新的 Flashcard3 。Flashcards App 根据记忆曲线提醒复习,每次只复习若干生词,再也不会被满屏生词 KO了。
2.0 动作新增:当沪江小D查不到单词信息时,会调用有道翻译供参考。
目前为止,我所能找到的对于日语词汇解释详细的只有沪江小D 在线词典,其他包括有道、百度、Bing 等,只能显示简单的中文意思,其余发音、假名、词性都没有。——However,沪江小D 没有开放 API。
首先预览下动作效果,给你动力。
先附上 Workflow 动作:动作一Quizlet获取token;动作二日语生词添加 Qz v2.0。
一起开始吧!
一、准备
- Workflow for iOS【¥18】;
- 抽认卡 App:Flashcards Deluxe 【¥25】/ Quizlet 【Free】(Quizlet为官方应用);
- Quizlet 开发者帐号;
- 有道翻译 API,申请比较简单,请自行完成;
- 正则表达式基础(非必须,若懂更好)。
获取 Quizlet Access Token
1、申请 Quizlet 开发者帐号
Quizlet 官网注册普通帐号,打开开发者网站(需先认证注册邮箱),按注释填入表格申请 API Key。
redirect URI:OAuth 里面的概念。举个例子,第三方微博 App 需要先获取用户授权,授权通过后会打开类似 redirect URI/?code=GENERATED_CODE 格式的链接,其中 GENERATED_CODE 是一串加密字符串,用于向微博服务器申请 Token Key,第三方应用只有取得该 Key 后才能访问用户微博信息。上述整个过程就是 OAuth 授权流程。关于 OAuth 更多介绍参看此文。
后续用到 Client ID
、 Redirect URI
和 Secret Key
。
2、获取 Quizlet Access Token
Token Key 获取的详细流程和参数说明见官方文档。主要分为三个步骤:
【1】引导用户到授权服务器的授权入口。该步只需打开下面链接即可。其中 MY_CLIENT_ID 就是前面获得的 Client ID
;scope 表示授权第三方的权利范围,分别为:read、write_set、write_group,这里需要可读写删除的 write_set 权限;RANDOM_STRING 是任意字符串,用于防止 CSRF 攻击,随机数即可。
https://quizlet.com/authorize?response_type=code&client_id=MY_CLIENT_ID&scope=write_set&state=RANDOM_STRING
【2】打开上述链接后询问是否授权访问 Quizlet 账户,允许后会转到 Redirect URI 指定的链接并附上 code
参数。复制该链接并用正则表达式提取 code
。Workflow 动作一运行如下图,授权跳转页面后拷贝。
【3】向服务器请求 Token
。POST 信息按官方要求填入即可。其中 Authorization 一栏内容为 Basic base64-encoded(Client ID:Secret Key),该值可自行转换,也可用官方转换好的,详见该页面 Step 2 中的表格最后一行。
动作一会把获取到的 Token 复制到剪贴板,粘帖到动作二对应项。
题外话:因为对服务器请求不熟悉,一直以为所有要求参数是在 Body 中,后来查看 OAuth 相关资料时才知道,Authorization 和 Content-Type 是写在 Header 中,这问题困扰了我好久。
二、提取单词信息
本文是针对日语单词,如果是其他语种词汇,尤其是针对英语,各类词典 API 还是很丰富的。英语词汇可考虑添加生词到扇贝服务器,详见此文。
目前沪江小D未开放查询 API,只能曲线救国,提取查询后的网页信息。沪江小D 查询链接为 http://dict.hjenglish.com/jp/jc/中国
,利用 Get Contents of URL 获取网页内容,假名ちゅうごく,音调①、词性和释义都在了。
经过多次测试对比,假名和词性都用“【】”包含,而音调都在罗马字发音 (图中为【chuugoku】)后面,释义最好获取详细释义后面的第 1、2 条(因为有些词语【词性】后面没有释义)。
利用正则表达式分别提取需要的内容,表达式具体写法见 Workflow 动作,不再赘述。需要说明的是:
(1)当网页中“【】”一组也没有时表示未查找到词语信息,需要一个 If 来判断。
(2)最近更新的魔法变量(Magic Variable)虽然能简化流程,但本动作需要提取多个信息,且需多次用到,如果全部用魔法变量反倒不方便不直观。
(3)动作中设置了 Show Notification,便于确认查到的信息,毕竟不是官方 API 支持,有些不常见的生词无法用正则表达式获取到正确的信息。
V2.0更新内容
http://fanyi.youdao.com/openapi.do?keyfrom=你自己的值&key=你自己的值&type=data&doctype=json&version=1.1&&only=translate&q=Clipboard
三、上传 Quizlet 生成 Flashcard
利用 Get Contents of URL POST 词汇信息到 Quizlet 服务器。其中,Authorization 一栏填入动作一中复制的 Token
。term 和 definition 可以理解为抽认卡的正反面。
图中 URL 链接如下,其中 187957966 是要上传的 Flashcards 组 ID (不然服务器不知道你要把新的 Flashcards 添加到哪)。
https://api.quizlet.com/2.0/sets/187957966/terms
如何获取该 ID 呢,打开 API test 页面,直接点击蓝色按钮 Send API Request,
弹窗中可以找到 ID,其中 title 对应组名,双字节字符会重新编码,不易辨认。
Flashcard 上传成功后会有通知提示,其中仅供参考表示沪江小D对该词仅有基本解释,无发音等信息,一般多为专属词。仅供参考词语不会添加到 Flashcards。
需要说明的是,因为非官方 API 支持,所以查询结果有时会有小 BUG,如果出现烦请告知我。
可以看到,【中国】这个词语相关信息已经添加到 Quizlet 了。
四、移动端 Flashcards App
可以选择官方的 Quizlet,好处是添加新的生词后刷新下就可以学习了。但我个人在用 Flashcards Deluxe,可设置的选项和主题比较丰富,缺点是需要手动更新 Flashcards,如图。第三张图片意思是:词语会被新的替代,但学习进度保留。
显示效果下图
最后
获取了Quizlet 账户完整权限,其实可以作一个寄生于 Workflow 的小程序,除了添加、还可以删除、修改,甚至对 Flashcards 批量操作。更多操作请求方法见官方示例。
Workflow 是个了不起的应用,不断更新使得 iOS 能力有了更多可能性。
在编写本文 Workflow 动作时,也学到了很多新知识,比如正则表达式, OAuth 授权流程。因为不懂 HTTP 请求,在获取 Token 时走了很多弯路,当经过一番努力后突然明白了解决了,这种成就感和喜悦之情真是难以言表,简直太棒了。我想这就是人类不断探索进取的源动力之一。
额外
本文 Workflow 动作适合在 iPhone 或 iPad 上阅读新闻使用,如何把电脑上浏览时的日语生词,快速 & 批量添加到 Quizlet 生成 Flashcards 呢。看需求再定是否更新,暂时写到这里吧。