说说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。
说说gogoTester-nodejs 的实现的更多相关文章
- NodeJs之OS
OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...
- NodeJs之Path
Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...
- NodeJs之调试
关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...
- NodeJs在Linux下使用的各种问题
环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...
- NodeJs之child_process
一.child_process child_process是NodeJs的重要模块.帮助我们创建多进程任务,更好的利用了计算机的多核性能. 当然也支持线程间的通信. 二.child_process的几 ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- 图片访问实时处理的实现(nodejs和php)
我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...
- nodejs进阶(4)—读取图片到页面
我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...
- nodejs进阶(3)—路由处理
1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...
- 【原】nodejs全局安装和本地安装的区别
来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
随机推荐
- pcre库
pcre : perl compatible regular expressions , perl 兼容正则表达式 www.pcre.org 按装pcre是为了使Nginx支持具备URI重写功能的 ...
- Tomcat 启动成功后报 INFO [Timer-0] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access:
Tomcat 启动成功后报 INFO [Timer-0] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceL ...
- Android v7包下Toolbar和ActionBarActivity实现后退导航效果
android.support.v7包下的ToolBar和ActionBarActivity,均自带后退导航按钮,只是要手动开启,让它显示出来.先来看看ToolBar,页面前台代码: <andr ...
- Windows Phone开发手记-WinRT下启动器替代方案
在WP7/8时代,Silverlight框架提供了很多启动器API,我们可以很方便的使用的,来完成一些系统级的操作.但是随着Win RT架构的WP8.1(SL 8.1除外)的到来,原有的SL下的启动器 ...
- QQ gtk,bkn算法
public long GetGTK(string sKey) { ; , len = sKey.Length; i < len; ++i) { hash += (hash << ) ...
- C#:struct的陷阱:无法修改“xxx”的返回值,因为它不是变量
示例代码如下: public struct SpiderResult { public string robotName; public string RobotName { get { return ...
- C# 自定义类型通过实现IFormattable接口,来输出指定的格式和语言文化的字符串(例:DateTime)
常规的调用ToString()方法,存在两个问题. (1).调用者无法控制字符串的格式 (2).调用者不能方便的选择一种特定的语言文化来格式化字符串. 在开发一些国际化的应用时,应用程序需要调用与当前 ...
- 字符、字符串和文本的处理之String类型
.Net Framework中处理字符和字符串的主要有以下这么几个类: (1).System.Char类 一基础字符串处理类 (2).System.String类 一处理不可变的字符串(一经创建,字符 ...
- SQL 日期相减(间隔)datediff函数
select datediff(year, 开始日期,结束日期); --两日期间隔年 select datediff(quarter, 开始日期,结束日期); --两日期间隔季 select date ...
- java多线程下的所的概念
锁和synchronized关键字 为了同步多线程,Java语言使用监视器(monitors),一种高级的机制来限定某一 时刻只有一个线程执行一段受监视器保护的代码.监视器的行为是通过锁来实现 ...