说说gogoTester-nodejs 的实现

一直在使用goagent,所以对于查找google可用ip有了很大的兴趣,在github上面发现有一个项目是gogoTester,是用来查找google ip的,于是突发奇想自己用nodejs写了一个,为gogoTester-nodejs,用nodejs实现查询google可用ip。gogoTester-nodejs 跟 gogoTester其实没有啥联系,除了使用一样的ip range(ip 段范围),其他的都是自己折腾出来的,因为gogoTester是用c#写得,看得不懂...

git项目地址为:[email protected] https://git.oschina.net/subying/gogoTester-nodejs ;github:https://github.com/subying/gogoTester-nodejs

其实实现起来并不难,毕竟菜鸟。实现的方式可以能会有多种,但是流程应该是差不多,这也是一个很傻瓜化的方式,就是拿到一堆google可能会用到的ip段,然后逐个去测试,测试通过的就是可用的ip,至少能够通过这个ip直接访问google了,可以分一下几步来实现:

1.找到可用的ip 段

我承认我也不知道,所以我直接拿的是别人的,直接从gogoTester那里拿到了,然后转换成了数组,在我git项目中的ip.js可以看到,以后扩展也是通过维护这个文件。其中的代码是这样的方式

var iptables = [];
iptables.push("1.179.248.0-255");
iptables.push("1.179.249.0-255");
iptables.push("1.179.250.0-255");

数组里面的每一项是用ip段和范围组成的,“1.179.248.0-255 ”表示1.179.248.0-1.179.248.255这样的Ip段范围,所以需要一个转换的方法。

2.把数组中的每一项转成对应的ip段

“1.179.248.0-255”表示1.179.248.0-1.179.248.255这样的Ip段范围 ,那么就用split方法把字符串分成四段,最后一段是范围值,可以这样做:

checkStr:function(str){//检查并转换
        var arr = str.split(‘.‘)
            ,_ipStr = arr[0]+‘.‘+arr[1]+‘.‘+arr[2]+‘.‘
            ,_range = arr[3].split(‘-‘)
            ,_start = _range[0] || 1
            ,_end = _range[1]
            ,i = _start
            ,_self = this
        ;
        _self._ipStr = _ipStr;
        for(;i<_end;i++){
            _self.pushTask(i);
        }
    }

这样通过最后的一段循环,把需要查询的ip给记录下来。

3.   测试的方法

拿到需要查询的Ip后就是进行测试了,我这里用的是简单的http请求,通过判断返回的是否为‘gws‘(google服务器)来判断是否为google ip。方法里面还设置了超时,毕竟大家都不想访问一个太卡的Ip,所以设置了请求响应的时间,方法如下

function httpGet(ip,cb){
    var req = http.get(‘http://‘+ip)
        ,err=false
    ;

    function endAysnc(){
        req.abort();

        if(!err){
            err = true;
            cb();
        }
    }

    req.on(‘response‘,function(res){
        //修改了判断,直接用header信息中server的判断,加快了判断速度
        if(res.headers.server === ‘gws‘){
            checkIpPad.addGoodIp(ip);
        }
        res.destroy();

        endAysnc();
    })
    .on(‘error‘,function(err){
        endAysnc();
        //throw err;
    })
    .setTimeout(checkIpPad.timeout,function(){
        endAysnc();
    });

    return req;
}

4.执行测试的控制

nodejs的http请求都是异步的,如果你不控制请求的数量,我保证你的程序很快就挂掉了,那么就需要控制同时执行的任务数量,我这里用的是async模块,这是一个很不错的模块,这里就不介绍了,大家可以搜索来了解,方法如下:

var q = async.queue(function(task, callback) {
    util.log(‘worker is processing task: ‘+task.name);
    task.run(callback);
}, checkIpPad.threadNum);
/**
* 监听:如果某次push操作后,任务数将达到或超过worker数量时,将调用该函数
*/
q.saturated = function() {
    util.log(‘all workers to be used‘);
}

/**
* 监听:当最后一个任务交给worker时,将调用该函数
*/
q.empty = function() {
    util.log(‘no more tasks wating‘);
}

/**
* 监听:当所有任务都执行完以后,将调用该函数
*/
q.drain = function() {
    checkIpPad.finishTask();
}

5.测试顺序的方式

ip.js文件里面包含的ip段就有2000多,每个ip段里面包含了一个范围,也就是有多个ip,这样下来就会有很多ip需要测试了,这个时候需要考虑测试的方式。当然最简单的就是从头到尾测试,这是最直接的方法,但是这样可能耗时会比较多。我这里还用了一个随机测试的方法,主要是数组长度范围内的随机数,然后再去找到这个对应的Ip段,再去测试里面的Ip,需要注意的是要防止重复

,randomCheck:function(){//随机查询
        var _self = this
            ,_num = _self.getRandom(0,_self.len-1)
            ,_str = _self.arr[_num];
        ;
        _self.checkType=‘random‘;
        _self.index = _num;
        _self._cacheIndex = _self._cacheIndex + ‘_‘+_num+‘_‘;

        _self.checkStr(_str);
    }
    ,listCheck:function(){//顺序查找
        var _self = this
            ,_num = _self.isInit?_self.index+1:_self.index
            ,_str
        ;
        if(_num>=_self.len){
            return false;
        }

        _self.checkType=‘list‘;
        _self.index = _num;
        _str = _self.arr[_num];
        _self.checkStr(_str);
    }
    ,getRandom:function(t1,t2){//获取随机数
    	var _self = this
    		,_num = Math.floor(Math.random()*(t2-t1)+t1)
    		,_flag = true
    		,_cache = _self._cacheIndex
    	;
    	while(_flag){
    		if(_cache.indexOf(‘_‘+_num+‘_‘)===-1){
    			_flag = false;
    		}else{
    			_num = Math.floor(Math.random()*(t2-t1)+t1);
    		}
    	}
        return _num;
    }

这里看到了随机测试和顺序测试的方法,经过本人测试,发现随机测试平均耗时会更少一些,不过话说是靠人品的...

实现的方式就是这样,里面主要是用到了Ip段、http请求、async控制和随机测试,感兴趣的朋友可以了解一下。另外,我用到的Http请求的方式是不够严谨的,因为google用的是https协议,所以用Https会更好,但是我目前还没有实现,希望已经实现的朋友能给我一些帮助。

本文同步发表在我的个人博客:http://www.subying.com/archives/125.html

时间: 2024-10-11 01:34:19

说说gogoTester-nodejs 的实现的相关文章

Node.js 使用angularjs取得Nodejs http服务端返回的JSON数组示例

server.js代码: // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http"); // 创建服务器,创建HTTP服务器要调用http.createServer()函数,它只有一个参数,是个回调函数,服务器每次收到http请求后都会调用这个回调函数.服务器每收到一条http请求,都会用新的request和response对象触发请求函数. var server=http.createS

Nodejs + MongoDb

一.搭建开发环境 进入 http://nodejs.org 下载开发环境 http://Expressjs.com 下载安装Express  npm install -g express 继续安装ejs:npm install ejs 如果要想运行Node.js程序,则现在只能够使用“node app.js”,而这样的运行方式,如果在app.js文件修改之后往往需要重新启动才可以加载新的内容,这对于开发是非常不方便的, 为此,可以使用一个supervisor组件包,它可以动态的加载修改之后的开发

nodejs应用在linux服务器中的部署

1.(可选)添加用户: addgroup wmui添加用户组useradd -d /home/wmui -s /bin/bash -m wmui创建wmui用户passwd wmui设置密码,如果忘记密码,也可用此命令重置密码usermod -a -G wmui wmui 添加用户到组visudo 设置sudo权限然后会跳转到下面页面 root ALL=(ALL:ALL) ALL下面添加wmui ALL=(ALL) NOPASSWD: ALLctrl+x保存退出接下来打开一个新的窗口,测试是否登

centos 6.5安装NodeJS

centos 6.5安装NodeJS 下载 可以在本地下载node.js最新版,然后通过ftp工具上传到服务器,或者直接在服务器终端使用wget命令下载(我当时下载的是node-v7.5.0-linux-x86版本,其他版本请查看上面链接然后替换即可): $ wget http://nodejs.org/dist/latest/node-v7.5.0-linux-x86.tar.gz 解压 进入服务器终端,找到上传或者下载的安装包,解压 $ tar -zvxf node-v7.5.0-linux

NodeJS之queryString

前面的话 无论是前端还是后端,经常出现的应用场景是URL中参数的处理.nodeJS的queryString模块提供了一些处理 query strings 的工具.本文将详细介绍nodeJS中的queryString var querystring = require('querystring'); /* { unescapeBuffer: [Function], unescape: [Function: qsUnescape], escape: [Function], encode: [Func

进阶之初探nodeJS

一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知识稍多,适合初级入门node,固萌生一个想法--想在该篇随笔中,通过一步步编写一个稍大一点的node示例,让我们在整体上更加全面地了解node. so,该篇随笔是建立在"初探nodeJS"之上的,固取名为"进阶之初探nodeJS". 好了,侃了这多,那么我们即将实现一个

引用nodejs的url模块实现url路由功能

我们在本地创建服务器之后需要写不同的后缀名来访问同一个站点的不同页面,如果不实现路由功能.则每次访问localhost:3000 不论后面写什么  比如localhost:3000/index.localhost:3000/detail...最终都会访问同一个地址:而用url路由则可以实现访问不同的页面:在实现url路由功能之前,首先需要引入url模块:const url = require('url');  nodejs 为我们提供了url模块,并且提供了url模块的一些方法: 最终要的方法是

nodejs入门 多人聊天视频

Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascript,那么你将会很容易的学会Node.js. 下边是nodejs的安装和多人聊天系统, windows环境下 1.安装nodejs nodejs的官网 https://nodejs.org/en/ 下载nodejs最新版本一步步安装就好. 没有什么可说的. 2.安装完成以后查看当前nodejs的版本和测试nodejs时候成功 查看nodejs版本. cmd命令行窗口 ---> node -v 测试nodejs 是否

NodeJs编写小爬虫

一,爬虫及Robots协议 爬虫,是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化. robots.txt是一个文本文件,robots是一个协议,而不是一个命令.robots.txt是爬虫要查看的第一个文件.robots.txt文件告诉爬虫在服务器上什么文件是可以被查看的,搜索机器人就会按照该文件中的内容来确定访问的范围. 如上图,我们可以在网站中直接访问robots.txt文件查看网站禁止访问和允许访问的文件. 二,使用NodeJs爬去

ActiveMQ + NodeJS + Stomp 极简入门

前提 安装ActiveMQ和Nodejs 测试步骤 1.执行bin\win32\activemq.bat启动MQ服务 2. 打开http://localhost:8161/admin/topics.jsp 用户名和密码都是 admin 3. 下载Stomp npm install stomp-client 4. js的测试代码 var Stomp = require('stomp-client'); var destination = '/topic/myTopic'; var client =