输入banner图图片脚本导航/分类

curl可不可以下载115的资源

curl能否下载115的资源
1个300MB的资源,用迅雷下载(非115VIP),已经设置了原始线程1,但是平均速度只有10几KB,下到60%之时就提示错误。分析了一下URL地址规律,发现URL里的 &t=1368261625 是一个变量,估计115根据这个时间来处理下载过期事务。

用 Ultraediter 打开.td.cfg,修改了里面的&t=1368261625为当前时间,重新启动迅雷,发现文件被重新下载了(之前的60%木有了)。不知道如何修改迅雷,才可以使得修改了下载URL后可以继续前面的下载。(迅雷应该还有一个文件参数对比的方法,但是没有找到)

于是想到了用php curl下载115的资源(PHP可以任意修改URL地址),但是PHP的默认超时为30秒,如果set_time_limit(0);的话,如何判别115的资源地址已经失效,即这个PHP文件已经运行完毕?
打算用.bat文件,或者直接命令提示符DOS运行该php脚本。

问题:
1.用curl断点保存文件,会不会在第二次下载时,又重新从0%开始?
2.如果问题1可行的话,如果如何写代码,可以在一个长连接后,获知该PHP文件已经运行完毕?(这样重新运行.bat或者DOS进行断点下载)

PS:网上只有115上传类的代码,木有下载类的代码,大虾们帮忙挑战一下,可能的话,就是原创+精华帖,可以拿到CSDN博客里。

分享到:


------解决方案--------------------
忽略掉你其他的内容,只问一句:
既然打算用命令行,为何还要php加载curl?直接用curl.exe不就可以了么?
------解决方案--------------------
我跟你说说续传的原理,你自己想想能不能完成吧

http续传,少不了http请求头参数
Range:bytes=aaaa-bbbb/cccc
响应头也一定有 Content-Length
aaaa为开始位置,bbbb为结束位置,cccc是文件长度

多线程其实就是把文件切片了,发送N个请求,每个aaaa和bbbb指向不同的段,然后拼接
续传就是把aaaa设在已写入硬盘的文件的位置,继续下载
多线程+续传,一般需要一个记录,记下每个切片的完成位置,等等
所以续传必须满足三方:客户端能发送range,proxy是连接机制而不是转发机制,服务器能接受range请求

如果你用工具下载,一般,工具不会考虑太多,记录文件必然对应一个url和一个本地文件
当url改变时,工具很难“智能”地选择之前的记录文件去确认已下载部分
另一方面如果多线程不是采用预写硬盘的方式就更麻烦了

自己写个socket或者能做到

另外,/M00/07/9C/d5NjH05TqRMAAAAAF2WEJGZScDk3421731/ 这样的路径,凭经验基本可以确认是临时路径,服务器对它的处理方式很难预料,删除or禁止访问or……?
------解决方案--------------------
你那个url不支持断点续传!
我贴段测试代码,供你研究。但要达到实用还很要花点功夫
$url = 'http://blog.51edm.org/content/uploadfile/201303/dc7f1364286796.zip';
function curl_get($durl) {
$cookiejar = realpath('cookie.txt');
$t = parse_url($durl);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$durl);
// curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RANGE, '0-300'); //从 0 偏移起取 301 的字节
// curl_setopt($ch, CURLOPT_NOBODY, 1);

curl_setopt($ch, CURLOPT_TIMEOUT,5);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_REFERER, "http://$t[host]/");
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'head_func');
curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function");
$r = curl_exec($ch);
curl_close($ch);
return $r;
}
echo '';<br /> curl_get($url);<br /> <br /> //回调函数 $str 为读到的内容<br /> function progress_function($ch,$str) {<br /> //print_r(curl_getinfo($ch));<br /> echo PHP_EOL, strlen($str);//,':',substr($str,0,20);<br /> return strlen($str);<br /> }<br /> //回调函数,用于获得头信息<br /> function head_func($ch, $str) {<br /> echo $str;<br /> return strlen($str);<br /> }<br /> </pre><br /> 头信息中类似<br /> Content-Length: 301 </div> </div> <script type="text/javascript" src="/layui/layui.js"></script> <script> layui.use('code', function(){ layui.code({ elem: 'pre', //默认值为.layui-code about:false, title:'curl可不可以下载115的资源代码块', encode: true //是否转义html标签。默认不开启 }); }); </script> <footer class="comm-footer"> <ul class="channels"> <li> <a target="_top" href="/system/">操作系统</a> </li><li> <a target="_top" href="/down/">程序下载</a> </li><li> <a target="_top" href="/jquery/">jquery插件库</a> </li><li> <a target="_top" href="/jiaoben/">编程</a> </li><li> <a target="_top" href="/db/">数据库</a> </li><li> <a target="_top" href="/tools/">在线工具</a> </li><li> <a target="_top" href="/framebook/">框架书籍</a> </li><li> <a target="_top" href="/xitongjiaocheng/">系统教程</a> </li><li> <a target="_top" href="/ruanjianxiazai/">软件下载</a> </li> </ul> <ul class="versions"> <li> <a href="https://m.gxlcms.com" class="active">触屏版</a> </li> <li> <a href="https://www.gxlcms.com" target="_top">电脑版</a> </li> </ul> <p><a href="https://beian.miit.gov.cn/" target="_blank" style="color:#ffffff"></a><script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?6c9b8cea1903c9f813f150c04aeebc3c"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script></p> </footer> </body> </html>