How to let Curl use same cookie as the browser from PHP

前端 未结 6 1069
太阳男子
太阳男子 2020-12-14 11:02

I have a PHP script that does an HTTP request on behalf of the browser and the outputs the response to the browser. Problem is when I click the links from the browser on thi

6条回答
  •  眼角桃花
    2020-12-14 11:35

    PiTheNumber's answer was great but I ran into some issues with it that caused it to still print the headers to the page. So I adjusted it to use the more reliable curl_getinfo function. This version also follows redirects.

    public function get_page_content( $url ) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        curl_setopt($ch, CURLOPT_HEADER, 1);
    
        // Forward current cookies to curl
        $cookies = array();
        foreach ($_COOKIE as $key => $value) {
            if ($key != 'Array') {
                $cookies[] = $key . '=' . $value;
            }
        }
        curl_setopt( $ch, CURLOPT_COOKIE, implode(';', $cookies) );
    
        $destination = $url;
    
        while ($destination) {
            session_write_close();
            curl_setopt($ch, CURLOPT_URL, $destination);
            $response = curl_exec($ch);
            $curl_info = curl_getinfo($ch);
            $destination = $curl_info["redirect_url"];
            session_start();
        }
        curl_close($ch);
    
        $headers = substr($response, 0, $curl_info["header_size"]);
        $body = substr($response, $curl_info["header_size"]);
    
        // Extract cookies from curl and forward them to browser
        preg_match_all('/^(Set-Cookie:\s*[^\n]*)$/mi', $headers, $cookies);
        foreach($cookies[0] AS $cookie) {
            header($cookie, false);
        }
    
        return $body;
    }
    

提交回复
热议问题