mirror of https://gitee.com/zorlan/skycaiji
zorlan
2 years ago
1 changed files with 272 additions and 0 deletions
@ -0,0 +1,272 @@
|
||||
<?php |
||||
/* |
||||
|-------------------------------------------------------------------------- |
||||
| SkyCaiji (蓝天采集器) |
||||
|-------------------------------------------------------------------------- |
||||
| Copyright (c) 2018 https://www.skycaiji.com All rights reserved. |
||||
|-------------------------------------------------------------------------- |
||||
| 使用协议 https://www.skycaiji.com/licenses |
||||
|-------------------------------------------------------------------------- |
||||
*/ |
||||
|
||||
namespace skycaiji\admin\model; |
||||
|
||||
class ProxyIp extends \skycaiji\common\model\BaseModel { |
||||
public function __construct($data=[]){ |
||||
parent::__construct($data); |
||||
} |
||||
/*数据库ip转换成get_html格式的ip*/ |
||||
public function to_proxy_ip($proxyDbIp){ |
||||
if(empty($proxyDbIp)||empty($proxyDbIp['ip'])){ |
||||
|
||||
return null; |
||||
} |
||||
$ip=explode(':',$proxyDbIp['ip']); |
||||
if(empty($ip[0])){ |
||||
return null; |
||||
} |
||||
$proxyIp=array( |
||||
'ip'=>$ip[0], |
||||
'port'=>$ip[1], |
||||
'type'=>$proxyDbIp['type'], |
||||
); |
||||
if(!empty($proxyDbIp['user'])){ |
||||
|
||||
$proxyIp['user']=$proxyDbIp['user']; |
||||
$proxyIp['pwd']=$proxyDbIp['pwd']; |
||||
} |
||||
return $proxyIp; |
||||
} |
||||
/*获取可用的ip*/ |
||||
public function get_usable_ip(){ |
||||
$config=g_sc_c('proxy'); |
||||
init_array($config); |
||||
|
||||
if(!empty($config['open'])){ |
||||
|
||||
$cond=array(); |
||||
$order=null; |
||||
if(!empty($config['use'])){ |
||||
|
||||
if($config['use']=='num'){ |
||||
|
||||
$cond['num']=array('lt',$config['use_num']); |
||||
$order='no desc'; |
||||
}elseif($config['use']=='time'){ |
||||
|
||||
$cond['time']=array(array('eq',0),array('gt',time()-$config['use_time']*60), 'or') ; |
||||
$order='no desc'; |
||||
} |
||||
}else{ |
||||
|
||||
$cond['num']=array('lt',1); |
||||
} |
||||
if(!empty($config['group_id'])){ |
||||
|
||||
$cond['group_id']=$config['group_id']; |
||||
} |
||||
$cond['invalid']=0; |
||||
$proxyipData=$this->where($cond)->order($order)->find(); |
||||
|
||||
if(empty($proxyipData)&&!empty($config['api']['open'])){ |
||||
|
||||
$apiInsert=strtolower($config['api']['insert']); |
||||
if(empty($apiInsert)){ |
||||
|
||||
$cond2=array(); |
||||
if(!empty($config['group_id'])){ |
||||
|
||||
$cond2['group_id']=$config['group_id']; |
||||
} |
||||
$cond2['invalid']=0; |
||||
if($this->where($cond2)->count()<=0){ |
||||
|
||||
$this->add_api_ips(); |
||||
$proxyipData=$this->where($cond)->order($order)->find(); |
||||
} |
||||
}elseif($apiInsert=='end'){ |
||||
|
||||
$this->add_api_ips(); |
||||
$proxyipData=$this->where($cond)->order($order)->find(); |
||||
} |
||||
} |
||||
|
||||
if(empty($proxyipData)){ |
||||
|
||||
if(!empty($config['use'])){ |
||||
|
||||
if($config['use']=='num'){ |
||||
$this->strict(false)->where('1=1')->update(array('num'=>0)); |
||||
}elseif($config['use']=='time'){ |
||||
$this->strict(false)->where('1=1')->update(array('time'=>0)); |
||||
} |
||||
}else{ |
||||
|
||||
$this->strict(false)->where('1=1')->update(array('num'=>0)); |
||||
} |
||||
$proxyipData=$this->where($cond)->order($order)->find(); |
||||
} |
||||
if(!empty($proxyipData)){ |
||||
|
||||
$upData=array(); |
||||
if(!empty($config['use'])){ |
||||
|
||||
if($config['use']=='num'){ |
||||
|
||||
$upData['num']=$proxyipData['num']+1; |
||||
}elseif($config['use']=='time'){ |
||||
|
||||
if(empty($proxyipData['time'])){ |
||||
|
||||
$upData['time']=time(); |
||||
} |
||||
} |
||||
}else{ |
||||
|
||||
$upData['num']=$proxyipData['num']+1; |
||||
} |
||||
$this->strict(false)->where(array('ip'=>$proxyipData['ip']))->update($upData); |
||||
} |
||||
return $proxyipData; |
||||
} |
||||
return null; |
||||
} |
||||
/*ip失败次数*/ |
||||
public function set_ip_failed($proxy_ip){ |
||||
if(empty($proxy_ip)){ |
||||
return; |
||||
} |
||||
$upData=array(); |
||||
$upData['failed']=intval($proxy_ip['failed'])+1; |
||||
$failed=g_sc_c('proxy','failed'); |
||||
if(!empty($failed)){ |
||||
|
||||
if($upData['failed']>=$failed){ |
||||
|
||||
$upData['invalid']=1; |
||||
} |
||||
} |
||||
$this->strict(false)->where(array('ip'=>$proxy_ip['ip']))->update($upData); |
||||
} |
||||
/*代理类型*/ |
||||
public function proxy_types(){ |
||||
return array('http(s)'=>'','socks4'=>'socks4','socks5'=>'socks5'); |
||||
} |
||||
/*匹配格式的ip*/ |
||||
public function get_format_ips($html,$format,$multiple=false){ |
||||
if(empty($html)||empty($format)){ |
||||
return null; |
||||
} |
||||
$format=$this->convert_format($format); |
||||
|
||||
if(!$multiple){ |
||||
|
||||
$ip=null; |
||||
if(preg_match('/'.$format.'/i',$html,$mip)){ |
||||
$ip=array( |
||||
'ip'=>$mip['ip'], |
||||
'port'=>$mip['port'], |
||||
'user'=>$mip['user'], |
||||
'pwd'=>$mip['pwd'], |
||||
); |
||||
} |
||||
return $ip; |
||||
}else{ |
||||
|
||||
$ips=array(); |
||||
if(preg_match_all('/'.$format.'/i',$html,$mips)){ |
||||
init_array($mips['ip']); |
||||
init_array($mips['port']); |
||||
init_array($mips['user']); |
||||
init_array($mips['pwd']); |
||||
for($i=0;$i<count($mips[0]);$i++){ |
||||
$ips[$mips['ip'][$i].':'.$mips['port'][$i]]=array( |
||||
'ip'=>$mips['ip'][$i], |
||||
'port'=>$mips['port'][$i], |
||||
'user'=>$mips['user'][$i], |
||||
'pwd'=>$mips['pwd'][$i], |
||||
); |
||||
} |
||||
} |
||||
return $ips; |
||||
} |
||||
return null; |
||||
} |
||||
/*转换api匹配格式*/ |
||||
public function convert_format($format){ |
||||
static $list=array(); |
||||
$md5=md5($format); |
||||
if(!isset($list[$md5])){ |
||||
$format=controller('admin/Cpattern','event')->correct_reg_pattern($format); |
||||
$format=str_replace(array('[ip]','[端口]','[用户名]','[密码]','(*)') |
||||
,array('(?P<ip>(\d+\.){3}\d+)','(?P<port>\d+)','(?P<user>[^\s\\\'\"\<\>\,]*)','(?P<pwd>[^\s\\\'\"\<\>\,]*)','[\s\S]*?') |
||||
,$format); |
||||
|
||||
$list[$md5]=$format; |
||||
}else{ |
||||
$format=$list[$md5]; |
||||
} |
||||
return $format; |
||||
} |
||||
/*转换成数据库形式*/ |
||||
public function ips_format2db($ipList,$default=array()){ |
||||
$ipList=is_array($ipList)?$ipList:array(); |
||||
$default=is_array($default)?$default:array(); |
||||
$nowTime=time(); |
||||
foreach ($ipList as $k=>$ip){ |
||||
if(empty($ip)||empty($ip['ip'])){ |
||||
unset($ipList[$k]); |
||||
continue; |
||||
} |
||||
if(empty($ip['user'])){ |
||||
$ip['user']=$default['user']; |
||||
|
||||
$ip['pwd']=$default['pwd']; |
||||
} |
||||
$ip['ip']=$ip['ip'].':'.$ip['port']; |
||||
$ip['type']=$default['type']; |
||||
$ip['group_id']=$default['group_id']; |
||||
$ip['addtime']=$nowTime; |
||||
unset($ip['port']); |
||||
$ipList[$k]=$ip; |
||||
} |
||||
return $ipList; |
||||
} |
||||
|
||||
|
||||
private function add_api_ips(){ |
||||
$config=g_sc_c('proxy'); |
||||
if(!is_array($config)||empty($config['api'])||empty($config['api']['open'])||!is_array($config['apis'])){ |
||||
return; |
||||
} |
||||
foreach ($config['apis'] as $api){ |
||||
if(empty($api['api_url'])||!preg_match('/^\w+\:\/\//',$api['api_url'])||empty($api['api_format'])){ |
||||
|
||||
continue; |
||||
} |
||||
$timeout=intval($api['api_interval']); |
||||
$timeout=$timeout>0?$timeout*60:60; |
||||
$cname=md5($api['api_url']); |
||||
$mcahce=CacheModel::getInstance('proxy_api'); |
||||
if($mcahce->expire($cname,$timeout)){ |
||||
|
||||
$mcahce->setCache($cname, 1); |
||||
$html=get_html($api['api_url']); |
||||
$ips=$this->get_format_ips($html, $api['api_format'],true); |
||||
$ips = $this->ips_format2db ( $ips, array ( |
||||
'type' => $api ['api_type']?$api ['api_type']:'', |
||||
'user' => $api ['api_user']?$api ['api_user']:'', |
||||
'pwd' => $api ['api_pwd']?$api ['api_pwd']:'', |
||||
'group_id' => $api ['api_group_id']?$api ['api_group_id']:'', |
||||
) ); |
||||
|
||||
if(!empty($ips)){ |
||||
|
||||
$this->strict(false)->insertAll($ips,true,500); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
?> |
Loading…
Reference in new issue