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

git项目地址为:osc@git 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

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

  1. NodeJs之OS

    OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...

  2. NodeJs之Path

    Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...

  3. NodeJs之调试

    关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...

  4. NodeJs在Linux下使用的各种问题

    环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...

  5. NodeJs之child_process

    一.child_process child_process是NodeJs的重要模块.帮助我们创建多进程任务,更好的利用了计算机的多核性能. 当然也支持线程间的通信. 二.child_process的几 ...

  6. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  7. 图片访问实时处理的实现(nodejs和php)

    我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...

  8. nodejs进阶(4)—读取图片到页面

    我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...

  9. nodejs进阶(3)—路由处理

    1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...

  10. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

随机推荐

  1. servlet实现商品商场项目

    1.1 1.创建四个包DButils reposiable service servletJPK DButils包中的类jdbcutils.java 用于获取工具类DButils工具类的DataSou ...

  2. C#编程任务: 把工作交给别人并等待其执行完成

    生活中有这样的场景: 我有一件事情需要别人帮忙去办, 但是别人也很忙呀, 所以我只能把任务记载他的任务清单上, 等他一个个扫下来扫到我的并且完成之后再来告诉我. 这其实是一个多线程的问题. 我是线程A ...

  3. Centos 7 开启BBR

    # 升级内核 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elr ...

  4. MySQL 5.5主从复制(Replication)

    简介 MySQL的主从复制(Replication),可以保持两台MySQL数据库的内容一致.因为其同步过程是异步的,所以备份数据库上做任何操作,都不会影响主数据库的性能.对游戏后台数据库而言,这是一 ...

  5. Sharding-jdbc(一)分库分表理解

    1.什么是分库分表 所谓的分库分表就是数据的分片(Sharding). 2.为什么需要分库分表 因为随着公司的业务越来越大,对于现成单机单个应用瓶颈问题,对数据持久化硬盘如何进行扩容. 可以从4个方面 ...

  6. JavaScript初探二

    //----------总结01.查找dom元素 document.getElementById();//通过id获取一个dom元素 document.getElementsByClassName() ...

  7. 31-hadoop-hbase-mapreduce操作hbase

    有一些大的文件,需要存入HBase中,其思想是先把文件传到HDFS上,利用map阶段读取<key,value>对,可在reduce把这些键值对上传到HBase中. HbaseMapper: ...

  8. maven-compiler-plugin 指定jdk的版本和编码

    为了让maven的jdk编译版本一致, 使用maven-compiler-plugin插件来协助管理 建议新建maven项目后的第一步就是配置该插件 <build> <plugins ...

  9. 数组filter()参数详解,巧用filter()数组去重

    数组方法挺多,但是用来用去可能也就foreach,splice以及slice接触较多,filter()说实话之前也没过多了解.其实filter()为数组提供过滤功能,它会遍历数组所有元素,并返回满足条 ...

  10. 开启Centos网卡失败的解决办法

    虚拟机安装了Centos,使用ip addr命令查看网卡,但是ens33没有ip地址,按照网上说的,修改ens33网卡的配置文件: vi /etc/sysconfig/network-scripts/ ...