优酷解析源码(参考)

技术文章 无标签 2018-12-4

只提供参考,自行测试更多资源交流群516722628

<?php
$video_info = Youku::parse($url);
echo json_encode($video_info);
/**
*  直接播放地址 http://player.youku.com/embed/XMTg2NDYyNDk4OA 
*/
class Youku
{

    public static function parse($url)
    {
        $content = self::curl($url);
        preg_match("#videoId: '(.*?)',#",$content,$vids1);
        preg_match("#videoId2: '(.*?)',#",$content,$vids2);
        preg_match("#pid: '(.*?)',#",$content,$pid);

        $GLOBALS['ipc']['vid1'] = $vids1[1];
        $GLOBALS['ipc']['vid2'] = $vids2[1];
        $GLOBALS['ipc']['pid']  = $pid[1];
        $GLOBALS['ipc']['url']  = $url;
        $ids = $GLOBALS['ipc'];
        $ids['url'] = $url;
        $ids['referer'] = $url;
        $ids['ccode'] = '0512';
        $ids['vid'] = $vids1[1];
        $ids['P_sck'] = '';
        $ids['m_h5_tk'] = '';
        $ids['m_h5_tk_enc'] = '';
        $ids['ckey'] = 'DIl58SLFxFNndSV1GFNnMQVYkx1PP5tKe1siZu/86PR1u/Wh1Ptd+WOZsHHWxysSfAOhNJpdVWsdVJNsfJ8Sxd8WKVvNfAS8aS8fAOzYARzPyPc3JvtnPHjTdKfESTdnuTW6ZPvk2pNDh4uFzotgdMEFkzQ5wZVXl2Pf1/Y6hLK0OnCNxBj3+nb0v72gZ6b0td+WOZsHHWxysSo/0y9D2K42SaB8Y/+aD2K42SaB8Y/+ahU+WOZsHcrxysooUeND'; //优酷默认key

        return self::get_video_url($ids);
    }
    private static function get_video_url($ids){
        $content = self::get_tv_data($ids);
        //print_r($content);exit;
        $json = json_decode($content,true);

        $data = $json["data"];

        $ids['title'] = $data['video']['title'];

        $stream = $data["stream"];
        //print_r($stream);exit;

        $GLOBALS['ipc']['pay']  = $data["show"]['pay']; //1为收费视频 0为免费视频

        if ($data["show"]["pay"] == 1) {
            $videoinfo['code'] = 302;
            $videoinfo['msg'] = $ids['title'] . ' - 视频正在加载···请稍后···';
            $videoinfo['url'] = '../yun/?url='.$ids['url']; 
            return $videoinfo;exit;
        }

        $point = $data["dvd"]["point"];

        $preview = $data['preview']['thumb'];

        if (!empty($point)) {

            $_tmp['words'] = $_tmp['time'] = '';

            foreach ($point as $key => $value) {
                if (self::filterGBK_SpecialChars($value['title']) == '') {
                    continue;
                }
                $_tmp['words'] .= self::filterGBK_SpecialChars($value['title']).',';
                $_tmp['time'] .= (int)($value['start']/1000).',';
            }
            $_tmp['words'] = substr($_tmp['words'],0,strlen($_tmp['words'])-1);
            $_tmp['time'] = substr($_tmp['time'],0,strlen($_tmp['time'])-1);
            $GLOBALS['ipc']['data']["prompt"] = $_tmp;
            $videoinfo["data"]["prompt"] =  $GLOBALS['ipc']['data']["prompt"];
        }

        foreach ($stream as $key => $value) {
            $stream_type = $value["stream_type"];
            //print_r($stream_type);

            if($stream_type=="3gphd"||$stream_type=="flvhd"){//过滤 
                    continue;
            }
            switch ($stream_type) {
                case  "mp5hd4":     $type = 'mp5';$def = '4K';          break;  # 3840x1638
                case  "mp4sd":      $type = "mp4";$def = "普清";          break;# 640x360
                case  "mp4hd2":     $type = "flv";$def = "FLV超高清";  break;# 1280x720
                case  "mp4hd3":     $type = "flv";$def = "FLV原画";       break;# 1920x1080
                case  "3gphd":      $type = "mp4";$def = "3GP高清";       break;# 640x360
                case  "flvhd":      $type = "flv";$def = "FLV高清";       break;# 640x360
                case  "mp4hd2v2":   $type = "mp4";$def = "超清";          break;# 1280x720
                case  "mp4hd":      $type = "mp4";$def = "高清";          break;# 960x540
                case  "mp4hd3v2":   $type = "mp4";$def = "原画";          break;# 1920x1080
                case  "mp5sd":      $type = "mp4";$def = "MP5高清";       break;# 640x360
                case  "mp5hd2":     $type = "mp4";$def = "MP5超高清";  break;# 1280x720
                case  "mp5hd3":     $type = "mp4";$def = "MP5原画";       break;# 1920x1080
                case  "mp5hd":      $type = "mp4";$def = "MP5超清";       break;# 960x540
            }
            $m3u8 = $value["m3u8_url_backup"];//m3u8文件地址
            if (GlobalBase::is_ipad()) {
                if ($stream_type == 'mp4hd' && $m3u8 != '') {
                    $fdata[1]['url'] = $m3u8;
                    $fdata[1]['def'] = 'mp4高清';
                }
                if($stream_type=='mp5hd'){
                    $fdata[2]['url'] = $m3u8;
                    $fdata[2]['def'] = 'mp5高清';
                }
                if($stream_type=='mp4sd'){
                    $fdata[2]['url'] = $m3u8;
                    $fdata[2]['def'] = 'mp4标清';
                }
            }else{
                if ($stream_type == 'mp5hd4' && $m3u8 != '') {
                    $fdata[0]['url'] = $m3u8;
                    $fdata[0]['def'] = '4k';
                } 
                if ($stream_type == 'mp5hd3' && $m3u8 != '') {
                    $fdata[1]['url'] = $m3u8;
                    $fdata[1]['def'] = 'mp5原画';
                }
                if ($stream_type == 'mp4hd3v2' && $m3u8 != '') {
                    $fdata[2]['url'] = $m3u8;
                    $fdata[2]['def'] = 'mp4原画';
                }
                if ($stream_type == 'mp4hd3' && $m3u8 != '') {
                    $fdata[3]['url'] = $m3u8;
                    $fdata[3]['def'] = 'flv原画';
                }
                if ($stream_type == 'mp5hd2' && $m3u8 != '') {
                    $fdata[4]['url'] = $m3u8;
                    $fdata[4]['def'] = 'mp5超高清';
                }
                if ($stream_type == 'mp4hd2v2' && $m3u8 != '') {
                    $fdata[5]['url'] = $m3u8;
                    $fdata[5]['def'] = 'mp4超高清';
                }
                if ($stream_type == 'mp4hd2' && $m3u8 != '') {
                    $fdata[6]['url'] = $m3u8;
                    $fdata[6]['def'] = 'flv超高清';
                }
                if ($stream_type == 'mp5hd' && $m3u8 != '') {
                    $fdata[7]['url'] = $m3u8;
                    $fdata[7]['def'] = 'mp5高清';
                }
                if ($stream_type == 'mp4hd' && $m3u8 != '') {
                    $fdata[8]['url'] = $m3u8;
                    $fdata[8]['def'] = 'mp4高清';
                }
                if ($stream_type == 'flvhd' && $m3u8 != '') {
                    $fdata[9]['url'] = $m3u8;
                    $fdata[9]['def'] = 'flv高清';
                }
                if ($stream_type == 'mp4sd' && $m3u8 != '') {
                    $fdata[10]['url'] = $m3u8;
                    $fdata[10]['def'] = 'mp4标清';
                }

            }
        }
        for ($i=1; $i <= 10 ; $i++) { 
            if ($fdata[$i] == '') {
                continue;
            }
            $key_arrays[]=$fdata[$i];
        }

        $_d = self::is_video_url($key_arrays[0]['url'],$ids['url']);
        if (!empty($_d['type'])&&$_d['type'] == 'url') {
            $videoinfo['code'] = 302;
            $videoinfo['url'] = '../yun/?url='.$ids['url'];
        } else {
            $videoinfo['code'] = 200;
            $videoinfo['play'] = '';
            $videoinfo['msg'] = '解析正常';
            if (GlobalBase::is_ipad()) {
                $videoinfo['data']['url'] = $_d['m3u8'];
            }
            $videoinfo["data"]["video"]["type"] = "video/m3u8";
            $videoinfo["data"]['video']['file'] = $_d['m3u8'];
        }

        $videoinfo["data"]["poster"] = !empty($data['show']['show_thumburl_huge']) ? $data['show']['show_thumburl_huge'] : $data['show']['show_thumburl_big_jpg'];
        $videoinfo["data"]['title'] = !empty($data['video']['title']) ? $data['video']['title'] : $data['show']['title'];
        return $videoinfo;
    }

    public static function get_h5_data($ids)
    {
        $vid = $ids['vid'];
        $ckey = urlencode("DIl58SLFxFNndSV1GFNnMQVYkx1PP5tKe1siZu/86PR1u/Wh1Ptd+WOZsHHWxysSfAOhNJpdVWsdVJNsfJ8Sxd8WKVvNfAS8aS8fAOzYARzPyPc3JvtnPHjTdKfESTdnuTW6ZPvk2pNDh4uFzotgdMEFkzQ5wZVXl2Pf1/Y6hLK0OnCNxBj3+nb0v72gZ6b0td+WOZsHHWxysSo/0y9D2K42SaB8Y/+aD2K42SaB8Y/+ahU+WOZsHcrxysooUeND");
        $ccode = "0502";//0502
        $cna = self::fetch_cna();
        $utid = urlencode($cna);
        $client_ip = "0.0.0.0";
        $url = "https://ups.youku.com/ups/get.json?vid=$vid&ccode=$ccode&client_ip=$client_ip&utid=$utid&client_ts=".time()."&ckey=".$ckey."&rst=mp4&dq=mp4&os=ios&bt=phone";
        $ids['cookie'] = COOKIE_YOKU;
        $content = self::curl($url,$ids);
        return $content;
    }
    public static function get_ups_data($ids) //ups接口需P_sck ccode = 0510
    {
        $ckey = urlencode($ids['ckey']);
        $ids['ccode'] = "0510";//01010203  var ccodes = []string{"0510", "0502", "0507", "0508", "0512", "0513", "0514", "0503", "0590"}
        $ids['utid'] = urlencode(self::fetch_cna());
        $ids['client_ip'] = "192.168.1.1";
        $ids['cookie'] = COOKIE_YOKU;
        $url = "https://ups.youku.com/ups/get.json?vid=".$ids['vid']."&ccode=".$ids['ccode']."&client_ip=".$ids['client_ip']."&utid=".$ids['utid']."&client_ts=".time()."&ckey=".$ckey;
        $content = self::curl($url,$ids);
        return $content;
    }

    public static function get_ups1_data($ids) //ups接口需P_sck ccode = 0502
    {
        //print_r($ids);exit;
        $vid = $ids['vid'];
        $ids['ua'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:49.0) Gecko/20100101 Firefox/49.0';
        $ids['re'] = 'http://v.youku.com/v_show/id_{$ids["vid"]}.html';
        $ids['cookie'] = COOKIE_YOKU;
        $ckey = urlencode($ids['ckey']);
        $ccode = "0502";//01010203  var ccodes = []string{"0510", "0502", "0507", "0508", "0512", "0513", "0514", "0503", "0590"}
        $utid = urlencode(self::fetch_cna());
        $client_ip = "192.168.1.1";
        $url = "https://ups.youku.com/ups/get.json?vid=$vid&ccode=$ccode&client_ip=$client_ip&utid=$utid&client_ts=".time()."&ckey=".$ckey;
        $content = self::curl($url,$ids);
        return $content;
    }

    public static function get_acs_data($ids) //acs接口需P_sck,_m_h5_tk,_m_h5_tk_enc  sign = u = s(n.token + "&" + l + "&" + o + "&" + i.data), s为md5
    {
        $ids['appKey'] = '24679788';
        $ids['jsv'] = '2.4.11';
        $ids['sign'] = '3a75b723ce917983c363380b679d3e68';
        $ids['t'] = '1531605637237';
        $ids['api'] = 'mtop.youku.play.ups.appinfo.get';
        $ids['v'] = '1.1';
        $ids['timeout'] = 20000;
        $ids['YKPid'] = '20160317PLF000211';
        $ids['YKLoginRequest'] = true;
        $ids['AntiFlood'] = true;
        $ids['AntiCreep'] = true;
        $ids['type'] = 'jsonp';
        $ids['dataType'] = 'jsonp';
        $ids['callback'] = 'mtopjsonp1';

        $api = 'https://acs.youku.com/h5/mtop.youku.sports.data.match.getbyliveid/1.0/?jsv=2.4.11&appKey=24679788&t=1531610612473&sign=5698a52fa17ae7f0e72c6176fbb511f3&api=mtop.youku.sports.data.match.getbyliveid&v=1.0&type=jsonp&dataType=jsonp&callback=mtopjsonp2&data=%7B%22liveId%22%3A%228001964%22%7D';

        $ids['ua'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36';
        $ids['cookie'] = COOKIE_YOKU.'_m_h5_tk=593a55d21c5b77869446fde46b0ecf6a_1531609950094; _m_h5_tk_enc=3e3afff2bae27d37be77813045995957;';

        $ckey = urlencode("DIl58SLFxFNndSV1GFNnMQVYkx1PP5tKe1siZu/86PR1u/Wh1Ptd+WOZsHHWxysSfAOhNJpdVWsdVJNsfJ8Sxd8WKVvNfAS8aS8fAOzYARzPyPc3JvtnPHjTdKfESTdnuTW6ZPvk2pNDh4uFzotgdMEFkzQ5wZVXl2Pf1/Y6hLK0OnCNxBj3+nb0v72gZ6b0td+WOZsHHWxysSo/0y9D2K42SaB8Y/+aD2K42SaB8Y/+ahU+WOZsHcrxysooUeND");
        $ccode = "0510";//01010203  var ccodes =0401 []string{"0510", "0502", "0507", "0508", "0512", "0513", "0514", "0503", "0590"}
        $utid = urlencode(self::fetch_cna());
        $client_ip = "192.168.1.1";
        $url = "https://ups.youku.com/ups/get.json?vid=$vid&ccode=$ccode&client_ip=$client_ip&utid=$utid&client_ts=".time()."&ckey=".$ckey;
        $content = self::curl($url,$ids);
        return $content;
    }

    public static function get_tv_data($ids)  //电视解析接口
    {
        $vid= $ids['vid'];
        $ckey = urlencode("7B19C0AB12633B22E7FE81271162026020570708D6CC189E4924503C49D243A0DE6CD84A766832C2C99898FC5ED31F3709BB3CDD82C96492E721BDD381735026");
        $ccode = "0103010102"; //0103010102
        $utid = 'WgLG5mr8ST8DAKRFhImwwCov';

        $client_ip = "192.168.1.1";
        $url = "https://ups.cp31.ott.cibntv.net/ups/get.json?vid=$vid&ccode=$ccode&client_ip=$client_ip&utid=$utid&client_ts=".time()."&ckey=".$ckey;
        $ids['cookie'] = '';
        $ids['ua'] = 'OTTSDK;2.0.3.73;Android;4.4.2;oppo R11';
        //print_r($url);exit;
        $content = self::curl($url,$ids);
        return $content;
    }

    public static function get_atv_data($ids)  //电视蓝光资源解析
    {
        $vid = $ids['vid'];
        $ckey = urlencode("7B19C0AB12633B22E7FE81271162026020570708D6CC189E4924503C49D243A0DE6CD84A766832C2C99898FC5ED31F3709BB3CDD82C96492E721BDD381735026");  //ckey_mobile
        $ccode = "0103010102";
        $utid = 'VocTAztMueMDAGTMB5pNW/2V';
        $ids['ua'] = 'OTTSDK;2.0.3.73;Android;5.1;vivo X6D';
        $params = array(
            'ckey' => $ckey,
            'client_ip' => '192.168.1.1',
            'client_ts'  => time(),
            'utid' => $utid,
            'ccode' => $ccode,
            'encryptR_client' => 'AdqPCJSQ0zBM8K8xbPj2LQ==',
            'key_index' => 'key01',
            'vid' => $vid,
            'tmall_pid' => 'f456ab7ea7944c4b',
            'h265' => 1,
            'client_id' => '',
            'ptoken' => '',
            'stoken' => '',
            'atoken' => '',
            'mac' => 'FC1A113ACD4C',
            'app_ver' => '2120513101',
            'drm_type' => 7,
            'needad' => 0,
            'needbf' => 1,
            'site' => 1,
            'fu' => 1,
            'wintype' => 'mdevice',
            'vs' => '1.0',
            'os' => 'Android',
            'osv' => '5.1',
            'bt' => 'tv',
            'aw' => 'a',
            'rst' => 'm3u8',
            'p' => 27,
            'bd' => 'vivo',
            'guid' => '6ac02a7008d8089ba4a75cb274e7bd39',
            'net' => 1000,
            'pid' => 'f456ab7ea7944c4b',
            'mdl' => 'TVADSDK_Device',
            'dvw' => 1920,
            'dvh' => 1080,
            'dprm' => 480,
            'box' => 1,
            'aid' => 'e09b8c1acd56c2e2',
            'ss' => '5.2',
            'isvert' => 0,
            'uuid' => 'A4F6815D175ACF602D7E4409DDB37467'
        );

        $api = 'https://ups.cp31.ott.cibntv.net/ups/get.json?' . http_build_query($params);

        $data = self::curl($api,$ids);

        return $data;
    }

    public static function filterGBK_SpecialChars($str)
    {
        $str = str_replace('“','',$str);
        $str = str_replace('”','',$str);
        $str = str_replace('"','',$str);
        $str = str_replace(' ','',$str);
        return $str;
    }
    public static function is_video_url($url,$a){

        $data = self::curl($url,$ids='');

        //print_r($data);exit;

        if(strstr($data,"http")==true || strstr($data,".ts")==true){
            $d['m3u8'] = "../video/m3u8.php?url=m3u8".base64_encode($url);
        } else {
            $d['m3u8'] = '../yun/?url='.$a;
            $d['type'] = 'url';
        }
                return $d;

    }
    public static function curl($url,$ids)
    {
        $params["ua"] = !empty($ids['ua'])?$ids['ua']:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36";
        $params['ref'] = isset($ids['referer']) ? $ids['referer'] : $ids['url'];
        $params["cookie"] = !empty($ids['cookie']) ? $ids['cookie'] : '' ;
        $params["ip"] = isset($ids['ip']) ? $ids['ip'] : "14.21.96.129";//伪装为固定IP,否则会报异地登录,会封号,不要更改
        return GlobalBase::curl($url,$params);
    }
    public static function fetch_cna()
    {
        $url = 'http://gm.mmstat.com/yt/ykcomment.play.commentInit?cna=';
        $request = new Request();
        $request->http_get($url);
        $values = $request->get_res_header('Set-Cookie');
        $cna = false;
        foreach ($values as $value) {
            preg_match('/cna=([^;]+)/', $value, $matches);
            if (count($matches) > 0) {
                $cna = $matches[1];
                break;
            }
        }
        if (!$cna) {
            $cna = 'oqikEO1b7CECAbfBdNNf1PM1';
        }
        return $cna;
    }
}
/**
* 
*/
class Cna
{

    public static function get_signature($str)
    {
        $signature = "";
        $key="d6fc3a4a06adbde89223bvefedc24fecde188aaa9161";
        if (function_exists('hash_hmac'))
        {
            $signature = base64_encode(hash_hmac("sha1", $str, $key, true));
        }else{
            $blocksize  = 64;
            $hashfunc   = 'sha1';
            if (strlen($key) > $blocksize){ $key = pack('H*', $hashfunc($key));}
            $key    = str_pad($key,$blocksize,chr(0x00));
            $ipad   = str_repeat(chr(0x36),$blocksize);
            $opad   = str_repeat(chr(0x5c),$blocksize);
            $hmac   = pack('H*',$hashfunc(($key^$opad).pack('H*',$hashfunc(($key^$ipad).$str))));
            $signature = base64_encode($hmac);
        }
        return $signature;
    }
    public static function utid()
    {
        $str = mt_rand(-2147483648,2147483648);
        $i = time();
        $j = mt_rand(-2147483648,2147483648);
        $arrayOfByte1 = self::aa($i);
        $arrayOfByte2 = self::aa($j);
        $arr = array_merge($arrayOfByte1,$arrayOfByte2);
        $arr[count($arr)]= 3;
        $arr[count($arr)]= 0;
        $arr = array_merge($arr,self::aa(self::ca($str)));
        $sign = self::get_signature(self::ba($arr));
        $arr = array_merge($arr,self::aa(self::ca($sign)));
        return base64_encode(self::ba($arr));
    }
    public static function  ca($paramString)
    {
        $i = 0;$k = 0;
        if (strlen($paramString) <= 0) {return $k;}
        $param = str_split($paramString);
        $arr = array();
        for ($n=0; $n < count($param); $n++) { 
            $arr[$n]= ord($param[$n]);
        }
        $j = 0;
        while (true) {
            $k = $i;
            if ($j >= count($arr)) {break;}
            $i = self::intval32($i * 31 + $arr[$j]);
            $j += 1;
        }
        return $k;
    }
    public static function aa($paramInt)
    {
        $i = $paramInt % 256;
        $j = ($paramInt >>= 8) % 256;
        $k = ($paramInt >>= 8) % 256;
        $n = ($paramInt >> 8) % 256;
        $arr =  array($n, $k, $j, $i);
        return $arr;
    }
    public static function ba($arr)
    {
        $str = "";
        for ($i=0; $i <count($arr) ; $i++) { 
            $str .= chr($arr[$i]);
        }
        return $str;
    }
    public static function intval32($num) {
        $num = $num & 0xffffffff;
        $p = $num>>31;
        if($p==1) {
            $num = $num-1;
            $num = ~$num;
            $num = $num & 0xffffffff;
            return $num * -1;
        } else {
            return $num;
        }
    } 
}

class Request
{
    public $info;
    public $req_cookies;
    public $full_url;
    public $response;
    public $header;
    public $response_headers = array();
    public $body;
    public function merge_default_header($headers)
    {
        $defaults = array(
            'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language' => 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
            'Accept-Encoding' => 'gzip, deflate',
            'cache-control' => 'no-cache',
            'User-Agent' => "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.1"
        );
        $array_merge = array_merge($defaults, $headers);
        return $array_merge;
    }
    /**
     * GET 请求
     * @param string $url
     */
    public function http_get($url, $params = array(), $cookies = array(), $headers = array())
    {
        $this->full_url = $url;
        $oCurl = curl_init();
        if (stripos($url, "https://") !== FALSE) {
            curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
        }
        curl_setopt($oCurl, CURLOPT_HEADER, TRUE);//至关重要,CURLINFO_HEADER_OUT选项可以拿到请求头信息
        curl_setopt($oCurl, CURLINFO_HEADER_OUT, TRUE);//请求头信息
        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
        // curl_setopt($oCurl, CURLOPT_NOBODY, TRUE);// 不获取body
        curl_setopt($oCurl, CURLOPT_ENCODING, "");
        // 参数
        if (is_array($params)) {
            $params_str = $this->get_params_str($params);
            if (strpos($this->full_url, '?') === FAlSE) {
                $this->full_url .= '?' . $params_str;
            } else {
                $this->full_url .= '&' . $params_str;
            }
        }
        // cookies
        if (is_array($cookies)) {
            $cookies_str = $this->get_cookies_str($cookies);
            curl_setopt($oCurl, CURLOPT_COOKIE, $cookies_str); //使用cookies
        }
        // headers
        $headers = $this->merge_default_header($headers);
        $headers = self::flatten($headers);
        curl_setopt($oCurl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($oCurl, CURLOPT_URL, $this->full_url);
        $response = curl_exec($oCurl);
        $this->info = curl_getinfo($oCurl);
        curl_close($oCurl);
        if (intval($this->info["http_code"]) == 200) {
            $this->process_response_headers($response);
            return $response;
        } else {
            return false;
        }
    }
    public function process_response_headers($response)
    {
        $header_size = $this->info['header_size'];
        $this->header = substr($response, 0, $header_size);
        $this->body = substr($response, $header_size);
        $headArr = explode("\r\n", $this->header);
        foreach ($headArr as $line) {
            preg_match('/(.*?):(.+)/', $line, $matches, PREG_OFFSET_CAPTURE);
            if (count($matches) == 3) {
                $key = trim($matches[1][0]);
                $this->response_headers[] = array($key => trim($matches[2][0]));
                /*if (isset($this->response_headers[$key])) {
                    $this->response_headers[$key] .= ';' . trim($matches[2][0]);
                } else {
                    //$this->response_headers[$key] = trim($matches[2][0]);
                }*/
                // var_dump($matches);
                // echo "<br>";
                /*
                array (size=3)
                  0 =>
                    array (size=2)
                      0 => string 'Date: Thu, 22 Mar 2018 07:35:59 GMT' (length=35)
                      1 => int 0
                  1 =>
                    array (size=2)
                      0 => string 'Date' (length=4)
                      1 => int 0
                  2 =>
                    array (size=2)
                      0 => string ' Thu, 22 Mar 2018 07:35:59 GMT' (length=30)
                      1 => int 5
                 */
            }
        }
    }
    public function get_res_header($key)
    {
        $arr = array();
        foreach ($this->response_headers as $header) {
            if (isset($header[$key])) {
                $arr[] = $header[$key];
            }
        }
        return $arr;
    }
    private function arr_join_str($arr, $separator)
    {
        $str = '';
        foreach ($arr as $key => $value) {
            $str .= $key . '=' . $value . $separator;
        }
        $str = substr($str, 0, strlen($str) - strlen($separator));
        return $str;
    }
    public function get_params_str($params)
    {
        return $this->arr_join_str($params, '&');
    }
    public function get_cookies_str($cookies_arr)
    {
        return $this->arr_join_str($cookies_arr, ';');
    }
    public static function flatten($array)
    {
        $return = array();
        foreach ($array as $key => $value) {
            $return[] = sprintf('%s: %s', $key, $value);
        }
        return $return;
    }
}

?>

0条评论