PHP+wget+bat批量下载合并youku视频
看到网上有个视频虽然是flv的,还比较清晰,于是想下载下来。
感谢感谢youku网,感谢CCTV ,MTV …………………
感谢PHP,感谢wget 这么强大的东东!特别是wget ,真的很好很强大。
方法简介:
通过PHP取得youku网视频的实际地址,然后生成相应的批处理代码(这里以WIN下的dos命令为例),批处理主要是调用wget下载视频,然后用copy简单合并成一个大文件(因为一个视频实际被分成了几个小的FLV文件)。
下面看下效果吧,哈哈,全是自动的
,方便省事:
PHP代码也帖出来下,哈哈,仅供测试,不得用于非法用途
:
php文件的使用方法:
youku.php?id=视频id
视频ID你看网址就知道了,如:http://v.youku.com/v_show/id_XMTM4MzkyMTI4.html
http://player.youku.com/player.php/sid/XOTUzMDI4MTY=/v.swf
id分别为:
XMTM4MzkyMTI4
XOTUzMDI4MTY=
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <?php //批量下载youku视频 by 荒野无灯 www.ihacklog.com set_time_limit(3600*5); function youku($key) { $time = time(); $auth =md5(time().' XOA== MWZlNWE4Y2Q4OWQ0NjEyMWJjZTJmMWNiYTVhNzQwZGM='); $url="http://api.youku.com/api_rest?method=video.getvideofile&pid=XOA==&ctime=$time&auth=$auth&videoid=$key"; $file = file_get_contents($url,LOCK_EX); preg_match_all('/url="(http.*)"/isU',$file,$url); return $url[1]; } //var_export(youku('XMTM4MzkyMTI4')); function get_url($url) { $url=str_replace('http://f.youku.com','',$url); $referer='http://v.youku.com'; $host='f.youku.com'; $ua='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5'; $fp = @fsockopen($host, 80, $errno, $errstr, 30); if ($fp) { $out = "GET {$url} HTTP/1.1\r\n"; $out .= "User-Agent: {$ua}\r\n"; $out .= "Host: {$host}\r\n"; $out .= "Referer: $referer\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); $data=''; while (!feof($fp)) { $data .= fgets($fp,4096); if(false!==strpos($data,'Location:')) break; } fclose($fp); $flv_down_url=str_replace('Location: ','',$data); $flv_down_url=str_replace('HTTP/1.1 302 Found','',$flv_down_url); $flv_down_url=trim($flv_down_url); $flv_down_url=urldecode($flv_down_url); //file_put_contents('a.flv',$data); //var_dump($flv_down_url); return $flv_down_url; } } $id=$_GET['id']; $urls=youku($id); $str='copy /B '; $wgets=''; $n=0; foreach($urls as $i) { $flv=get_url($i); //echo "<a href='$flv' target='_blank'>$flv</a><br />"; $wgets.="wget --user-agent=\"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5\" -O {$n}.flv {$flv}\r\n"; $str.=$n.'.flv+'; //var_dump($flv);exit; $n++; } $str=substr($str,0,strlen($str)-1); $str.=' all.flv'; //echo $str; $content=$wgets.$str; // 生成bat header('Content-Type: application/octet-stream;'); header('Content-Disposition: attachment; filename=a.bat;'); header('Content-Transfer-Encoding: binary'); header('Content-Length: '.strlen($content) ); echo $content; |
wget.exe 下载 (392.0 KB, 84 次)
另附wget常用参数:
-c 断点续传功能
-O 保存文件名
-P 保存目录
–user-agent 用户代理设置
注意到我这里添加了:
1 | --user-agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5" |
如果不加用户代理 ,让youku 检测到你在用工具下载它的视频,它直接给你返回个403 错误来,这样视频就下载不下来了。
本文中用到取得youku视频地址的函数来自:
http://www.zzxj.net/blog/fxs_2008/archive/2010/04/15/136.html








太牛了,
局限于windows。。我要纯PHP的
LINUX下修改下cp命令即可,纯PHP可以下载,不过既然用WGET下载更合适,为什么要纯PHP的?适用即可。
最近也在折腾wget,不过对一些网盘地址支持得不是很好-.-
巨强大!!
用qqlive看过的电影缓存后的文件也可以简单地用copy命令合并为一个文件。