摘要

  有道词典提供了柯林斯和朗文辞典,加上最近在背单词且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>
<type>words</type>
<operation>commit</operation>
<maxLocalTimestamp>1483321810485</maxLocalTimestamp>
<maxRemLocalTimestamp>1483321810507</maxRemLocalTimestamp>
<actionlist>
<action type="add">
<word><![CDATA[yield]]></word>
<wordInfo>
<phonetic><![CDATA[]]></phonetic>
<trans><![CDATA[- vt. 出产;屈服;放弃 - vi. 屈服,投降 - n. 收益;产量 时 态: yielded, yielding, yields 名 词: yielder ]]></trans>
<tags><![CDATA[]]></tags>
<addtime>1483321814</addtime>
<flag>1</flag>
</wordInfo>
</action>
</actionlist>
</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的更多相关文章

  1. bing词典vs有道词典对比测试报告——功能篇之细节与用户体验

    之所以将细节与用户体验放在一起讨论,是因为两者是那么的密不可分.所谓“细节决定成败”,在细节上让用户感受方便.舒适.不费心而且温馨,多一些人文理念,多一些情怀,做出来的产品自然比其他呆板的产品更受欢迎 ...

  2. 必应词典手机版(IOS版)与有道词典(IOS版)之软件分析【功能篇】【用户体验篇】

    1.序言: 随着手机功能的不断更新和推广,手机应用市场的竞争变得愈发激烈.这次我们选择必应词典和有道词典的苹果客户端作对比,进一步分析这两款词典的客户端在功能和用户体验方面的利弊.这次测评的主要评测人 ...

  3. 有道词典 Andriod 版本数据格式分析

    其实很简单无聊 基于版本 5.3 分析. 其实也简单分析了有道词典iOS版本,必应词典的各个版本,以及金山词典的各个版本,还有那个一直逍遥法外的林格斯词典. 由于在各个平台上的限制,同一词典的不同版本 ...

  4. ubuntu14.04 下安装有道词典

    安装步骤 1.ubuntu14.04.1版本下是不能直接安装有道词典的,首先需要把14.04.版升级为14.04.2版. 在终端窗口中输入以下命令: sudo apt-get update sudo ...

  5. (转)在Windows平台上安装Node.js及NPM模块管理

    本文转载自:http://www.cnblogs.com/seanlv/archive/2011/11/22/2258716.html 之前9月份的时候我写了一篇关于如何在Windows平台上手工管理 ...

  6. ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.

    在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写 ...

  7. mac 10.9开启有道词典取词功能

    取词时候,有道词典给出提示,说要去开启辅助功能,但提示的是在mac 10.8上面怎么操作,在10.9的话,就是以下位置去改了. 补充以下: 在mac机器上,实际上大多数的单词都能从自带的词典中查找到. ...

  8. MAC上有哪些优秀的日常软件| 入门级Mac OS 用户必备软件

    本文整理的网友反馈的MAC上有哪些优秀的日常软件+入门级Mac OS 用户必备软件,感兴趣的朋友可以看看,下载下来试用一样便知实不实用.如有更好的推荐,欢迎留言. MAC上有哪些优秀的日常软件 Tim ...

  9. 我在 Mac 上都用什么

    我在 Mac 上都用什么 Homebrew Homebrew 是统一管理 macOS 中应用的最佳方法之一,而且大量优秀的应用都可以在 Homebrew 中找到. 就不做过多介绍了, 有兴趣可以看相关 ...

随机推荐

  1. 怎么创建一个Database快照

    How to create the database Snapshot: use mastergoif not exists (select * from sys.databases where na ...

  2. git 源代码下载和安装(CentOS)

    1.阅读INSTALL文件 $ make configure ;# as yourself$ ./configure --prefix=/usr ;# as yourself$ make all do ...

  3. oracle 查询执行过的SQL语句

    SELECT * FROM v$sqlarea t WHERE t.FIRST_LOAD_TIME between '2016-12-23/16:03:00' and '2016-12-23/16:0 ...

  4. jquery 面板拖拽

    在网上找了好多的例子 都不满足我所需要 在网上找了一篇关于easyui是一个拓展的demo  然后根据demo 把我所需要的东西进行再次拓展 满足我的需求 也不多说了 上代码 首先 你肯定是要导eas ...

  5. 样式:让div里的两个控件在一行的操作

    table的td里如果放一个text,希望在右侧再放一个按钮,让这两个控件在一行,但是放了之后总是底部不能对齐,这样的话,加上下边这句样式就可以了 position:relative; top:17p ...

  6. IntelliJ IDEA 自动化工具安装并添加自动化测试框架

    IntelliJ IDEA是一个用于开发人员开发和测试人员自动化测试的测试工具,类似于eclipse. 优点:插件多自身可以携带,自身携带cucumber自动化测试框架,类似于junit一样 缺点:r ...

  7. IE8 jq focus BUG

    jq的 .focus() 在IE8下面会有一些意想不到的BUG,下面是解决办法: 一.我做的项目中有些场景需要用到键盘的回车作为触发事件,然后把focus移到其他功能或者按钮上面,刚刚好这个按钮或者功 ...

  8. Servlet--表单、超链接、转发、重定向4种情况的路径

    Servlet中相对路径总结 假设web工程使用如下目录结构: 在介绍相对路径和绝对路径前需要先了解几个概念: 服务器的站点根目录:以tomcat服务器为例,tomcat服务器站点根目录就是apach ...

  9. 采用TCP协议的PIC32MZ ethernet bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 趁热打铁,在上一PIC ...

  10. SQL Server 自定义聚合函数

    说明:本文依据网络转载整理而成,因为时间关系,其中原理暂时并未深入研究,只是整理备份留个记录而已. 目标:在SQL Server中自定义聚合函数,在Group BY语句中 ,不是单纯的SUM和MAX等 ...