ホームページ  >  記事  >  バックエンド開発  >  PHP 各種 Youku、Tudou、ビデオパッケージングクラス

PHP 各種 Youku、Tudou、ビデオパッケージングクラス

WBOY
WBOYオリジナル
2016-07-25 08:49:371075ブラウズ
PHP 各種ビデオ コレクション パッケージ、Youku、Tudou、Tencent Video、56、Sohu Video、Kuliu、Sina Video、LeTV...

Nine Lane jigwang.com
  1. /**
  2. * ビデオ
  3. *
  4. * @package
  5. * @version 1.3
  6. * @copyright 2011 - 2013
  7. *
  8. * 使用法
  9. * require_once "VideoUrlParser.class.php";
  10. * $urls[ ] = "http://v.youku.com/v_show/id_XMjI4MDM4NDc2.html";
  11. * $urls[] = "http://www.tudou.com/playlist/p/l13087099.html";
  12. * $ urls[] = "http://www.tudou.com/programs/view/ufg-A3tlcxk/";
  13. * $urls[] = "http://v.ku6.com/special/show_4926690/Klze2mhMeSK6g05X.html ";
  14. * $urls[] = "http://www.56.com/u68/v_NjI2NTkxMzc.html";
  15. * $urls[] = "http://www.letv.com/ptv/vplay/1168109 .html";
  16. * $urls[] = "http://video.sina.com.cn/v/b/46909166-1290055681.html";
  17. *
  18. * foreach($urls as $url){
  19. * $info = VideoUrlParser::parse($url);
  20. * //var_dump($info);
  21. * echo "{ $info['title']}";
  22. * echo "
    ";
  23. * echo $info['object'];
  24. * echo "
    ";
  25. * }
  26. *
  27. *
  28. *
  29. * //优酷
  30. * http://v.youku.com/v_show/id_XMjU0NjY4OTEy.html
  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|ku6.com|56.com|letv.com) |video.sina.com.cn|(my.)?tv.sohu.com|v.qq.com)/";
  57. /**
  58. * 解析
  59. *
  60. * @param string $url
  61. * @parammixed $createObject
  62. * @static
  63. * @access public
  64. * @return void
  65. */
  66. static public function parse($url='') , $createObject=true){
  67. $ lowerurl = strto lower($url);
  68. preg_match(self::CHECK_URL_VALID, $ lowerurl, $matches);
  69. if(!$matches) return false;
  70. switch($matches[1 ]){
  71. case 'youku.com':
  72. $data = self::_parseYouku($url);
  73. ブレーク;
  74. case 'tudou.com':
  75. $data = self::_parseTudou($url);
  76. ブレーク;
  77. case 'ku6.com':
  78. $data = self::_parseKu6($url);
  79. ブレーク;
  80. case '56.com':
  81. $data = self::_parse56($url);
  82. ブレーク;
  83. case 'letv.com':
  84. $data = self::_parseLetv($url);
  85. ブレーク;
  86. case 'video.sina.com.cn':
  87. $data = self::_parseSina($url);
  88. ブレーク;
  89. ケース 'my.tv.sohu.com':
  90. ケース 'tv.sohu.com':
  91. ケース 'sohu.com':
  92. $data = self::_parseSohu($url);
  93. ブレーク;
  94. ケース ' v.qq.com':
  95. $data = self::_parseQq($url);
  96. ブレーク;
  97. デフォルト:
  98. $data = false;
  99. }
  100. if($data && $createObject) $data['object' ] = "";
  101. return $data;
  102. }
  103. /**
  104. * テンセントビデオ
  105. * http://v.qq.com/cover/o/o9tab7nuu0q3esh.html?vid=97abu74o4w3_0
  106. * http://v.qq.com/play/97abu74o4w3.html
  107. * http:// v.qq.com/cover/d/dtdqyd8g7xvoj0o.html
  108. * http://v.qq.com/cover/d/dtdqyd8g7xvoj0o/9SfqULsrtSb.html
  109. * http://imgcache.qq.com/tencentvideo_v1/player/ TencentPlayer.swf?_v=20110829&vid=97abu74o4w3&autoplay=1&list=2&showcfg=1&tpid=23&title=%E7%AC%AC%E4%B8%80%E7%8E%B0%E5%9C%BA&adplay=1&cid=o9tab7nuu0q3esh
  110. */
  111. プライベート静的関数 _parseQq($url){
  112. if(preg_match("//play//", $url)){
  113. $html = self::_fget($url);
  114. preg_match("/url=[^"]+/", $html, $matches);
  115. if(!$matches); return false;
  116. $url = $matches[0];
  117. }
  118. preg_match("/ vid=([^_]+)/", $url, $matches);
  119. $vid = $matches[1];
  120. $html = self::_fget($url);
  121. // query
  122. preg_match(" /flashvarss=s"([^;]+)/s", $html, $matches);
  123. $query = $matches[1];
  124. if(!$vid){
  125. preg_match("/vids?=s ?vids?||s?"(w+)";/i", $html, $matches);
  126. $vid = $matches[1];
  127. }
  128. $query = str_replace('"+vid+"', $ vid, $query);
  129. parse_str($query, $output);
  130. $data['img'] = "http://vpic.video.qq.com/{$$output['cid']}/{ $vid}_1.jpg";
  131. $data['url'] = $url;
  132. $data['title'] = $output['title'];
  133. $data['swf'] = "http:/ /imgcache.qq.com/tencentvideo_v1/player/TencentPlayer.swf?".$query;
  134. return $data;
  135. }
  136. /*
  137. * 优酷网
  138. * http://v.youku.com/v_show/id_XMjI4MDM4NDc2 .html
  139. * http://player.youku.com/player.php/sid/XMjU0NjI2Njg4/v.swf
  140. */
  141. プライベート静的関数 _parseYouku($url){
  142. preg_match("#id_(w+)#", $url, $matches);
  143. if (empty($matches)){
  144. preg_match("#v_playlist/#", $url, $mat);
  145. if(!$mat) return false;
  146. $html = self::_fget($url);
  147. preg_match("#videoId2s*=s*'(w+)'#", $html, $matches);
  148. if(!$matches) return false;
  149. }
  150. $ link = "http://v.youku.com/player/getPlayList/VideoIDS/{$matches[1]}/timezone/+08/version/5/source/out?password=&ran=2513&n=3";
  151. $retval = self::_cget($link);
  152. if ($retval) {
  153. $json = json_decode($retval, true);
  154. $data['img'] = $json['data'][ 0]['ロゴ'];
  155. $data['title'] = $json['data'][0]['title'];
  156. $data['url'] = $url;
  157. $data[' swf'] = "http://player.youku.com/player.php/sid/{$matches[1]}/v.swf";
  158. // echo "
    "; var_dump($data);	
  159. return $data;
  160. } else {
  161. return false;
  162. }
  163. }
  164. /**
  165. * Tudou.com
  166. * http://www.tudou.com/programs/view/Wtt3FjiDxEE/
  167. * http://www.tudou.com/v/Wtt3FjiDxEE/v.swf
  168. *
  169. * http:// www .tudou.com/playlist/p/a65718.html?iid=74909603
  170. * http://www.tudou.com/l/G5BzgI4lAb8/&iid=74909603/v.swf
  171. */
  172. プライベート静的関数 _parseTudou($url){
  173. preg_match("#view/([-w] +)/#", $url, $matches);
  174. if (empty($matches)) {
  175. if (strpos($url, "/playlist/") == false) return false;
  176. if(strpos ($url, 'iid=') !== false){
  177. $quarr =explode("iid=", $ lowerurl);
  178. if (empty($quarr[1])) return false;
  179. }elseif(preg_match ("#p/l(d+).#", $ lowerurl, $quarr)){
  180. if (empty($quarr[1])) return false;
  181. }
  182. $html = self::_fget($url );
  183. $html = iconv("GB2312", "UTF-8", $html);
  184. preg_match("/lid_codes=slcodes=s['"]([^'"]+)/s", $ html, $matches);
  185. $icode = $matches[1];
  186. preg_match("/iids=s.*?||s(d+)/sx", $html, $matches);
  187. $iid = $一致[1];
  188. preg_match("/listDatas=s([{.*}])/sx", $html, $matches);
  189. $find = array("/n/", '/s/', "/:[^d"]w+[^,]*,/i" , "/({|,)(w+):/");
  190. $replace = array("", "", ':"",', '\1"\2":');
  191. $str = preg_replace($find, $replace, $matches[1]);
  192. //var_dump($str);
  193. $json = json_decode($str);
  194. //var_dump($json);exit;
  195. if(is_array( $json) || is_object($json) && !empty($json)){
  196. foreach ($json as $val) {
  197. if ($val->iid == $iid) {
  198. Break;
  199. }
  200. }
  201. }
  202. $data['img'] = $val->pic;
  203. $data['title'] = $val->title;
  204. $data['url'] = $url;
  205. $ data['swf'] = "http://www.tudou.com/l/{$icode}/&iid={$iid}/v.swf";
  206. return $data;
  207. }
  208. $host = "www.tudou.com";
  209. $path = "/v/{$matches[1]}/v.swf";
  210. $ret = self::_fsget($path, $host);
  211. if ( preg_match("#nLocation: (.*)n#", $ret, $mat)) {
  212. parse_str(parse_url(urldecode($mat[1]), PHP_URL_QUERY));
  213. $data['img'] = $snap_pic;
  214. $data['title'] = $title;
  215. $data['url'] = $url;
  216. $data['swf'] = "http://www.tudou.com/v/{ $matches[1]}/v.swf";
  217. return $data;
  218. }
  219. return false;
  220. }
  221. /**
  222. * Ku6.com
  223. * http://v.ku6.com/film/show_520/3X93vo4tIS7uotHg.html
  224. * http://v.ku6.com/special/show_4926690/Klze2mhMeSK6g05X.html
  225. * http://v .ku6.com/show/7US-kDXjyKyIInDevhpwHg...html
  226. * http://player.ku6.com/refer/3X93vo4tIS7uotHg/v.swf
  227. */
  228. プライベート静的関数 _parseKu6($url){
  229. if(preg_match ("/show_/", $url)){
  230. preg_match("#/([-w]+).html#", $url, $matches);
  231. $url = "http://v.ku6. com/fetchVideo4Player/{$matches[1]}.html";
  232. $html = self::_fget($url);
  233. if ($html) {
  234. $json = json_decode($html, true);
  235. if (!$json) return false;
  236. $data['img'] = $json['data']['picpath'];
  237. $data['title'] = $json['data']['t '];
  238. $data['url'] = $url;
  239. $data['swf'] = "http://player.ku6.com/refer/{$matches[1]}/v.swf";
  240. return $data;
  241. } else {
  242. return false;
  243. }
  244. }elseif(preg_match("/show//", $url, $matches)){
  245. $html = self::_fget($url);
  246. preg_match("/ObjectInfos?=s?([^n]*)};/si", $html, $matches);
  247. $str = $matches[1];
  248. // img
  249. preg_match("/covers ?:s?"([^"]+)"/", $str, $matches);
  250. $data['img'] = $matches[1];
  251. // title
  252. preg_match("/title"? s?:s?"([^"]+)"/", $str, $matches);
  253. $jsstr = "{"title":"{$matches[1]}"}";
  254. $json = json_decode($jsstr, true);
  255. $data['title'] = $json['title'];
  256. // url
  257. $data['url'] = $url;
  258. // query
  259. preg_match("/ "(vid=[^"]+)"sname="flashVars"/s", $html, $matches);
  260. $query = str_replace("&", '&', $matches[1]);
  261. preg_match("///player.ku6cdn.com[^"']+/", $html, $matches);
  262. $data['swf'] = 'http:'.$matches[0].'?' .$query;
  263. return $data;
  264. }
  265. }
  266. /**
  267. * 56.com
  268. * http://www.56.com/u73/v_NTkzMDcwNDY.html
  269. * http://player.56.com/v_NTkzMDcwNDY.swf
  270. */
  271. プライベート静的関数 _parse56($url){
  272. preg_match("#/v_(w+).html#", $ url, $matches);
  273. if (empty($matches)) return false;
  274. $link="http://vxml.56.com/json/{$matches[1]}/?src=out" ;
  275. $retval = self::_cget($link);
  276. if ($retval) {
  277. $json = json_decode($retval, true);
  278. $data['img'] = $json['info' ]['img'];
  279. $data['title'] = $json['info']['Subject'];
  280. $data['url'] = $url;
  281. $data['swf'] = "http://player.56.com/v_{$matches[1]}.swf";
  282. return $data;
  283. } else {
  284. return false;
  285. }
  286. }
  287. /**
  288. * LeTV
  289. * http://www.letv.com/ptv/vplay/1168109.html
  290. * http://www.letv.com/player/x1168109.swf
  291. */
  292. プライベート静的関数 _parseLetv($url){
  293. $html = self::_fget($url);
  294. preg_match("#http://v.t.sina.com.cn/( [^'"]*)#", $html, $matches);
  295. parse_str(parse_url(urldecode($matches[0]), PHP_URL_QUERY));
  296. preg_match("#vplay/(d+)#", $url , $matches);
  297. $data['img'] = $pic;
  298. $data['title'] = $title;
  299. $data['url'] = $url;
  300. $data['swf'] = "http://www.letv.com/player/x{$matches[1]}.swf";
  301. return $data;
  302. }
  303. // 搜狐TV http://my.tv.sohu.com /u/vw/5101536
  304. プライベート静的関数 _parseSohu($url){
  305. $html = self::_fget($url);
  306. $html = iconv("GB2312", "UTF-8", $html);
  307. preg_match_all("/og:(?:title|image|videosrc)"scontent="([^"]+)"/s", $html, $matches);
  308. $data['img'] = $matches[ 1][1];
  309. $data['title'] = $matches[1][0];
  310. $data['url'] = $url;
  311. $data['swf'] = $matches[1] [2];
  312. return $data;
  313. }
  314. /*
  315. * 新浪播客
  316. * http://video.sina.com.cn/v/b/48717043-1290055681.html
  317. * http://you. video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=48717043_1290055681_PUzkSndrDzXK+l1lHz2stqkP7KQNt6nki2O0u1ehIwZYQ0/XM5GdatoG5ynSA9kEqDhAQJA4dPkm0x4/s.swf
  318. */
  319. プライベート静的関数 _parseSina($url){
  320. preg_match("/(d+)(? :-|_)(d+)/", $url, $matches);
  321. $url = "http://video.sina.com.cn/v/b/{$matches[1]}-{$matches [2]}.html";
  322. $html = self::_fget($url);
  323. preg_match("/videos?:s?([^<]+)}/", $html, $matches);
  324. $find = array("/n/", "/s*/", "/'/", "/{([^:,]+):/", "/,([^:]+) :/", "/:[^d"]w+[^,]*,/i");
  325. $replace = array('', '', '"', '{"\1":', ' ,"\1":', ':"",');
  326. $str = preg_replace($find, $replace, $matches[1]);
  327. $arr = json_decode($str, true);
  328. $ data['img'] = $arr['pic'];
  329. $data['title'] = $arr['title'];
  330. $data['url'] = $url;
  331. $data['swf '] = $arr['swfOutsideUrl'];
  332. return $data;
  333. }
  334. /*
  335. * 通过 file_get_contents 获取内容
  336. */
  337. private static function _fget($url=''){
  338. if(!$ url) return false;
  339. $html = file_get_contents($url);
  340. // 判断はgzip压缩
  341. if($dehtml = self::_gzdecode($html))
  342. return $dehtml;
  343. else
  344. return $html;
  345. }
  346. /*
  347. * fsockopen 経由で内容を取得します
  348. */
  349. private static function _fsget($path='/', $host='', $user_agent=''){
  350. if(!$path || !$host) return false;
  351. $user_agent = $user_agent ? $user_agent : self::USER_AGENT;
  352. $out = <<
  353. GET $path HTTP/1.1
  354. ホスト: $host
  355. ユーザーエージェント: $user_agent
  356. 受け入れ: text/html,application/xhtml+ xml,application/xml;q=0.9,*/*;q=0.8
  357. Accept-Language: zh-cn,zh;q=0.5
  358. Accept-Charset: GB2312,utf-8;q=0.7,*;q= 0.7rnrn
  359. HEADER;
  360. $fp = @fsockopen($host, 80, $errno, $errstr, 10);
  361. if (!$fp) return false;
  362. if(!fputs($fp, $out)) return false;
  363. while ( !feof($fp) ) {
  364. $html .= fgets($fp, 1024);
  365. }
  366. fclose($fp);
  367. // 否か判断gzip压缩
  368. if($dehtml = self: :_gzdecode($html))
  369. return $dehtml;
  370. else
  371. return $html;
  372. }
  373. /*
  374. * 通过curl获取内容
  375. */
  376. private static function _cget($url='', $user_agent=' '){
  377. if(!$url) return;
  378. $user_agent = $user_agent ? $user_agent : self::USER_AGENT;
  379. $ch =curl_init();
  380. curl_setopt($ch, CURLOPT_URL, $url);
  381. curl_setopt($ch, CURLOPT_HEADER, 0);
  382. if(strlen($user_agent))curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
  383. ob_start();
  384. curl_exec($ch);
  385. $html = ob_get_contents();
  386. ob_end_clean();
  387. if(curl_errno($ch)){
  388. curl_close($ch);
  389. return false;
  390. }
  391. curl_close($ch);
  392. if(!is_string($html) || !strlen( $html)){
  393. return false;
  394. }
  395. return $html;
  396. // 判断はgzip压缩
  397. if($dehtml = self::_gzdecode($html))
  398. return $dehtml;
  399. else
  400. return $html;
  401. }
  402. プライベート静的関数 _gzdecode($data) {
  403. $len = strlen ( $data );
  404. if ($len null を返します。 // GZIP 形式ではありません (RFC 1952 を参照)
  405. }
  406. $method = ord ( substr ( $data, 2, 1 ) ); // 圧縮方法
  407. $flags = ord ( substr ( $data, 3, 1 ) ); // Flags
  408. if ($flags & 31 != $flags) {
  409. // 予約ビットが設定されています -- RFC 1952 では許可されていません
  410. return null;
  411. }
  412. // 注: $mtime は負の値になる可能性があります (PHP 整数の制限) )
  413. $mtime = unpack ( "V", substr ( $data, 4, 4 ) );
  414. $mtime = $mtime [1];
  415. $xfl = substr ( $data, 8, 1 );
  416. $os = substr ( $data, 8, 1 );
  417. $headerlen = 10;
  418. $extralen = 0;
  419. $extra = "";
  420. if ($flags & 4) {
  421. // ヘッダー内の 2 バイト長のプレフィックス付き EXTRA データ
  422. if ($len - $headerlen - 2 return false; // 無効な形式
  423. }
  424. $extralen = unpack ( "v", substr ( $data, 8, 2 ) );
  425. $extralen = $extralen [1];
  426. if ($len - $headerlen - 2 - $extralen < 8) {
  427. false を返します。 // 無効な形式
  428. }
  429. $extra = substr ( $data, 10, $extralen );
  430. $headerlen += 2 + $extralen;
  431. }
  432. $filenamelen = 0;
  433. $filename = "";
  434. if ( $flags & 8) {
  435. // ヘッダー内の C スタイルの文字列ファイル NAME データ
  436. if ($len - $headerlen - 1 < 8) {
  437. return false; // 無効な形式
  438. }
  439. $filenamelen = strpos ( substr ( $data, 8 + $extralen ), chr ( 0 ) );
  440. if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
  441. false を返します。 // 無効な形式
  442. }
  443. $filename = substr ( $data, $headerlen, $filenamelen );
  444. $headerlen += $filenamelen + 1;
  445. }
  446. $commentlen = 0;
  447. $comment = "";
  448. if ($flags & 16) {
  449. // ヘッダー内の C スタイルの文字列 COMMENT データ
  450. if ($len - $headerlen - 1 < 8) {
  451. return false; // 無効な形式
  452. }
  453. $commentlen = strpos ( substr ( $data, 8 + $extralen + $filenamelen ), chr ( 0 ) );
  454. if ($commentlen === false || $len - $headerlen - $コメントレン - 1 false を返します。 // ヘッダー形式が無効です
  455. }
  456. $comment = substr ( $data, $headerlen, $commentlen );
  457. $headerlen += $commentlen + 1;
  458. }
  459. $headercrc = "";
  460. if ($flags & 1 ) {
  461. // ヘッダーに CRC32 の 2 バイト (最下位) が存在します
  462. if ($len - $headerlen - 2 return false; // 無効な形式
  463. }
  464. $calccrc = crc32 ( substr ( $data, 0, $headerlen ) ) & 0xffff;
  465. $headercrc = unpack ( "v", substr ( $data, $headerlen, 2 ) );
  466. $ headercrc = $headercrc [1];
  467. if ($headercrc != $calccrc) {
  468. return false; // 不正なヘッダー CRC
  469. }
  470. $headerlen += 2;
  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) {
  486. case 8 :
  487. // 現在サポートされている唯一の圧縮方法:
  488. $data = gzinflate ( $body );
  489. Break;
  490. default :
  491. // 不明な圧縮方法
  492. return false;
  493. }
  494. } else {
  495. //...
  496. }
  497. if ($isize != strlen ( $data ) || crc32 ( $data ) != $datacrc) {
  498. // 形式が間違っています! 長さまたは CRC が一致しません。
  499. return false;
  500. }
  501. return $data;
  502. }
  503. }
  504. /*
  505. $url = "http://v.youku.com/v_show/id_XNjIxNjUyOTky.html";
  506. $obj = new VideoUrlparser();
  507. $data = $obj->parse($ url);
  508. var_dump($data);
  509. */
コードをコピー


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。