首頁  >  文章  >  後端開發  >  php各種優酷,土豆,視頻封裝類

php各種優酷,土豆,視頻封裝類

WBOY
WBOY原創
2016-07-25 08:49:371075瀏覽
複製程式碼
php各種視訊採集類封裝,優酷,土豆,騰訊視頻、56、搜狐視頻、酷六、新浪視頻、樂視.......

九弄 jigwang.com
  1. /**
  2. * 影片
  3. *
  4. * @package
  5. * @version 1.3
  6. * @copyright 20111 2013
  7. *
  8. * 實作
  9. * require_once "VideoUrlParser.class.php";
  10. * $urls[] = "http://v.youku.com/v_show/id_XMjI4MDM4NDc2.html"; * $urls[] = "http://www.tudou.com/playlist/p/l13087099.html";
  11. * $urls[] = "http://www.tudou.com/programs/view /ufg-A3tlcxk/";
  12. * $urls[] = "http://v.ku6.com/special/show_4926690/Klze2mhMeSK6g05X.html";
  13. * $urls[] = "http:// www.56.com/u68/v_NjI2NTkxMzc.html";
  14. * $urls[] = "http://www.letv.com/ptv/vplay/1168109.html";
  15. * $urls[] = "http://video.sina.com.cn/v/b/46909166-1290055681.html";
  16. *
  17. * foreach($urls as $url){
  18. * $info = VideoUrlParser ::parse($url);
  19. * //var_dump($info);
  20. * echo "{ $info ['title']}";
  21. * echo "
    ";
  22. * echo $info['object'];
  23. * echo "
    ";
  24. * }
  25. *
  26. *
  27. *
  28. * //優酷
  29. * http://v.youku.com/v_show/id_XMjU0NjY4OTEy.html
  30. *
  31. *
  32. * //酷六
  33. * http://v.ku6.com/special/show_3917484/x0BMXAbgZdQS6FqN.html
  34. *
  35. *
  36. * // 馬鈴薯
  37. * http://www.tudou.com/playlist/p /a65929.html? iid=74905844
  38. *
  39. *
  40. * //56
  41. * http://www.56 .com/u98/v_NTkyODY2NTU.html
  42. *
  43. *
  44. * //新浪播客
  45. * http://video.sina .com.cn/v/b/46909166 -1290055681.html
  46. *
  47. *
  48. * //樂視
  49. * http://www.letv.com/ptv/vplay/1168109.html
  50. *
  51. */
  52. class VideoUrlparser
  53. {
  54. const USER_AGENT =「Mozilla/5.0(Windows;你; Windows NT 5.1 ; en-US) AppleWebKit/534.10(KHTML,如Gecko)
  55. Chrome/8.0.552.224 Safari/534.10";
  56. const CHECK_URL_VALID = "/(youku.com|tudou.com|66. com |letv.com|video.sina.com.cn|(my.)?tv.sohu.com|v.qq.com)/";
  57. /**
  58. * 解析
  59. *
  60. * @param string $url
  61. * @param mix $createObject
  62. * @static
  63. * @access public
  64. * @return void
  65. */
  66. static public function parse($url='', $createObject=true){
  67. $lowerurl = strtolower($url);
  68. preg_match(self::CHECK_URL_VALID, $lowerurl, $matches);
  69. switch($matches[1]){
  70. case 'youku.com':
  71. $data = self::_parseYouku($url);
  72. 中斷;
  73. case 'tudou.com':
  74. $data = self::_parseTudou($url);
  75. 中斷;
  76. case 'ku6.com':
  77. $data = self ::_parseKu6($url);
  78. 中斷;
  79. case '56.com':
  80. $data = self::_parse56($url);
  81. 中斷;
  82. case 'letv . com':
  83. $data = self::_parseLetv($url);
  84. break;
  85. case 'video.sina.com.cn':
  86. $data = self::_parseSina($ url );
  87. break;
  88. case 'my.tv.sohu.com':
  89. case 'tv.sohu.com':
  90. case 'sohu.com':
  91. $data = self ::_parseSohu($url);
  92. 中斷;
  93. case 'v.qq.com':
  94. $data = self::_parseQq($url);
  95. 中斷;
  96. 預設:
  97. $data = false;
  98. }
  99. if($data && $createObject) $data['object'] = " $html = self ::_fget($url);
  100. preg_match("/url=[^"] /", $html, $matches);
  101. if(!$matches); return false;
  102. $url = $matches[0];
  103. }
  104. preg_match("/vid=([^_] )/", $url, $matches);
  105. $vid = $matches[1];
  106. $html = self::_fget($url);
  107. // 查詢
  108. preg_match("/flashvarss=s"([^;] )/s", $html, $matches);
  109. $查詢= $matches[1];
  110. if(!$vid){
  111. preg_match("/vids?=s?vids?||s?"(w )";/i", $html, $ matches);
  112. $vid = $matches[1];
  113. }
  114. $query = str_replace('" vid "', $vid, $query);
  115. parse_str($query, $ output );
  116. $data['img'] = "http://vpic.video.qq.com/{$$output['cid']}/{$vid}_1.jpg";
  117. $ data['url'] = $url;
  118. $data['title'] = $output['title'];
  119. $data['swf'] = "http://imgcache.qq. com /tencentvideo_v1/player/TencentPlayer.swf?".$query;
  120. return $data;
  121. }
  122. /*
  123. * 酷網
  124. * http://v. youku .com/v_show/id_XMjI4MDM4NDc2.html
  125. * http://player.youku.com/player.php/sid/XMjU0NjI2Njg4/v.swf
  126. */
  127. 北極靜態函數_parseYousYouku 是(url ){
  128. preg_match("#id_(w )#", $url, $matches);
  129. if (empty($matches)){
  130. preg_match("#v_playlist/#", $url , $mat);
  131. if(!$mat) return false;
  132. $html = self::_fget($url);
  133. preg_match("#videoId2s*= s* '(w )'#", $html, $matches);
  134. if(!$matches) return false;
  135. }
  136. $link = "http://v.youku .com /player/getPlayList/VideoIDS/{$matches[1]}/timezone/ 08/version/5/source/out?password=&ran=2513&n=3";
  137. $retval = self:: _cget( $link);
  138. if ($retval) {
  139. $json = json_decode($retval, true);
  140. $data['img'] = $json['data'] [0 ]['logo'];
  141. $data['title'] = $json['data'][0]['title'];
  142. $data['url'] = $url;
  143. $data['swf'] = "http://player.youku.com/player.php/sid/{$matches[1]}/v.swf";
  144. // echo "< ;前>”; var_dump($資料);
  145. return $data;
  146. } else {
  147. return false;
  148. }
  149. }
  150. /**
  151. * 馬鈴薯網
  152. * http://www.tudou.com/programs/view/Wtt3FjiDxEE/
  153. * http://www.tudou.com/v/Wtt3FjiDxEE/v.swf
  154. *
  155. * http://www.tudou.com/playlist/p/a65718.html?iid=74909603
  156. * http://www.tudou.com/l/G5BzgI4lAb8/&iid=74909603/v. swf
  157. */
  158. 私人功能_parseTudou($url){
  159. preg_match("#view/([-w] )/#", $url, $matches);
  160. if (empty($matches)) {
  161. if (strpos($url, "/playlist/") == false) return false;
  162. if(strpos($url, 'iid=') !== false){
  163. $quarr = explode("iid=", $lowerurl);
  164. if (empty($quarr[1])) return false;
  165. }elseif(preg_match("#p/l(d ).#", $ lowerurl , $quarr)){
  166. if (empty($quarr[1])) return false;
  167. }
  168. $html = self::_fget($url);
  169. $ html = iconv("GB2312", "UTF-8", $html);
  170. preg_match("/lid_codes=slcodes=s['"]([^'"] )/s", $html , $matches);
  171. $icode = $matches[1];
  172. preg_match("/iids=s.*?||s(d )/sx", $html, $matches);
  173. $iid = $matches[1];
  174. preg_match("/listDatas=s([{.*}])/sx", $html, $matches);
  175. $find = array("/n/", '/s/', "/:[^d"]w [^,]* ,/i", "/({|,)(w ):/");
  176. $replace = array("", "", ':"",', '\1"\2":' );
  177. $str = preg_replace($find, $replace, $matches[1]);
  178. //var_dump($str);
  179. $json = json_decode($str);
  180. / /var_dump($json);exit;
  181. if(is_array($json) || is_object($json) && !empty($json)){
  182. foreach ($json as $val) {
  183. if ($val->iid == $iid) {
  184. break;
  185. }
  186. }
  187. }
  188. $data['img'] = $val->; pic;
  189. $data['title'] = $val->title;
  190. $data['url'] = $url;
  191. $data['swf'] = "http:// www .tudou.com/l/{$icode}/&iid={$iid}/v.swf";
  192. return $data;
  193. }
  194. $host = "www . tudou.com";
  195. $path = "/v/{$matches[1]}/v.swf";
  196. $ret = self::_fsget($path, $host);
  197. if (preg_match("#nLocation: (.*)n#", $ret, $mat)) {
  198. parse_str(parse_url(urldecode($mat[1]), PHP_URL_QUERY));
  199. $data['img'] = $snap_pic;
  200. $data['title'] = $title;
  201. $data['url'] = $url;
  202. $data ['swf'] = "http://www.tudou.com/v/{$matches[1]}/v.swf";
  203. 回傳$data;
  204. }
  205. 返回false;
  206. }
  207. /**
  208. * 酷6網
  209. * http://v.ku6.com/film/show_520/3X93vo4tIS7uotHg.html
  210. * http://v.ku6.com/special/show_4926690/Klze2mh16g05X. 🎜> * http://v.ku6.com/show/7US-kDXjyKyIInDevhpwHg...html
  211. * http://player.ku6.com/refer/3X93vo4tIS7uotHg/v.swf
  212. */
  213. 真空真空函數_parseKu6($url){
  214. if(preg_match("/show_/", $url)) {
  215. preg_match("#/([-w] ).html#", $url, $matches);
  216. $url = "http://v.ku6.com/fetchVideo4Player/{$matches[ 1 ]}.html";
  217. $html = self::_fget($url);
  218. if ($html) {
  219. $json = json_decode($html, true);
  220. if(!$json) return false;
  221. $data['img'] = $json['data']['picpath'];
  222. $data['title'] = $json [ 'data']['t'];
  223. $data['url'] = $url;
  224. $data['swf'] = "http://player.ku6.com/refer/{ $ matches[1]}/v.swf";
  225. return $data;
  226. } else {
  227. return false;
  228. }
  229. }elseif(preg_match("/show/ / ", $url, $matches)){
  230. $html = self::_fget($url);
  231. preg_match("/ObjectInfos?=s?([^n]*)};/si" , $html, $matches);
  232. $str = $matches[1];
  233. // img
  234. preg_match("/covers?:s?"([^"] )"/", $ str , $matches);
  235. $data['img'] = $matches[1];
  236. // title
  237. preg_match("/title"?s?:s?"([^"] ) "/", $str, $matches);
  238. $jsstr = "{"title":"{$matches[1]}"}";
  239. $json = json_decode($jsstr, true);
  240. $data['title'] = $json['title'];
  241. // url
  242. $data['url'] = $url;
  243. // 查詢
  244. preg_match( " /"(vid=[^"] )"sname="flashVars"/s", $html, $matches);
  245. $query = str_replace("&", '&', $matches[1]) ;
  246. preg_match("///player.ku6cdn.com[^"'] /", $html, $matches);
  247. $data['swf'] = 'http:'.$matches[0 ] .'?'.$query;
  248. return $data;
  249. }
  250. }
  251. /**
  252. * 56網
  253. * http://www.56.com/u73/v_NTkzMDcwNDY.html
  254. * http://player.56.com/v_NTkzMDcwNDY.swf
  255. */
  256. 私有靜態函數_parse56( $ url ){
  257. preg_match("#/v_(w ).html#", $url, $matches);
  258. if (empty($matches)) return false;
  259. $ link="http://vxml.56.com/json/{$matches[1]}/?src=out";
  260. $retval = self::_cget($link);
  261. if ($retval) {
  262. $json = json_decode($retval, true);
  263. $data['img'] = $json['info']['img'];
  264. $data['title'] = $json['info']['Subject'];
  265. $data['url'] = $url;
  266. $data['swf'] = "http :// /player.56.com/v_{$matches[1]}.swf";
  267. return $data;
  268. } else {
  269. return false;
  270. }
  271. }
  272. }
  273. /**
  274. * 樂視網
  275. * http://www.letv.com/ptv/vplay/1168109.html
  276. * http://www.letv.com/player/x1168109.swf
  277. */
  278. 真空私有函數_parseLetv($url){
  279. $html = self::_fget($url);
  280. preg_match("#http : //v.t.sina.com.cn/([^'"]*)#", $html, $matches);
  281. parse_str(parse_url(urldecode($matches[0]), PHP_URL_QUERY));
  282. preg_match("#vplay/(d )#", $url, $matches);
  283. $data['img'] = $pic;
  284. $data['title'] = $title;
  285. $data['url'] = $url;
  286. $data['swf'] = "http://www.letv.com/player/x{$matches[1]}.swf";
  287. return $data;
  288. }
  289. // 搜狐TV http://my.tv.sohu.com/u/vw/5101536
  290. private static function _parseSohu($url) {
  291. $html = self::_fget($url);
  292. $html = iconv("GB2312", "UTF-8", $html);
  293. preg_match_all("/og:(?: title |image|videosrc)"scontent="([^"] )"/s", $html, $matches);
  294. $data['img'] = $matches[1][1];
  295. $data['title'] = $matches[1][0];
  296. $data['url'] = $url;
  297. $data['swf'] = $matches[1][2 ] ;
  298. return $data;
  299. }
  300. /*
  301. * 新浪播客
  302. * http://video.sina.com.cn/v/b/48717043-1290055681 . html
  303. * http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=48717043_1290055681_PUzkSndrDzXK l1lHz2stqkP7KQNt6nki Pkm0 x4/s.swf
  304. */
  305. 真空靜脈函數_parseSina ( $url){
  306. preg_match("/(d )(?:-|_)(d )/", $url, $matches);
  307. $url = "http://video. sina. com .cn/v/b/{$matches[1]}-{$matches[2]}.html";
  308. $html = self::_fget($url);
  309. preg_match(" /videos ? :s?([^ $find = array("/n/", "/s*/", "/'/", "/ { ([^:,] ):/", "/,([^:] ):/", "/:[^d"]w [^,]*,/i");
  310. $替換= array('', '', '"', '{"\1":', ',"\1":', ':"",');
  311. $str = preg_replace($find, $替換, $matches[1]);
  312. $arr = json_decode($str, true);
  313. $data['img'] = $arr['pic'];
  314. $ data ['title'] = $arr['title'];
  315. $data['url'] = $url;
  316. $data['swf'] = $arr['swfOutsideUrl'];
  317. return $data;
  318. }
  319. /*
  320. * 透過file_get_contents 取得內容
  321. */
  322. private static function _fget($url=''){
  323. '' if(!$url) return false;
  324. $html = file_get_contents($url);
  325. // 判斷是否gzip壓縮
  326. if($dehtml = self::_gzdecode($html))
  327. return $dehtml;
  328. else
  329. return $html;
  330. }
  331. /*
  332. * 透過fsockocopen 取得內容
  333. */
  334. private static function 的內容
  335. */
  336. private static function _fsic(>路徑='/', $host='', $user_agent=''){
  337. if(!$path || !$host) return false;
  338. $user_agent = $user_agent : $user_agent : self:: USER_AGENT;
  339. $out = GET $path HTTP/1.1
  340. 主機:$host
  341. 用戶代理:$user_agent
  342. 接受:text/html,application/ xhtml xml,application/xml;q=0.9,*/*;q=0.8
  343. 接受語言:zh-cn,zh;q=0.5
  344. 接受字元集: GB2312,utf-8;q=0.7, *;q=0.7rnrn
  345. HEADER;
  346. $fp = @fsockopen($host, 80, $errno, $errstr, 10);
  347. if ( !$fp) return false;
  348. if (!fputs($fp, $out)) return false;
  349. while ( !feof($fp) ) {
  350. $html .= fgets($fp, 1024);
  351. }
  352. fclose ($fp);
  353. // 判斷是否gzip壓縮
  354. if($dehtml = self::_gzdecode($html))
  355. return $dehtml;
  356. else
  357. return $html;
  358. }
  359. /*
  360. * 透過curl取得內容
  361. */
  362. private static function _cget($url='', $user_agent=''){
  363. if( !$url) return;
  364. $user_agent = $user_agent ? $user_agent : self::USER_AGENT;
  365. $ch =curl_init();
  366. curl_setopt($ch, CURLOPT_URL, $url);
  367. curl_setopt($ch, CUR0); > if(strlen($user_agent))curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
  368. ob_start();
  369. curl_exec($ch);
  370. $html = obget_contents(
  371. ob_end_clean();
  372. if(curl_errno($ch)){
  373. curl_close($ch);
  374. return false;
  375. }
  376. curl_close($ch);
  377. if(!is_string($html) || !strlen($html)){
  378. return false;
  379. }
  380. return $html;
  381. // 判斷是否gzip壓縮
  382. if($dehtml = self::_gzdecode($html))
  383. return $dehtml;
  384. else
  385. return $html; }
  386. 私人靜態函數_gzdecode($data) {
  387. $len = strlen ( $data );
  388. if ($len 回傳null; // 非GZIP 格式(參見RFC 1952)
  389. }
  390. $method = ord ( substr ( $data, 2, 1 ) ); // 壓縮方式
  391. $flags = ord ( substr ( $data, 3, 1 ) ); // 標誌
  392. if ($flags & 31 != $flags) {
  393. // 設定保留位元-- RFC 1952 不允許
  394. return null;
  395. }
  396. // 注意: $mtime 可能為負數(PHP 整數限制)
  397. $mtime = unpack ( "V", substr ( $data, 4, 4 ) ) ;
  398. $mtime = $mtime [1];
  399. $ xfl = substr ( $data, 8, 1 );
  400. $os = substr ( $data, 8, 1 );
  401. $headerlen = 10;
  402. $extralen = 0;
  403. $extra = "";
  404. if ($flags & 4) {
  405. // 標頭中2 位元組長度前綴的額外資料
  406. if ($len - $headerlen - 2 return false ; // 格式無效
  407. }
  408. $extralen = unpack ( "v", substr ( $data, 8, 2 ) );
  409. $extralen = $extralen [1];
  410. if ($len - $headerlen - 2 - $extralen 回傳false; // 格式無效
  411. }
  412. $extra = substr ( $data, 10, $extralen );
  413. $headerlen = 2 $extralen;
  414. }
  415. $filenamelen = 0;
  416. $filename = "";
  417. if ($flags & 8) {
  418. // 標頭中的C 風格字串檔名資料
  419. if ($len - $headerlen - 1 回傳假; // 格式無效
  420. }
  421. $filenamelen = strpos ( substr ( $data, 8 $extralen ), chr ( 0 ) );
  422. if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 回傳false; // 格式無效
  423. }
  424. $filename = substr ( $data, $headerlen, $filenamelen );
  425. $headerlen = $filenamelen 1;
  426. }
  427. $commentlen = 0 ;
  428. $comment = "";
  429. if ($flags & 16) {
  430. // 標題中的C 風格字符串COMMENT 數據
  431. if ( $len - $headerlen - 1 回傳假; // 格式無效
  432. }
  433. $commentlen = strpos ( substr ( $data, 8 $extralen $filenamelen ), chr ( 0 ) ) ;
  434. if ($commentlen === false || $len - $headerlen - $commentlen - 1 回傳false; // 標頭格式無效
  435. }
  436. $comment = substr ( $data, $headerlen, $commentlen );
  437. $headerlen = $commentlen 1;
  438. }
  439. $headercrc = "";
  440. if ($flags & 1) {
  441. // 標頭中存在2 個位元組(最低階)的CRC32
  442. if ($len - $headerlen - 2 回傳假; // 格式無效
  443. }
  444. $calccrc = crc32 ( substr ( $data, 0, $headerlen ) ) & 0xffff;
  445. $headercrc = unpack ( "v", substr ( $data, $headerlen, 2 ) );
  446. $headercrc = $headercrc [1];
  447. if ($headercrc != $calccrc) {
  448. return false; // 錯誤的標頭CRC
  449. }
  450. $headerlen = 2;
  451. }
  452. }
  453. $headerlen = 2;
  454. }
  455. }
  456. $headerlen = 2;
  457. }
  458. }
  459. $headerlen = 2;
  460. }
  461. }
  462. $headerlen = 2;
  463. }
  464. }
  465. $headerlen = 2;
  466. }
  467. }
  468. $headerlen = 2;
  469. }
  470. }
  471. $頭>
  472. // GZIP FOOTER - 由於PHP 的限制,這些內容為負
  473. $datacrc = unpack ( "V" , substr ( $data, - 8, 4 ) );
  474. $datacrc = $datacrc [1];
  475. $isize = unpack ( "V", substr ( $data, - 4 ) );
  476. $isize = $isize [1];
  477. // 執行解壓縮:
  478. $bodylen = $len - $headerlen - 8;
  479. if ($bodylen // 這不應該發生- 實現錯誤!
  480. return null;
  481. }
  482. $body = substr ( $data, $headerlen, $bodylen );
  483. $data = "";
  484. if ($bodylen > 0) {
  485. switch ($method) { case 8 : // 目前唯一支援的壓縮方法: $data = gzinflate ( $body ); break; default : // 未知的壓縮方法 return false; } } else { //... } if ($isize != strlen ( $data ) || crc32 ( $data ) != $datacrc) { // 格式錯誤! 長度或 CRC 不符! 回傳 false; } 回傳 $data; }}
  486. /*
  487. $url = "http://v.youku.com/v_show/id_XNjIxNjUyOTky.html";
  488. $obj = new VideoUrlparser();
  489. $data = $obj->parse($url);
  490. var_dump($data);
  491. */
*/


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn