YouTube视频解析API
下方为YouTube视频解析API源码,存储为.php文件调用即可
<?php /** * * YouTuBe API * * @author DanMo <https://www.cheshirex.com/> * @date 2018-08-18 19:42:30 * @version 0.26 * * */ error_reporting(0); header('Content-type: text/json;charset=utf-8'); $ui = array(); foreach($_GET as $key => $value){ $ui[$key] = trim($value); } if( empty($ui['vid']) ){ die('Please attach relevant parameters!'); } define('VID',$ui['vid'] ); define('VIDEO_URL',"https://www.youtube.com/watch?v="); define('YouTuBe_Api',"https://y2mate.com/zh-cn/analyze/ajax"); define('TEST_API_KEY', 'AIzaSyCOz5Yml_mICULfhM0s_u87l4MRvcL7_p0' ); define('API_KEY', 'AIzaSyBiMxVlkwUqqHbxVU3HJV3KcPFQPikfZwE' ); function https_curl($url,$params=false,$ispost=0){ $httpInfo = array(); $ch = curl_init(); curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 ); curl_setopt( $ch, CURLOPT_USERAGENT , 'JuheData' ); curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 60 ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt( $ch, CURLOPT_TIMEOUT , 60); curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true ); curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true); if( $ispost ) { curl_setopt( $ch , CURLOPT_POST , true ); curl_setopt( $ch , CURLOPT_POSTFIELDS , $params ); curl_setopt( $ch , CURLOPT_URL , $url ); } else { if($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 ) ); curl_close( $ch ); return $response; } function api_curl($url,$data){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($curl, CURLOPT_POSTFIELDS,$data); curl_setopt($curl, CURLOPT_HEADER,0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($curl); if (curl_errno($curl)) { return 'ERROR '.curl_error($curl); } curl_close($curl); return $response ; } $APIs = [ 'categories.list' => 'https://www.googleapis.com/youtube/v3/videoCategories', 'videos.list' => 'https://www.googleapis.com/youtube/v3/videos', 'search.list' => 'https://www.googleapis.com/youtube/v3/search', 'channels.list' => 'https://www.googleapis.com/youtube/v3/channels', 'playlists.list' => 'https://www.googleapis.com/youtube/v3/playlists', 'playlistItems.list' => 'https://www.googleapis.com/youtube/v3/playlistItems', 'activities' => 'https://www.googleapis.com/youtube/v3/activities', ]; function getApi($name){ global $APIs; return $APIs[$name]."?"; } function _parse_url_path($url){ $array = parse_url($url); return $array['path']; } function _parse_url_query($url){ $array = parse_url($url); $query = $array['query']; $queryParts = explode('&', $query); $params = []; foreach ($queryParts as $param) { $item = explode('=', $param); $params[$item[0]] = empty($item[1]) ? '' : $item[1]; } return $params; } function getVideoInfo($vId, $part = ['id', 'snippet', 'contentDetails', 'player', 'statistics', 'status']){ $API_URL = getApi('videos.list'); $params = [ 'id' => is_array($vId) ? implode(',', $vId) : $vId, 'key' => API_KEY, 'part' => implode(', ', $part), ]; return https_curl($API_URL,$params,0); } function getPageContent($id){ $page = 'http://www.youtube.com/watch?v='.$id; $arr = array( "ssl" => array( "verify_peer" => false, "verify_peer_name" => false, ), ); $content = file_get_contents($page, false, stream_context_create($arr)); return $content; } function getDownloadLinks($id){ $videoMap = array( "13" => array("3GP", "Low Quality - 176x144"), "17" => array("3GP", "Medium Quality - 176x144"), "36" => array("3GP", "High Quality - 320x240"), "5" => array("FLV", "Low Quality - 400x226"), "6" => array("FLV", "Medium Quality - 640x360"), "34" => array("FLV", "Medium Quality - 640x360"), "35" => array("FLV", "High Quality - 854x480"), "43" => array("WEBM", "Low Quality - 640x360"), "44" => array("WEBM", "Medium Quality - 854x480"), "45" => array("WEBM", "High Quality - 1280x720"), "18" => array("MP4", "Medium Quality - 480x360"), "22" => array("MP4", "High Quality - 1280x720"), "37" => array("MP4", "High Quality - 1920x1080"), "38" => array("MP4", "High Quality - 4096x230") ); $content = getPageContent($id); $videos = array('MP4' => array(), 'FLV' => array(), '3GP' => array(), 'WEBM' => array()); if(preg_match("'\"url_encoded_fmt_stream_map\":\"(.*?)\"'si", $content, $r)){ $data = $r[1]; $data = explode(',', $data); foreach($data As $cdata){ $cdata = str_replace('\u0026', '&', $cdata); $cdata = explode('&', $cdata); foreach($cdata As $xdata){ if(preg_match('/^sig/', $xdata)){ $sig = substr($xdata, 4); } if(preg_match('/^url/', $xdata)){ $url = substr($xdata, 4); } if(preg_match('/^itag/', $xdata)){ $type = substr($xdata, 5); } } $url = urldecode($url); $videos[$videoMap[$type][0]][$videoMap[$type][1]] = $url; } } return $videos; } function format_bytes($size){ $units = array(' B', ' KB', ' MB', ' GB', ' TB'); for($i = 0; $size >= 1024 && $i < 4; $i++){ $size /= 1024; } return round($size, 2).$units[$i]; } function itag($itag){ $stream_itag = array( "38" =>"3072p", "85" =>"1080p", "46" =>"1080p", "37" =>"1080p", "102" =>"720p", "45" =>"720p", "84" =>"720p", "22" =>"720p", "120" =>"720p", "44" =>"480p", "35" =>"480p", "101" =>"360p", "100" =>"360p", "43" =>"360p", "34" =>"360p", "82" =>"360p", "18" =>"270p/360p", "6" =>"270p", "83" =>"240p", "13" =>"144p", "5" =>"240p", "36" =>"240p", "17" =>"144p" ); //return $stream_itag[$itag]; parse_str($itag,$info); return array( 'iTag' => $stream_itag[$info['itag']],//清晰度 //'Duration' => $info['dur'],//时间 'mt' => $info['expire'],//文件大小 'type' => $info['mime'] //文件形式 ); } function compress_html_main($buffer){ $initial=strlen($buffer); $buffer=explode("<!--html-->", $buffer); $count=count ($buffer); for ($i = 0; $i <= $count; $i++){ if (stristr($buffer[$i], '<!--html no compression-->')){ $buffer[$i]=(str_replace("<!--html no compression-->", " ", $buffer[$i])); }else{ $buffer[$i]=(str_replace("\t", " ", $buffer[$i])); $buffer[$i]=(str_replace("\n\n", "\n", $buffer[$i])); $buffer[$i]=(str_replace("\n", "", $buffer[$i])); $buffer[$i]=(str_replace("\r", "", $buffer[$i])); while (stristr($buffer[$i], ' ')) { $buffer[$i]=(str_replace(" ", " ", $buffer[$i])); } } $buffer_out.=$buffer[$i]; } return $buffer_out; } function returns($data){ global $ui; return $ui['callback'] ? $ui['callback']."({$data})" : "Jquery_".bin2hex(base64_encode('sbtencentsbtencent'))."({$data})"; } $params = [ 'url' => VIDEO_URL.VID, 'ajax' => 1, ]; //$_loc1_ = json_decode(api_curl(YouTuBe_Api,$params),true); $_loc1_ = json_decode(https_curl(YouTuBe_Api,$params,1),true); preg_match('|<div class="tab-pane fade active in" id="mp4">(.*?)</div> <div class="tab-pane fade" id="mp3">|',compress_html_main($_loc1_['result']),$_loc2_); preg_match("#data-vlink=\"(.*?)\" .*class=\"video-thumbnail\".* >#",compress_html_main($_loc1_['result']),$_loc3_);//默认播放 preg_match_all("#data-vlink=\"(.*?)\" >#",$_loc2_[1],$_loc4_);//视频链接 //preg_match_all("#</td> <td>(.*?)</td> <td class=\"txt-center\">#",$_loc2_[1],$_loc5_);//视频大小 foreach( $_loc4_[1] as $row ){ $vinfo = itag($row); $video[] = array( 'url' => $row, 'itag' => $vinfo['iTag'],//清晰度 'mt' => $vinfo['mt'],//文件大小 'type' => $vinfo['type'] //文件形式 ); } $_loc6_ = itag($_loc3_[1]); $data = array( 'date' => gmdate("D M d Y h:i:s ")."GMT+0800 (中国标准时间)", 'api' => 'mtop.api.video.url.youtube.get', 'version' => '0.26', 'tip' => 'More than 1080 definition films and audio segmentation are not provided', 'result' => array( 'default' => array( 'url' => $_loc3_[1], 'itag' => $_loc6_['iTag'],//清晰度 'mt' => $_loc6_['mt'],//文件大小 'type' => $_loc6_['type'] //文件形式 ), 'video' => $video, ) ); //print_r( $_loc4_[1] ); //print_r( compress_html_main($_loc1_['result']) ); print_r( returns(json_encode($data)) );