采集方案>>另类方法下载MP3
另类方法下载MP3
发布:2009, September 17, 9:27 PM 浏览:3084
有朋友想下载几首歌曲,但一直搞不定那个网站的防盗链。我拿来分析了一下,可以采集到,但是用火车采集器无法直接获取到。怎么办呢?经过一番思考,使用了多页,完美的下载到了mp3,不过过程麻烦了点。
就是这个站,http://61tg.com/erge/zweg/6551.html 我们用这个页面做例子说明。经过研究,我们会发现,mp3的下载地址是
XML/HTML代码
- http://dx1.61tg.com/eg/zw/erge385.mp3? tflag=1253193012pin=3e375c36705461191f458b5f4b1a7e92ip=60.168.251.209
其中, /eg/zw/erge385.mp3 这个参数在当前网页里有地址,源码片断如下,每个页面都不一样的。
XML/HTML代码
- <div class="playes">
- <script type="text/javascript">var rurl="eg/zw/erge385.mp3?"+UUAuthCode;</script>
- <script type="text/javascript" src="/skin/61tg/js/play.js"></script>
- </div>
另一个参数是脚本即时生成的,是不停变化的。此参数不对也不能下载。我们查到该参数是在文件 skin/61tg/js/playserver.js 里生成的
JavaScript代码
- var i=Math.floor(Math.random()*18+1);
- var DomainUrl = "61tg.com";
- var AuthUrl = 'dx1.61tg.com/';
- SetCookie("uuauth", "ok", null, "/", DomainUrl, false);
- document.write("<script language='javascript' src='http:\/\/" + AuthUrl + "\/getuuauthcode\/'><\/script>");
- function SetCookie(name, value)
- {
- var expdate = new Date();
- var argv = SetCookie.arguments;
- var argc = SetCookie.arguments.length;
- var expires = (argc > 2) ? argv[2] : null;
- var path = (argc > 3) ? argv[3] : null;
- var domain = (argc > 4) ? argv[4] : null;
- var secure = (argc > 5) ? argv[5] : false;
- if(expires!=null) expdate.setTime(expdate.getTime() + ( expires * 1000 ));
- document.cookie = name + "=" + escape (value) +((expires == null) ? "" : ("; expires="+ expdate.toGMTString()))+((path == null) ? "" : ("; path=" + path)) +((domain == null) ? "" : ("; domain=" + domain))+((secure == true) ? "; secure" : "");
- }
- var AuthCode;
- try{
- AuthCode = UUAuthCode;
- //alert("检测成功" + UUAuthCode);
- }catch(e){
- //alert("检测失败,请检查您的浏览器是否支持cookie" + e.message);
- }
经分析是从页面 http://dx1.61tg.com/getuuauthcode/生成了最后的参数。
现在问题很明确了,我们可以获取两个变化的参数,但需要将两个参数合并在一块才可以下载文件。出现的问题是,这两个参数不在同一个页面,是在一个固定的页面和一个变化的页面里的。经过研究发现,这个uuauthcode是即时生成,对每个内容页面都是适用的,只要那个第一个参数是一样的就可以了。也就是说,它是通过一种加密算法来验证下载权限,但不是针对每一个内容有不同的算法。最后,我想到自已写程序处理这个参数,使用多页构造最后的下载地址。下边大概帖一下需要注意的几个地方。
这里的test这个站点是我本地的站点,我写了个程序用来处理这个数据,这里我请求了那个固定的页面,将两个参数变量合并到一块了。
PHP代码
- <?php
- $stra = vget('http://dx1.61tg.com/getuuauthcode/');
- preg_match("/UUAuthCode=\"(.*?)\";/",$stra,$key);
- $url=$_GET['url'];
- $url.=$key[1];
- echo $url;
- function vget($url){ // 模拟获取内容函数
- $curl = curl_init(); // 启动一个CURL会话
- curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
- curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
- curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0); // 使用自动跳转
- curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
- curl_setopt($curl, CURLOPT_HTTPGET, 1); // 发送一个常规的Post请求
- curl_setopt($curl, CURLOPT_COOKIE, 'uutags=ok;uuauth=ok;'); // 读取上面所储存的Cookie信息
- curl_setopt($curl, CURLOPT_TIMEOUT, 100); // 设置超时限制防止死循环
- curl_setopt($curl, CURLOPT_HEADER, 1); // 显示返回的Header区域内容
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
- $tmpInfo = curl_exec($curl); // 执行操作
- if (curl_errno($curl)) {
- echo 'Errno'.curl_error($curl);
- }
- curl_close($curl); // 关闭CURL会话
- return $tmpInfo; // 返回数据
- }
- ?>
下边是使用正则获取最后的下载地址。
这里是没有下载的情况。
这里是探测真实地址并下载的情况。
最后使用采集器下载时的情况,需要注意的是还要设置user-agent,具体请大家自己抓包查看。
Copyright © 2007-2009 采集之家 All Rights Reserved. Powered by SaBlog XHTML 1.0. 清除Cookies.
陕ICP备07009732号




