Mac上的欧路词典单词本迁移到有道词典 #node.js
摘要
有道词典提供了柯林斯和朗文辞典,加上最近在背单词且Mac版的屏幕取词也够用了,为了云单词本的同步,决定抛弃Mac上的欧路词典。单词欧路上的单词本也存了一百多个单词。怎样迁移到有道呢?
关键词:node.js csv http charles
思路
有道的Mac版和PC版都不支持导入欧路的单词本文件(csv格式,是个好东西)。
如果是高中时的我,我会猜有道有一个本地的单词本文件。我可以把欧路导出的单词复制粘贴到该文件(假设有道也采用csv格式,那么就复制粘贴)。现是计算机科班出身,我想到的思路有:
1.OC语言的消息机制或许可以让我有可能调用到有道词典运行时的函数;
2.网络接口(假如有道没有对该API加密,那么就可以抓包然后仿照)。
最近又刚好搞了点node.js,初尝脚本语言的轻。不需要集成开发工具,Sublime Text + Terminal就够了。
抓包
| POST ...(路径) HTTP/1.1 | |
| Host | dict.youdao.com |
| Accept | */* |
| Content-Type | application/x-www-form-urlencoded |
| Connection | keep-alive |
| Cookie | ...(Cookie) |
| User-Agent | YoudaoDict/139 CFNetwork/760.6.3 Darwin/15.6.0 (x86_64) |
| Accept-Language | en-us |
| Accept-Encoding | gzip, deflate |
| Content-Length | 984 |
| data |
<?xml version="1.0" encoding="utf-8"?> <request> |
| version | 2 |
分析抓包到的请求
这个接口没有加密。分析抓到的Post请求,请求路径和Cookie都是在一段时间内不会变化的。主要是其中的时间戳,单词和释义。
添加一个单词
下边是终端的命令行和控制台输出。AddAWord.js仿照上边分析的请求,运行后返回的响应是200。下边的乱码是由于返回的响应体是gzip压缩过的,在这里没有进行解压。看到状态码是200,有道里的单词本已经多了“aWord”和“aaaa”。说明这个思路可行。
MBP:csv studio MacbookPro$ node AddAWord.js
Status: 200
headers: {"server":"nginx","date":"Mon, 02 Jan 2017 08:16:52 GMT","content-type":"text/xml;charset=UTF-8","transfer-encoding":"chunked","connection":"keep-alive","vary":"Accept-Encoding","content-language":"en-US","content-encoding":"gzip"}
body分隔线--------------------------------- u���
��x
�}C�[<T|�m/`\���`ʢ^�B��/��>�}0�V\�r��m���w���:���
<��ـ�e;�C�đѭ#2��Y��u�9���<N2P3�я?z���J��K.�J� 6�0ͦcFnH��U��l��TRĺ�~fJ�( body分隔线---------------------------------

提取csv文件中的单词列表,并添加
node.js社区没有让我失望,很快我就找到了解析csv的模块及其示例代码。接下来的事情就简单了,创建读取csv文件的流,解析流中获取的字符串,获得单词列表数组,遍历数组发送请求。
不过,当我用并发的形式发送所有单词到服务器时,结果只是添加了一个或两个单词,我猜想的原因是服务器对待这些请求是排队的,由于对时间戳的限制,几乎所有请求饿死了。这时候需要用到同步请求。
Node.js原生没有同步请求。npm上有很多能够实现同步请求的模块,但是为了保持单词的顺序,回调+递归会比较适合。关键代码如下:
readerStream.on('end',function(){
//把文本文件转化为字符串
var input = data;
parse(input, {comment: '#'}, function(err, output){
//字符串解析为对象之后,下边发送调用网页的API
//node.js原生不支持发送同步请求,同时为了保持单词的顺序,直接采用回调递归
addToWordBook(output, output.length-1);
});
});
结尾
所有单词添加完毕。

后记:这个方法并不能普遍化,因为需要抓包拿到token,cookie等数据,若要普遍化,有一个思路是实现用帐号密码登录,用代码取得token等数据,而不是通过抓包。
Mac上的欧路词典单词本迁移到有道词典 #node.js的更多相关文章
- bing词典vs有道词典对比测试报告——功能篇之细节与用户体验
之所以将细节与用户体验放在一起讨论,是因为两者是那么的密不可分.所谓“细节决定成败”,在细节上让用户感受方便.舒适.不费心而且温馨,多一些人文理念,多一些情怀,做出来的产品自然比其他呆板的产品更受欢迎 ...
- 必应词典手机版(IOS版)与有道词典(IOS版)之软件分析【功能篇】【用户体验篇】
1.序言: 随着手机功能的不断更新和推广,手机应用市场的竞争变得愈发激烈.这次我们选择必应词典和有道词典的苹果客户端作对比,进一步分析这两款词典的客户端在功能和用户体验方面的利弊.这次测评的主要评测人 ...
- 有道词典 Andriod 版本数据格式分析
其实很简单无聊 基于版本 5.3 分析. 其实也简单分析了有道词典iOS版本,必应词典的各个版本,以及金山词典的各个版本,还有那个一直逍遥法外的林格斯词典. 由于在各个平台上的限制,同一词典的不同版本 ...
- ubuntu14.04 下安装有道词典
安装步骤 1.ubuntu14.04.1版本下是不能直接安装有道词典的,首先需要把14.04.版升级为14.04.2版. 在终端窗口中输入以下命令: sudo apt-get update sudo ...
- (转)在Windows平台上安装Node.js及NPM模块管理
本文转载自:http://www.cnblogs.com/seanlv/archive/2011/11/22/2258716.html 之前9月份的时候我写了一篇关于如何在Windows平台上手工管理 ...
- ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.
在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写 ...
- mac 10.9开启有道词典取词功能
取词时候,有道词典给出提示,说要去开启辅助功能,但提示的是在mac 10.8上面怎么操作,在10.9的话,就是以下位置去改了. 补充以下: 在mac机器上,实际上大多数的单词都能从自带的词典中查找到. ...
- MAC上有哪些优秀的日常软件| 入门级Mac OS 用户必备软件
本文整理的网友反馈的MAC上有哪些优秀的日常软件+入门级Mac OS 用户必备软件,感兴趣的朋友可以看看,下载下来试用一样便知实不实用.如有更好的推荐,欢迎留言. MAC上有哪些优秀的日常软件 Tim ...
- 我在 Mac 上都用什么
我在 Mac 上都用什么 Homebrew Homebrew 是统一管理 macOS 中应用的最佳方法之一,而且大量优秀的应用都可以在 Homebrew 中找到. 就不做过多介绍了, 有兴趣可以看相关 ...
随机推荐
- 针对“Can't download driver to specified address”错误
当用h-flasher检测flash-id时,可能会出现上述错误,个人认为当提示这个错误时,一般来说是sdram出现了问题,可以看看sdram有没有虚焊,或者周围的电阻电容是否正确. 在后来调板子的过 ...
- Linux 任务计划
一.配置cron实现自动化 使用cron实现任务自动化可以通过修改/etc/crontab文件以及使用crontab命令实现,其结果是一样的. 1./etc/crontab文件实现自动化 cron守护 ...
- 使用python+pychram进行API测试(接口测试)初级STEP 1
花了一天时间安装了解了下最基本的python+pychram进行API测试,下面这个可以指导自己以后入门:基本的开发级别还需要学习 1.python下载地址:https://www.python.or ...
- MacOS changed System Integrity Protection status
禁止 System Integrity Protection 按住 command + R 重启系统 进入单用户模式 启动bash工具: 输入: csrutil disable 输入:reboot 启 ...
- The source attachment does not contain the source for the file ActionSupport.class 错误
报错 Syntax error, insert ";" to complete FieldDeclaration 报错 The source attachment does ...
- 转换,2D,3D
一,转换定义: 1,能够改变元素的形状,尺寸,位置 2,转换分两种: 2D转换:只能在X,Y轴发生改变: 例子:旋转(rotate).拉伸(scale).平移(move).倾斜(skew) 3D转换: ...
- rabbitMQ学习(一)
一般模式 服务端: import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabb ...
- KBMMW 4.93.00 发布
可喜可敬,作者非常勤奋,跟上了delphi 10.1 的步伐. 4.93.00 April 26 2016 Important notes (changes that may break existi ...
- uicollectionview registerclass vs registernib
当cell是用代码实现的时候用registerclass,当cell是用xib文件实现的时候用registernib
- Jquery--弹窗
<title>弹窗</title> <script src="JS/jquery-1.7.2.js"></script> <s ...