Wenzi

使用node更新google hosts

蚊子前端博客
发布于 2015/03/27 07:00
因为某些原因导致我们无法享受google的功能,而手动复制粘贴google hosts又比较麻烦。本篇将会讲解如何使用node一条命令更新本地的hosts文件,轻松登上google

现在网上有不少提供 google hosts 的网址(本文的最后提供了几个 google hosts 的网站地址),当我们访问不了 google 时,就需要复制这个网站提供的 hosts 到我们本地的 hosts,在粘贴前还要在 C 盘一层一层的找到本地 hosts,比较麻烦。

于是就想能不能通过运行一条命令就能把网站里的 hosts 更新到本地,刚开始想的是用 php 写的,不过在跟同学聊天的过程中,同学建议使用 node 来实现这个功能,简单方便,而且我对 php 的正则表达式也不是很熟,那就用 node 试试吧。

我目前的环境是 windows,接下来的步骤大部分是按照 windows 操作系统进行操作的:

  1. 安装 node;
  2. 下载需要的集成包;
  3. 编写程序;
  4. 运行

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. 编写程序 #

程序的逻辑很简单:

  1. 获取远程 url 的网页内容;
  2. 解析出网页内容中 hosts 部分;
  3. 读取自己设置的一些 hosts;
  4. 讲自己的 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 知识,欢迎提出你们的意见和建议!

阅读(1003)
Simple Empty
No data