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更新google hosts

在现在的node版本中,默认是node和npm一起安装的,不用再单独安装npm了。安装成功后,使用win+r打开cmd命令窗口,然后输入node -v查看当前node的版本号

使用node更新google hosts

输入npm -v查看当前npm的版本号

使用node更新google hosts

如果两个都能正确的输出版本号,就说明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,如果正常的话,就会出现下面的提示:

使用node更新google hosts

当然,这里还有一个问题要注意,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知识,欢迎提出你们的意见和建议!

google hosts 更新网址 #

阅读(970)
Simple Empty
No data