这是一个简单的php curl操作class。
它模拟成了chrome agent,能保存cookie到文件。
能带上cookie、通过socks5代理进行GET、POST操作。
它模拟成了chrome agent,能保存cookie到文件。
能带上cookie、通过socks5代理进行GET、POST操作。
服务器端会认为这是一个chrome浏览器。
<?php
/*
* 调用方式:$curl = Model_Curl::instance();
* $curl->get(....);
* $curl->get_file(....);
* $curl->post(....);
*/
class Model_Curl {
protected static $_instance = null;
public static function instance(){
if(self::$_instance == null){
self::$_instance = new self();
}
return self::$_instance;
}
public $agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36';
public $accept = 'application/json, text/javascript, */*; q=0.01';
public $accept_language = 'zh-CN,zh;q=0.8,en;q=0.6';
public $accept_encoding = 'gzip, deflate';
public $connection = 'keep-alive';
public $content_type = 'application/x-www-form-urlencoded; charset=UTF-8';
public $cookie_file = null;
/*
* 参数说明:
* $url 网址,
* $referer 来源网址 如客户端从 http://www.domain.com/login 跳转到了 http://www.domain.com/home,
* 那么,$referer 就是 http://www.domain.com/login
* $timeout 告诉curl多久超时停止,
* $header_params 自定义agent等header信息类型,一般用不到
*/
public function get($url,$referer='',$timeout=10,array $header_params=null){
$return = array();
$cont=curl_init($url);//创建要跳转的URL
if(!empty($GLOBALS['CURL_S5_PROXY'])){
echo '*';
curl_setopt($cont,CURLOPT_PROXY,$GLOBALS['CURL_S5_PROXY']);
curl_setopt($cont, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
}
curl_setopt($cont,CURLOPT_TIMEOUT,$timeout);
curl_setopt($cont,CURLOPT_HEADER,0);//返回头部
curl_setopt($cont,CURLOPT_RETURNTRANSFER,1);//返回信息并显示
$cookie_file = $this->cookie_file;
if(!empty($cookie_file)){
curl_setopt($cont,CURLOPT_COOKIEFILE,$cookie_file);//调用已经存在的COOKIE文件
curl_setopt($cont,CURLOPT_COOKIEJAR,$cookie_file);//返回COOKIE文件放到临时文件
}
curl_setopt($cont,CURLOPT_ENCODING,$this->accept_encoding);
curl_setopt($cont,CURLOPT_USERAGENT,$this->agent);
if(!empty($referer)){
curl_setopt($cont,CURLOPT_REFERER, $referer);
}
curl_setopt($cont,CURLOPT_FOLLOWLOCATION,1);
$header = array();
//$header[] = 'Accept:*/*';
$header[] = 'Accept:'.$this->accept;
$header[] = 'Connection:'.$this->connection;
$header[] = 'Accept-Language:'.$this->accept_language;
$header[] = 'Cache-Control:max-age=0';
$header[] = 'Content-Type:'.$this->content_type;;
if(!empty($header_params)){
$header = array_merge($header,$header_params);
}
curl_setopt($cont, CURLOPT_HTTPHEADER, $header);
$contes=curl_exec($cont);//执行已经定义的设置
$errno = curl_errno($cont);
$return['data'] = $contes;
$return['errno'] = $errno;
return $return;
}
/*
* 参数说明:
* $url 网址,$file_path 抓来的文件放的目录(不带/),
* $filename 抓来的文件存储名字,
* $timeout 告诉curl多久超时停止,
* $header_params 自定义agent等header信息类型,一般用不到
*/
public function get_file($url,$file_path,$filename,$timeout=10,array $header_params=null){
createDir($file_path);
$filename = $file_path .'/'. $filename;
$cont=curl_init($url);
if(!empty($GLOBALS['CURL_S5_PROXY'])){
echo '*';
curl_setopt($cont,CURLOPT_PROXY,$GLOBALS['CURL_S5_PROXY']);
curl_setopt($cont, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
}
curl_setopt($cont,CURLOPT_TIMEOUT,$timeout);
//curl_setopt($cont,CURLOPT_FILE,$file);
curl_setopt($cont,CURLOPT_HEADER,0);//返回头部
curl_setopt($cont,CURLOPT_RETURNTRANSFER,1);//返回信息并显示
$cookie_file = $this->cookie_file;
if(!empty($cookie_file)){
curl_setopt($cont,CURLOPT_COOKIEFILE,$cookie_file);//调用已经存在的COOKIE文件
curl_setopt($cont,CURLOPT_COOKIEJAR,$cookie_file);//返回COOKIE文件放到临时文件
}
curl_setopt($cont,CURLOPT_ENCODING,$this->accept_encoding);
curl_setopt($cont,CURLOPT_USERAGENT,$this->agent);
curl_setopt($cont,CURLOPT_AUTOREFERER,true);
curl_setopt($cont,CURLOPT_FOLLOWLOCATION,true);
$header = array();
$header[] = 'Accept:'.$this->accept;
$header[] = 'Connection:'.$this->connection;
$header[] = 'Accept-Language:'.$this->accept_language;
$header[] = 'Cache-Control:max-age=0';
$header[] = 'Content-Type:'.$this->content_type;;
curl_setopt($cont, CURLOPT_HTTPHEADER, $header);
$contes=curl_exec($cont);//执行已经定义的设置
file_put_contents($filename,$contes);
$errno = curl_errno($cont);
if(!empty($errno)){
//echo "curl_errno:{$errno}\n";
return array('curl_errno'=>$errno);
}
curl_close($cont);
}
/*
* 参数说明:
* $url 网址,$form array数组例如array('username'=>'john','passord'=>'123456'),
* $referer 来源网址 如客户端从 http://www.domain.com/login 跳转到了 http://www.domain.com/home,
* 那么,$referer 就是 http://www.domain.com/login
* $timeout 告诉curl多久超时停止,
* $header_params 自定义agent等header信息类型,一般用不到
*/
public function post($url,$form,$referer='',$timeout=10,array $header_params=null){
if(is_array($form)){
$post = http_build_query($form);
}
else{
echo "post str custom\n";
$post = $form;
}
$cont=curl_init($url);//创建要跳转的URL
if(!empty($GLOBALS['CURL_S5_PROXY'])){
echo '*';
curl_setopt($cont,CURLOPT_PROXY,$GLOBALS['CURL_S5_PROXY']);
curl_setopt($cont, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
}
curl_setopt($cont,CURLOPT_TIMEOUT,$timeout);
curl_setopt($cont,CURLOPT_HEADER,0);//返回头部
curl_setopt($cont,CURLOPT_POST,1);//设置POST提交
curl_setopt($cont,CURLOPT_RETURNTRANSFER,1);//返回信息并显示
$cookie_file = $this->cookie_file;
if(!empty($cookie_file)){
curl_setopt($cont,CURLOPT_COOKIEFILE,$cookie_file);//调用已经存在的COOKIE文件
curl_setopt($cont,CURLOPT_COOKIEJAR,$cookie_file);//返回COOKIE文件放到临时文件
}
curl_setopt($cont,CURLOPT_POSTFIELDS,$post);//提交POST数据
if(!empty($referer)){
curl_setopt($cont,CURLOPT_REFERER, $referer);
}
curl_setopt($cont,CURLOPT_FOLLOWLOCATION,1);
$header = array();
//$header[] = 'Accept:*/*';
$header[] = 'Accept:'.$this->accept;
$header[] = 'Connection:'.$this->connection;
$header[] = 'Accept-Language:'.$this->accept_language;
$header[] = 'Cache-Control:max-age=0';
$header[] = 'Content-Type:'.$this->content_type;;
if(!empty($header_params)){
$header = array_merge($header,$header_params);
}
curl_setopt($cont, CURLOPT_HTTPHEADER, $header);
$contes=curl_exec($cont);//执行已经定义的设置
$errno = curl_errno($cont);
curl_close($cont);
$return = array();
$return['data'] = $contes;
$return['errno'] = $errno;
return $return;
}
}
当全局变量 $GLOBALS['CURL_S5_PROXY'] 不为空时,该curl自动通过配置的s5代理操作。
举个栗子:
<?php
//声明全局变量
$CURL_S5_PROXY = ‘username:password@111.222.111.222:1080’
那么curl通过用户名为username,密码为password,地址为111.222.111.222,端口为1080的s5代理进行操作。
这样对方服务器就认为你的IP是111.222.111.222。
当要保存服务器端传过来的cookie,然后下一步操作要带上cookie时,需要设置 $curl->cookie_file=''cookie文件路径;
如这样:
<?php
$curl->cookie_file = ROOT_PATH . '/cookie/c001.ck'
$curl->get 相当于浏览器查看网页;
$curl->get_file 相当于浏览器下载图片、文件等;
$curl->post 相当于浏览器发贴、注册等情况下提交的form;