THINKPHP 通用采集类,通过CURL提交请求,保持cookie,可变参数

//采集公共类
class CurlApi extends HomeController {

/** 
* reqeust_by_curl
* 通过Curl请求 
*
* @param string $url 请求地址,必选
* @param array/string POST或PUT的数据参数
* @param string $mothod 请求类型 POST GET PUT DELETE
* @param string $cookie_dir cookie 保存目录,默认保存到系统临时目录
* @param string $cookie_file 已有 cookie 文件时,使用该 cookie 文件里的 cookie 访问
* @param string $http_version HTTP 版本,支持 1.0, 1.1, 2.0, 2TLS, 2_PRIOR_KNOWLEDGE ,默认 1.1
* @param string $referer 来源地址
* @param array $headers 自定义头部信息
* @param boolean $nobody 是否返回消息主体
* @param string $encoding 编码类型 identity, deflate, gzip
* @param int $request_timeout 请求超时时间
* @param int $response_timeout 响应超时时间
* @param string $user_agent 用户浏览器类型
* @return mixed array
*   int httpcode 响应代码
*   array cookies  数组保存的获取到的 cookie
*   string cookie_file 本次保存的 cookie 文件
*   string effective_url 跳转地址
*   string header 响应头
*   string body 响应主体
*/  
    public function request_by_curl()
    {
        // 获得传入的所有参数的数组
        $args_arr = func_get_args();

        // 数组分配变量,添加arg_头缀
        extract($args_arr[0], EXTR_PREFIX_ALL, 'arg');

        // 请求地址,必填,否则返回false;
        $url = $arg_url;
        if(empty($url)) {
            return false;
        }
        isset($arg_data) ? $data = $arg_data : $data = null;
        isset($arg_method) ? $method = $arg_method : $method = 'GET';
        isset($arg_cookie_dir) ? $cookie_dir = $arg_cookie_dir : $cookie_dir = sys_get_temp_dir();
        isset($arg_cookie_file) ? $cookie_file = $arg_cookie_file : $cookie_file = null;
        isset($arg_http_version) ? $http_version = $arg_http_version : $http_version = '1.1';
        isset($arg_referer) ? $referer = $arg_referer : $referer = null;
        isset($arg_headers) ? $headers = $arg_headers : $headers = null;
        isset($arg_nobody) ? $nobody = $arg_nobody : $nobody = false;
        isset($arg_encoding) ? $encoding = $arg_encoding : $encoding = null;
        isset($arg_request_timeout) ? $request_timeout = $arg_request_timeout : $request_timeout = 30;
        isset($arg_response_timeout) ? $response_timeout = $arg_response_timeout : $response_timeout = 30;
        isset($arg_user_agent) ? $user_agent = $arg_user_agent : $user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0;)';

        $ch = curl_init();
        // 请求地址
        curl_setopt($ch, CURLOPT_URL, $url);

        // cookie处理
        if(empty($cookie_file)) {
        	$cookie_file = tempnam($cookie_dir, 'shuke_');
        }
        $size = strlen(file_get_contents($cookie_file));
        if($size <= 0) {
            curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
        } else {
            curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
        }
        
        // SSL HTTPS
        if(stripos($url, 'https://') !== false) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_SSLVERSION, 1);
        }

        // 设置同时返回响应头信息
        curl_setopt($ch, CURLOPT_HEADER, TRUE);
        // 设置不返回消息主体
        if($nobody) {
            curl_setopt($ch, CURLOPT_NOBODY, TRUE);
        }
		// 设置返回值给变量,不直接显示结果
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        // 请求超时时间
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $request_timeout); 
		// 响应超时时间
        curl_setopt($ch, CURLOPT_TIMEOUT, $response_timeout);
        // User-Agent
        curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
        // Accept-Encoding
        if(!empty($encoding)) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, 'Accept-Encoding: '.$encoding);
            curl_setopt($ch, CURLOPT_ENCODING, $encoding);
        }
        // 自定义header
        if(!empty($headers)) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }
        // 来源Referer
        if(!empty($referer)) {
            curl_setopt($ch, CURLOPT_REFERER, $referer);
        }
        // 抓取跳转信息
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);	


        // HTTP版本选择,默认HTTP 1.1
        switch($http_version) {
            case '1.0':
                curl_setopt($ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_0);
                break;
             case '2.0':
                curl_setopt($ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_2_0);
                break;
            case '2TLS':
                curl_setopt($ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_2TLS);
                break;
            case '2_PRIOR_KNOWLEDGE':
                curl_setopt($ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE);
                break;
            default:
                curl_setopt($ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1);
        }
        //拼接参数
        $query_string = '';
        if(is_array($data)) {
            foreach ($data as $key => $val) {
                $query_string .= urlencode($key).'='.urlencode($val).'&';
            }
            $query_string = substr($query_string, 0, -1);
        } else {
            $query_string = $data;
        }

        //请求方法,默认GET
        switch($method) {
            case 'POST':
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string);
                break;
            case 'PUT':
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
                curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string);
                break;
            case 'DELETE':
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
                break;
            default:
        }
   
        $response = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $effective_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
        curl_close($ch);
        
        // 折分响应头和主体
        list($header, $body) = explode("\r\n\r\n", $response, 2);

        // 解析响应头 cookie
		preg_match_all("/set\-cookie:([^\r\n]*)/i", $header, $matches); 
		$cookie = $matches[1]; 

        $response_arr = array('httpcode' => $httpcode, 'cookies'=> $cookie, 'cookie_file'=> $cookie_file, 'effective_url' => $effective_url, 'header' => $header, 'body' => $body);
        return $response_arr;
    }
}

简单调用GET请求:

$curlGet = new CurlApi;
//GET请求,响应结果存入$result变量
$result = $curlGet->request_by_curl(array('url' => 'http://www.shukeiot.cn/api'));
//取得cookie_file存放目录,下次请求可以带着cookie
if($result['httpcode'] ==  200) {
    $cookie_file = $result['cookie_file'];
}

//模拟登陆, $arr_params参数根据需要选择即可,最简只需要传入url
$arr_params = array(
    // 请求地址,支持 SSL
    'url'=>$this->login_index,
    // 请求方法 GET, POST, PUT, DELETE
    'method' => 'POST',
    // 传递的数据,可传 null, array, string
    'data' => array(
        'username' => $username,
        'password' => $password
    ),
    // 已有 cookie 文件时,使用该 cookie 文件里的 cookie 访问
    'cookie_file' => $cookie_file,
);

$login_result = $curlGet->request_by_curl($arr_params);

 

转载于:https://my.oschina.net/u/3152070/blog/910984

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值