现在网上有不少提供 google hosts 的网址(本文的最后提供了几个 google hosts 的网站地址),当我们访问不了 google 时,就需要复制这个网站提供的 hosts 到我们本地的 hosts,在粘贴前还要在 C 盘一层一层的找到本地 hosts,比较麻烦。
于是就想能不能通过运行一条命令就能把网站里的 hosts 更新到本地,刚开始想的是用 php 写的,不过在跟同学聊天的过程中,同学建议使用 node 来实现这个功能,简单方便,而且我对 php 的正则表达式也不是很熟,那就用 node 试试吧。
我目前的环境是 windows,接下来的步骤大部分是按照 windows 操作系统进行操作的:
- 安装 node;
- 下载需要的集成包;
- 编写程序;
- 运行
1. 安装 node #
在官方的【下载链接】中,下载我们需要的链接,我选择的是下面这个类型。下载后,双击进行安装。
在现在的 node 版本中,默认是 node 和 npm 一起安装的,不用再单独安装 npm 了。安装成功后,使用 win+r 打开 cmd 命令窗口,然后输入node -v
查看当前 node 的版本号
输入npm -v
查看当前 npm 的版本号
如果两个都能正确的输出版本号,就说明 node 和 npm 已经安装成功了。使用.mis
类型的文件进行能够自动添加 node 和 npm 到 PATH 的环境变量中,让我们在任何的目录下都能使用这两个命令。
2. 下载需要的集成包 #
npm 是一个 node 的包管理和分发工具,已经成为了非官方的发布 node 模块(包)的标准。有了 npm,可以很快的找到特定服务要使用的包,进行下载、安装以及管理已经安装的包。
使用 npm 进行模块的安装非常的方便:npm install ****
,如果想安装成全局的,所有的项目都能使用,可以添加上-g
参数,如:npm install -g ****
。
本项目中主要使用到的模块有:
- request : 远程 url 请求
- cheerio : 类似于 jQuery,能够像 jQuery 那样选择元素,获取元素的内容
- fs : 这是 npm 里自带的,不用下载安装,主要用于文件的读写操作
3. 编写程序 #
程序的逻辑很简单:
- 获取远程 url 的网页内容;
- 解析出网页内容中 hosts 部分;
- 读取自己设置的一些 hosts;
- 讲自己的 hosts 和远程获取到的 hosts 一起写入到 C 盘的 hosts 文件中。
这里使用了 async 中的 waterfall(瀑布流)来控制整个代码的流程。
async.waterfall(
[
function (callback) {
self.log("正在连接 hosts url....");
callback(error, data);
},
function (body, callback) {
self.log("正在解析数据....");
callback(null, text);
},
function (text, callback) {
self.log("读取本地文件....");
callback(err, data);
},
function (text, callback) {
self.log("正在写入hosts....");
if (err) {
self.log("写入失败....");
} else {
self.log("写入成功....");
}
calllback(err);
},
function () {
self.log("运行完毕!");
},
],
function (err, data) {
console.log("err: " + err);
// console.log('data: '+data);
}
);
async.waterfall 提供瀑布式的流控制。每个操作产生的数据可以传递给下一个函数,通过 callback 这个回调函数。
async 模块保证回调只会被触发一次。它同时还为我们处理了错误,管理并行的任务。
这里还要说明一下:我这儿有一个单独的文件来放置自己的 hosts,比如当前目录中的 default.txt 文件
完整的代码可在github node-hosts下载
4. 运行代码 #
进入到这个项目所在的目录,首先运行npm install
,安装程序所需要的集成包。安装完成之后,然后运行 index.js:node index.js
。
当然,这里还有一个问题要注意,hosts 文件需要有可读写的权限,不然 hosts 是无法进行修改的。
程序采用的更新 hosts 的方式是全覆盖写入,因此我们需要把自己配置的一些 hosts 写到一个文件里(如 default.txt)。当程序更新时,会首先读取 default.txt 里的 hosts 配置,然后与远程地址里的 google hosts 一起写入到本地的 hosts 文件中。
代码里还有参数的默认配置:
_option : {
hostsurl : 'http://www.360kb.com/kb/2_122.html', // 请求地址
hostsfile : 'C:/Windows/System32/drivers/etc/hosts',// 本地hosts地址
localfile : './default.txt' // 默认hosts
}
你可以直接修改这些变量,或者在调用 init()方法时传递你需要的参数,程序自然会覆盖掉默认参数:
wzHosts.init({ hostsfile: "/etc/hosts", localfile: "/data/default.txt" });
这样,本地里的 google hosts 就更新到了最新!
5. 总结 #
通过这次的 hosts 读写,学习到了不少的 node 知识,欢迎提出你们的意见和建议!