【PHP】通过CURL获取结果集

小破孩
2022-06-23 / 0 评论 / 82 阅读 / 正在检测是否收录...

在PHP调用别人的接口,需要用到curl相关操作,本文章集成了多个操作方法,并在今后的工作中不断完善



        /**
     * @Author: 小破孩嫩
     * @Email: 3584685883@qq.com
     * @Time: 2021/4/1 10:39
     * @param string $url url地址
     * @param bool $params 参数
     * @param int $ispost 是否是post请求,默认get
     * @param int $https 是否是https,默认http
     * @param int $flbg 返回值是否转成数组,默认不转
     * @param int $header 是否传递header值,默认不传,header值格式:$header = ['CLIENT-IP:127.0.0.1','X-FORWARDED-FOR:127.0.0.1'];
     * @param int $headercontent 是否获取请求的header值内容,默认不获取
     * @param int $local 是否使用本地ip进行请求,默认不使用
     * @return array|bool|mixed|string
     * @Description:curl请求
     */
    public function curl($url, $params = false, $ispost = 0, $https = 0, $flbg = 0, $header = 0,$headercontent = 0,$local = 0){
       //        $httpInfo = [];
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');
       //        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400');
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        if($header){
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }
        if($headercontent){
            curl_setopt($ch, CURLOPT_HEADER, 1);
        }
        if($local){
            $header = [
                'CLIENT-IP:127.0.0.1',
                'X-FORWARDED-FOR:127.0.0.1'
            ];
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }
        if($https){
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
        }
        if($ispost){
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
            curl_setopt($ch, CURLOPT_URL, $url);
        }else{
            if($params){
                if (is_array($params)) {
                    $params = http_build_query($params);
                }
                curl_setopt($ch, CURLOPT_URL, $url . '?' . $params);
            }else{
                curl_setopt($ch, CURLOPT_URL, $url);
            }
        }
        $response = curl_exec($ch);
       //        if($response === FALSE){
       //            echo "CURL Error: " . curl_error($ch);
       //            return false;
       //        }
       //        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
       //        $httpInfo = array_merge($httpInfo, curl_getinfo($ch));
        if($headercontent){
            //对返回的结果进行字符串处理
            if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') {
                $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
                $headers = substr($response, 0, $headerSize);
                $body = substr($response, $headerSize);
                return [$headers,$body]; //body内容是图片
            }
        }
        curl_close($ch);
        if ($flbg) {
            $response = json_decode($response, true);
        }
        return $response;
    }

上面的用本地请求的场景是,被curl请求接口做了IP限制,如果本地不可以用,可以使用下面的方法
需要一个有效的代理ip和端口号,有的还需要用户名密码,代码如下:

curl_setopt($ch, CURLOPT_PROXY, "http://39.156.69.79:8080");

窍门:一般情况下是不需要代理,但是伪造的ip不能用,就ping一下你扒取接口的网址,然后用这个网址的ip做伪造。百分百成功。如遇类似问题不能解决,欢迎留言讨论。
0

评论 (0)

取消