当前位置: 首页 > news >正文

说说gogoTester-nodejs 的实现

    一直在使用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。   

转载于:https://www.cnblogs.com/subying/p/4541592.html

http://www.xdnf.cn/news/801901.html

相关文章:

  • 51单片机学习记录-11-LCD1602
  • RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)
  • 免费mp3音乐文件上传外链空间精选合辑
  • 网页设计成品DW静态网页Html5响应式css3——电影网站bootstrap制作(4页)
  • Windows Hook(1)加载DLL
  • 渗透测试实战之DNS欺骗攻击
  • 十个本年最炫的WebOS(网络操作系统)点评
  • 最新版飞秋下载
  • Android 6.0谷歌卡刷包,卡刷包走起:谷歌Nexus5升级安卓6.0/Android M教程
  • [转]NOKIA5320--偶必装的软件之大结局
  • TLF 中文字幕站
  • docker实践
  • CTF密码学总结(一)
  • 仙侣奇缘3说明
  • 如何在SQLServer中处理每天四亿三千万记录的
  • 私有服务器搭建及配置(下)
  • 锐捷设备密码破解方法
  • 金山篡改浏览器主页问题(改成毒霸网址大全)
  • LOL 战斗力查询
  • 下载并安装PPStream网络电视软件
  • linux mysql命令 bash: mysql: command not found 解决方法
  • xvid 详解 代码分析 编译等
  • 用HTML+CSS做一个漂亮简单的个人音乐网页
  • Android学习之路(17) Android Adapter详解
  • 作为新手小白,你应该了解的五个3DMAX的使用干货小技巧!
  • 主板常见故障维修24例
  • 最全操作系统综合题,腾讯T2大牛亲自教你
  • java编写webservice(使用Springboot框架)
  • 说一说windows7引导故障的解决
  • 【大模型:知识图谱】--3.py2neo连接图数据库neo4j