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 中找到. 就不做过多介绍了, 有兴趣可以看相关 ...
随机推荐
- appium移动端测试之滑动(二)
在ios测试中,需要用到滑动,所以用java封装了一套滑动的方法,不多说,贴代码 /** * 上滑1/4屏幕 */ public void slideUP1_4() { int x = driver. ...
- java.lang.classnotfoundexception org.json.jsonexception
java.lang.classnotfoundexception org.json.jsonexception 解决方法 http://www.java2s.com/Code/Jar/j/Downlo ...
- clientTop、offsetTop和scrollTop的区分
页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight; 网页可见区域宽: document.body.offse ...
- border:none;与border:0;的区别
border:none表示边框样式无,border:0表示边框宽度为0;当定义了border:none,即隐藏了边框的显示,实际就是边框宽度为0. 当定义边框时,必须定义边框的显示样式.因为边框默认样 ...
- Android IOS WebRTC 音视频开发总结(八十六)-- WebRTC中RTP/RTCP协议实现分析
本文主要介绍WebRTC中的RTP/RTCP协议,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID ...
- 常见寻找OEP脱壳的方法
方法一: 1.用OD载入,不分析代码! 2.单步向下跟踪F8,是向下跳的让它实现 3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——运行到所选) 4.绿色线条表 ...
- Build OpenCV text(OCR) module on windows
Background. AOI software needs to use the OCR feature to recognize the texts on the chips. Because o ...
- egret.Tween、egret.Ease
循环调用.只能设置boolean,不能设置循环次数. egret.Tween.).call(()=>{ console.log("循环调用"); }) 每次改变时,调用onC ...
- HTTP权威协议笔记-7.缓存
7.1 冗余的数据传输 缓存的作用:当客户端每次访问服务器,服务器都会返回一份相同文件,一些相同的字节会不断的在网络内传输,这样冗余的数据传输会耗尽昂贵的带宽,降低传输速度,加重Web服务器的负载. ...
- ---awk 调shell 命令的方法
cat /etc/passwd | awk -F: '/root/{ system ("echo "$1) }'