YouTuBe 解析API

  • 内容
  • 相关
  1. <?php
  2. /**
  3. *
  4. * YouTuBe API
  5. *
  6. * @author DanMo <https://blog.52xiee.com/>
  7. * @date 2018-08-21
  8. * @version 0.26
  9. *
  10. *
  11. */
  12. error_reporting(0);
  13. header('Content-type: text/json;charset=utf-8');
  14.  
  15. $ui = array();
  16. foreach($_GET as $key => $value){
  17. $ui[$key] = trim($value);
  18. }
  19.  
  20. if( empty($ui['vid']) ){
  21. die('Please attach relevant parameters!');
  22. }
  23.  
  24. define('VID',$ui['vid'] );
  25. define('VIDEO_URL',"https://www.youtube.com/watch?v=");
  26. define('YouTuBe_Api',"https://y2mate.com/zh-cn/analyze/ajax");
  27. define('TEST_API_KEY', 'AIzaSyCOz5Yml_mICULfhM0s_u87l4MRvcL7_p0' );
  28. define('API_KEY', 'AIzaSyBiMxVlkwUqqHbxVU3HJV3KcPFQPikfZwE' );
  29.  
  30. function https_curl($url,$params=false,$ispost=0){
  31. $httpInfo = array();
  32. $ch = curl_init();
  33.  
  34. curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
  35. curl_setopt( $ch, CURLOPT_USERAGENT , 'JuheData' );
  36. curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 60 );
  37. curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  38. curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  39. curl_setopt( $ch, CURLOPT_TIMEOUT , 60);
  40. curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );
  41. curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
  42. if( $ispost )
  43. {
  44. curl_setopt( $ch , CURLOPT_POST , true );
  45. curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );
  46. curl_setopt( $ch , CURLOPT_URL , $url );
  47. }
  48. else
  49. {
  50. if($params){
  51. curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );
  52. }else{
  53. curl_setopt( $ch , CURLOPT_URL , $url);
  54. }
  55. }
  56. $response = curl_exec( $ch );
  57. if ($response === FALSE) {
  58. //echo "cURL Error: " . curl_error($ch);
  59. return false;
  60. }
  61. $httpCode = curl_getinfo( $ch , CURLINFO_HTTP_CODE );
  62. $httpInfo = array_merge( $httpInfo , curl_getinfo( $ch ) );
  63. curl_close( $ch );
  64. return $response;
  65. }
  66.  
  67. function api_curl($url,$data){
  68. $curl = curl_init();
  69. curl_setopt($curl, CURLOPT_URL, $url);
  70. curl_setopt($curl, CURLOPT_POST, 1);
  71. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  72. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  73. curl_setopt($curl, CURLOPT_POSTFIELDS,$data);
  74. curl_setopt($curl, CURLOPT_HEADER,0);
  75. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  76. $response = curl_exec($curl);
  77. if (curl_errno($curl)) {
  78. return 'ERROR '.curl_error($curl);
  79. }
  80. curl_close($curl);
  81. return $response ;
  82. }
  83.  
  84. $APIs = [
  85. 'categories.list' => 'https://www.googleapis.com/youtube/v3/videoCategories',
  86. 'videos.list' => 'https://www.googleapis.com/youtube/v3/videos',
  87. 'search.list' => 'https://www.googleapis.com/youtube/v3/search',
  88. 'channels.list' => 'https://www.googleapis.com/youtube/v3/channels',
  89. 'playlists.list' => 'https://www.googleapis.com/youtube/v3/playlists',
  90. 'playlistItems.list' => 'https://www.googleapis.com/youtube/v3/playlistItems',
  91. 'activities' => 'https://www.googleapis.com/youtube/v3/activities',
  92. ];
  93.  
  94. function getApi($name){
  95. global $APIs;
  96. return $APIs[$name]."?";
  97. }
  98.  
  99. function _parse_url_path($url){
  100. $array = parse_url($url);
  101. return $array['path'];
  102. }
  103.  
  104. function _parse_url_query($url){
  105. $array = parse_url($url);
  106. $query = $array['query'];
  107. $queryParts = explode('&', $query);
  108. $params = [];
  109. foreach ($queryParts as $param) {
  110. $item = explode('=', $param);
  111. $params[$item[0]] = empty($item[1]) ? '' : $item[1];
  112. }
  113. return $params;
  114. }
  115.  
  116. function getVideoInfo($vId, $part = ['id', 'snippet', 'contentDetails', 'player', 'statistics', 'status']){
  117. $API_URL = getApi('videos.list');
  118. $params = [
  119. 'id' => is_array($vId) ? implode(',', $vId) : $vId,
  120. 'key' => API_KEY,
  121. 'part' => implode(', ', $part),
  122. ];
  123. return https_curl($API_URL,$params,0);
  124. }
  125.  
  126. function getPageContent($id){
  127. $page = 'https://www.youtube.com/watch?v='.$id;
  128. $arr = array(
  129. "ssl" => array(
  130. "verify_peer" => false,
  131. "verify_peer_name" => false,
  132. ),
  133. );
  134. $content = file_get_contents($page, false, stream_context_create($arr));
  135. return $content;
  136. }
  137.  
  138. function getDownloadLinks($id){
  139. $videoMap = array(
  140. "13" => array("3GP", "Low Quality - 176x144"),
  141. "17" => array("3GP", "Medium Quality - 176x144"),
  142. "36" => array("3GP", "High Quality - 320x240"),
  143. "5" => array("FLV", "Low Quality - 400x226"),
  144. "6" => array("FLV", "Medium Quality - 640x360"),
  145. "34" => array("FLV", "Medium Quality - 640x360"),
  146. "35" => array("FLV", "High Quality - 854x480"),
  147. "43" => array("WEBM", "Low Quality - 640x360"),
  148. "44" => array("WEBM", "Medium Quality - 854x480"),
  149. "45" => array("WEBM", "High Quality - 1280x720"),
  150. "18" => array("MP4", "Medium Quality - 480x360"),
  151. "22" => array("MP4", "High Quality - 1280x720"),
  152. "37" => array("MP4", "High Quality - 1920x1080"),
  153. "38" => array("MP4", "High Quality - 4096x230")
  154. );
  155.  
  156. $content = getPageContent($id);
  157. $videos = array('MP4' => array(), 'FLV' => array(), '3GP' => array(), 'WEBM' => array());
  158.  
  159. if(preg_match("'\"url_encoded_fmt_stream_map\":\"(.*?)\"'si", $content, $r)){
  160. $data = $r[1];
  161. $data = explode(',', $data);
  162.  
  163. foreach($data As $cdata){
  164. $cdata = str_replace('\u0026', '&', $cdata);
  165. $cdata = explode('&', $cdata);
  166.  
  167. foreach($cdata As $xdata){
  168. if(preg_match('/^sig/', $xdata)){
  169. $sig = substr($xdata, 4);
  170. }
  171.  
  172. if(preg_match('/^url/', $xdata)){
  173. $url = substr($xdata, 4);
  174. }
  175.  
  176. if(preg_match('/^itag/', $xdata)){
  177. $type = substr($xdata, 5);
  178. }
  179. }
  180. $url = urldecode($url);
  181. $videos[$videoMap[$type][0]][$videoMap[$type][1]] = $url;
  182. }
  183. }
  184. return $videos;
  185. }
  186. function format_bytes($size){
  187. $units = array(' B', ' KB', ' MB', ' GB', ' TB');
  188. for($i = 0; $size >= 1024 && $i < 4; $i++){
  189. $size /= 1024;
  190. }
  191. return round($size, 2).$units[$i];
  192. }
  193. function itag($itag){
  194. $stream_itag = array(
  195. "38" =>"3072p",
  196. "85" =>"1080p",
  197. "46" =>"1080p",
  198. "37" =>"1080p",
  199. "102" =>"720p",
  200. "45" =>"720p",
  201. "84" =>"720p",
  202. "22" =>"720p",
  203. "120" =>"720p",
  204. "44" =>"480p",
  205. "35" =>"480p",
  206. "101" =>"360p",
  207. "100" =>"360p",
  208. "43" =>"360p",
  209. "34" =>"360p",
  210. "82" =>"360p",
  211. "18" =>"270p/360p",
  212. "6" =>"270p",
  213. "83" =>"240p",
  214. "13" =>"144p",
  215. "5" =>"240p",
  216. "36" =>"240p",
  217. "17" =>"144p"
  218. );
  219. //return $stream_itag[$itag];
  220. parse_str($itag,$info);
  221.  
  222. return array(
  223. 'iTag' => $stream_itag[$info['itag']],//清晰度
  224. //'Duration' => $info['dur'],//时间
  225. 'mt' => $info['expire'],//文件大小
  226. 'type' => $info['mime'] //文件形式
  227. );
  228. }
  229.  
  230. function compress_html_main($buffer){
  231. $initial=strlen($buffer);
  232. $buffer=explode("<!--html-->", $buffer);
  233. $count=count ($buffer);
  234. for ($i = 0; $i <= $count; $i++){
  235. if (stristr($buffer[$i], '<!--html no compression-->')){
  236. $buffer[$i]=(str_replace("<!--html no compression-->", " ", $buffer[$i]));
  237. }else{
  238. $buffer[$i]=(str_replace("\t", " ", $buffer[$i]));
  239. $buffer[$i]=(str_replace("\n\n", "\n", $buffer[$i]));
  240. $buffer[$i]=(str_replace("\n", "", $buffer[$i]));
  241. $buffer[$i]=(str_replace("\r", "", $buffer[$i]));
  242. while (stristr($buffer[$i], ' '))
  243. {
  244. $buffer[$i]=(str_replace(" ", " ", $buffer[$i]));
  245. }
  246. }
  247. $buffer_out.=$buffer[$i];
  248. }
  249. return $buffer_out;
  250. }
  251.  
  252. function returns($data){
  253. global $ui;
  254. return $ui['callback'] ? $ui['callback']."({$data})" : "Jquery_".bin2hex(base64_encode('sbtencentsbtencent'))."({$data})";
  255. }
  256.  
  257. $params = [
  258. 'url' => VIDEO_URL.VID,
  259. 'ajax' => 1,
  260. ];
  261.  
  262. //$_loc1_ = json_decode(api_curl(YouTuBe_Api,$params),true);
  263. $_loc1_ = json_decode(https_curl(YouTuBe_Api,$params,1),true);
  264.  
  265. 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_);
  266.  
  267. preg_match("#data-vlink=\"(.*?)\" .*class=\"video-thumbnail\".* >#",compress_html_main($_loc1_['result']),$_loc3_);//默认播放
  268. preg_match_all("#data-vlink=\"(.*?)\" >#",$_loc2_[1],$_loc4_);//视频链接
  269.  
  270. //preg_match_all("#</td> <td>(.*?)</td> <td class=\"txt-center\">#",$_loc2_[1],$_loc5_);//视频大小
  271.  
  272. foreach( $_loc4_[1] as $row ){
  273. $vinfo = itag($row);
  274. $video[] = array(
  275. 'url' => $row,
  276. 'itag' => $vinfo['iTag'],//清晰度
  277. 'mt' => $vinfo['mt'],//文件大小
  278. 'type' => $vinfo['type'] //文件形式
  279. );
  280. }
  281. $_loc6_ = itag($_loc3_[1]);
  282. $data = array(
  283. 'date' => gmdate("D M d Y h:i:s ")."GMT+0800 (中国标准时间)",
  284. 'api' => 'mtop.api.video.url.youtube.get',
  285. 'version' => '0.26',
  286. 'tip' => 'More than 1080 definition films and audio segmentation are not provided',
  287. 'result' => array(
  288. 'default' => array(
  289. 'url' => $_loc3_[1],
  290. 'itag' => $_loc6_['iTag'],//清晰度
  291. 'mt' => $_loc6_['mt'],//文件大小
  292. 'type' => $_loc6_['type'] //文件形式
  293. ),
  294. 'video' => $video,
  295. )
  296. );
  297.  
  298. //print_r( $_loc4_[1] );
  299. //print_r( compress_html_main($_loc1_['result']) );
  300. print_r( returns(json_encode($data)) );
如果你觉得雨滴资源网对你有帮助的话,可以小小的打赏一下小站,用于维持本站的运营!

本文标签:

版权声明:雨滴资源网内容来源于互联网,如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!

本文链接:YouTuBe 解析API - https://www.yudzy.com/91.html

失效提示:此文更新于2018-8-21,如果文章内容或图片资源失效,请留言反馈,客服会及时处理,谢谢!