当前位置:Gxlcms > PHP教程 > curl能否下载115的资源

curl能否下载115的资源

时间:2021-07-01 10:21:17 帮助过:9人阅读

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不就可以了么?

你先给出下载地址,这样才能有鉴别

你先给出下载地址,这样才能有鉴别
感谢老大,贴个下载地址,U2的专辑
http://119.147.99.31/gdown_group121/M00/07/9C/d5NjH05TqRMAAAAAF2WEJGZScDk3421731/2009_-_No_Line_On_The_Horizon.rar?k=1zD-fJeIwQDpOh4kUbL9IA&t=1368286814&u=1562790934-355643028-ckf4okro&s=51200&file=2009_-_No_Line_On_The_Horizon.rar

&t=1368286814 ,那个好像就是验证时间。信息。

我跟你说说续传的原理,你自己想想能不能完成吧

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……?

curl 有 CURLOPT_RANGE 属性,完全可以实现断点续传

只不过昨晚还可以返回
[0] => HTTP/1.1 200 OK
[Server] => nginx
[Date] => Sat, 11 May 2013 15:23:43 GMT
[Content-Type] => application/octet-stream
[Content-Length] => 392528932
[Last-Modified] => Tue, 23 Aug 2011 13:20:19 GMT
[Connection] => close
[Content-Disposition] => attachment
[Accept-Ranges] => bytes
今天就只能返回
[0] => HTTP/1.1 403 Forbidden
[Server] => nginx
[Date] => Sun, 12 May 2013 03:20:32 GMT
[Content-Type] => text/html
[Content-Length] => 4923
[Connection] => close

于是这能放弃了
等你找到其他可测试的url时再做

curl 有 CURLOPT_RANGE 属性,完全可以实现断点续传
于是这能放弃了
等你找到其他可测试的url时再做

天,那个URL隔几个小时就变换掉了。一次一次的张贴,太麻烦了。

http://119.147.99.31/gdown_group121/M00/07/9C/d5NjH05TqRMAAAAAF2WEJGZScDk3421731/2009_-_No_Line_On_The_Horizon.rar?k=UlqeD7YQ3hi-tkpdRMXvvA&t=1368352262&u=1562790755-355643028-ckf4okro&s=51200&file=2009_-_No_Line_On_The_Horizon.rar

老大,依照你的经验,写一个大致的运行代码,我自己测试吧,谢谢。
测试以后,我把结果再贴出来。

你那个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 '';curl_get($url);//回调函数 $str 为读到的内容function progress_function($ch,$str) {//print_r(curl_getinfo($ch));    echo PHP_EOL, strlen($str);//,':',substr($str,0,20);    return strlen($str);}//回调函数,用于获得头信息function head_func($ch, $str) {echo $str;    return strlen($str);}</pre>  <br /> 头信息中类似  <br /> Content-Length: 301  <br /> Content-Range: bytes 0-300/1806285  <br /> 这样的玩意就很有用了(不支持断点续传的就没有这个,比如 http://bbs.csdn.net/topics/390455233) </p> <p class="sougouAnswer">  你那个url不支持断点续传!  <br /> 我贴段测试代码,供你研究。但要达到实用还很要花点功夫  <br />  <br /> 感谢老大指点,基本原理明白了,自己写了一个程序。  <br />  <br />  <pre class="sycode" name="code">function curl_115($durl,$saveto,$range){	$ch = curl_init();	curl_setopt($ch, CURLOPT_URL, $durl);	curl_setopt($ch, CURLOPT_RANGE, ''.(($range-1)*1024*1024).'-'.($range*1024*1024-1).'');//每次保存10MB	curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 	curl_setopt($ch, CURLOPT_HEADER, 0);	$out = curl_exec($ch);	curl_close($ch);	file_put_contents($saveto, $out, FILE_APPEND);}function check_url_115($durl){	$handle = curl_init($durl);	curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);	curl_setopt($handle, CURLOPT_TIMEOUT,5);	$response = curl_exec($handle);	$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);	curl_close($handle);	return $httpCode;}if(check_url_115($url)=='200'){	curl_115($url,'1.rar',1);}else{	echo '手动更换URL';}</pre>  <br />  <br /> 利用file_put_contents的FILE_APPEND来断点保存文件  <br />  <br /> 有一点不很自信,手动更改$range值,即CURLOPT_RANGE   ''.(($range-1)*1024*1024).'-'.($range*1024*1024-1).'', 这个计算对吗?  <br />  <br /> 按照你的注释,  <br /> 如果$range=1,则 0-1048575 //从 0 偏移起取 1048576 的字节  <br /> 如果$range=2,则 1048576-2097151 //从 1048576 偏移起取到2097152的字节  <br />  <br /> 这样的话,注释里有2个1048576,会不会重复保存导致最后的rar文件被破坏?  <br />  <br />  <br /> 此外 if(check_url_115($url)=='200')  这个判断基本没什么用处,这里还有一个恐怖的问题,即CURLINFO_HTTP_CODE = 200,但下载到一半时URL失效,下一次的CURLOPT_RANGE就不是10M的倍数了。  <br /> 方案一:保守一点$range每改10次,手动跟新一次URL地址。  <br /> 方案二:干脆不要限制10M,利用PHP的filesize(),URL失效后读取保存到硬盘的rar大小,然后再手动设置CURLOPT_RANGE,但是害怕filesize()取出的值真的等于CURLOPT_RANGE重新开始的值吗?这个精确到字节的数字,万一有什么偏移,整个rar还是给毁了。  <br />  <br />  <br /> 望进一步指点,谢谢。  <br />  <br /> </p> <p class="sougouAnswer">  前面 snmr_com 已经讲了,需要保存 文件的位置  <br /> 这一点很重要!  <br />  <br /> 不要简单的利用现有函数,计算偏移是成功的前提  <br /> 覆盖没有关系,错位就事关重大了  <br />  <br /> 你可以用手工或工具下载一个,用程序下载一个。对比两个文件的 md5 就知道程序的正确性了  <br />  <br /> </p> <p class="sougouAnswer">  哦,继续测试中…… </p> <p class="sougouAnswer">  连夜测试,代码可行,但是很费劲,分10MB保存,分了30多次抓取,每次抓取后害怕出错分别备份...关键是这玩意不支持curl multi,要是能支持的话,迅雷就可以搞定,另外下了个115浏览,居然提示非手机注册不支持。  <br /> 花了2天时间,就为了一个U2专辑……  <br />  <br /> 总结:PHP还是做服务器端,60秒内可以搞定的事务;像115下载之类的,还是得交给C类语言编译的软件才是正道。                    </div>

                  

	 	
                    <div class="">
                        <ul class="m-news-opt fix">
                            <li class="opt-item">
                                <a href='/PHPjiqiao-143371.html' target='_blank'><p>< 上一篇</p><p class="ellipsis">如何修改数据库中内容</p></a>
                            </li>
                            <li class="opt-item ta-r">
                                 <a href='/PHPjiqiao-143373.html' target='_blank'><p>下一篇 ></p><p class="ellipsis">php使用jpgraph类生成表报柱状图问题?</p></a>
                            </li>
                        </ul>
                    </div>
                    
                    
                    
                    
                </div>
              
                    </div>
                
                  

                    <div class="g-title fix">
                        <h2 class="title-txt">人气教程排行</h2>
                    </div>
                    <div class="m-rank u-dashed mb40">
			
                        <ul>
						
 <li class="rank-item">
                                <a href="/PHPjiqiao-379253.html" title='php如何获取跳转前的url' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num top">1</span>
                                   php如何获取跳转前的url                                </a>
                            </li>							  								  														  <li class="rank-item">
                                <a href="/PHPjiqiao-379019.html" title='php格林威治时间转换成当前时间的方法' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num second">2</span>
                                   php格林威治时间转换成当前时间的方法                                </a>
                            </li>								  														  								  <li class="rank-item">
                                <a href="/PHPjiqiao-366629.html" title='为什么php不能做大型系统?' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num third">3</span>
                                   为什么php不能做大型系统?                                </a>
                            </li>														  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-207623.html" title='range函数怎么用' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num ">4</span>
                                   range函数怎么用                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-162433.html" title='php中计算页面加载时间几种方法总结_PHP教程' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num ">5</span>
                                   php中计算页面加载时间几种方法总结_PHP教程                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-140221.html" title='求帮助,关于paypal支付返回值修改订单状态' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num ">6</span>
                                   求帮助,关于paypal支付返回值修改订单状态                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-103588.html" title='typecho怎么配置文章内容页?' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num ">7</span>
                                   typecho怎么配置文章内容页?                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-99213.html" title='PhpStorm左侧structure不显示文件的方法列表是这么回事?' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num ">8</span>
                                   PhpStorm左侧structure不显示文件的方法列表是这么回事?                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-92208.html" title='查看PHP的环境变量_PHP' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num ">9</span>
                                   查看PHP的环境变量_PHP                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-170.html" title='PHP Primary script unknown 解决方法总结' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num ">10</span>
                                   PHP Primary script unknown 解决方法总结                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-148.html" title='php的命名空间与自动加载实现方法' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num ">11</span>
                                   php的命名空间与自动加载实现方法                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-133.html" title='解决laravel 出现ajax请求419(unknown status)的问题' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">174次</span>
                                    <span class="g-sort-num ">12</span>
                                   解决laravel 出现ajax请求419(unknown status)的问题                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-462817.html" title='php 如何删除mysql记录' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">173次</span>
                                    <span class="g-sort-num ">13</span>
                                   php 如何删除mysql记录                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-388448.html" title='PHP如何替换数组中的指定元素' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">173次</span>
                                    <span class="g-sort-num ">14</span>
                                   PHP如何替换数组中的指定元素                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-124270.html" title='怎么去除字符串中非汉字、非字母、非数字的字符' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">173次</span>
                                    <span class="g-sort-num ">15</span>
                                   怎么去除字符串中非汉字、非字母、非数字的字符                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-112291.html" title='mysql如何一次执行多条SQL语句' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">173次</span>
                                    <span class="g-sort-num ">16</span>
                                   mysql如何一次执行多条SQL语句                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-110669.html" title='修改header里面的Connection为close解决方法' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">173次</span>
                                    <span class="g-sort-num ">17</span>
                                   修改header里面的Connection为close解决方法                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-153.html" title='PHP基于session.upload_progress 实现文件上传进度显示功能详解' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">173次</span>
                                    <span class="g-sort-num ">18</span>
                                   PHP基于session.upload_progress 实现文件上传进度显示功能详解                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-125.html" title='php5.6.x到php7.0.x特性小结' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">173次</span>
                                    <span class="g-sort-num ">19</span>
                                   php5.6.x到php7.0.x特性小结                                </a>
                            </li>							  								  							<li class="rank-item">
                                <a href="/PHPjiqiao-378118.html" title='php为什么会出现504错误' class="item-name ellipsis" target="_blank">
                                    <span class="g-art-count fr">172次</span>
                                    <span class="g-sort-num ">20</span>
                                   php为什么会出现504错误                                </a>
                            </li>

                        </ul>
                    </div>
                </div>
            </div>
            <!-- / 教程内容页 -->
        </div>
    </div>
  
<!-- 页尾 -->
<div class="footer">
   本站所有资源全部来源于网络,若本站发布的内容侵害到您的隐私或者利益,请联系我们删除!</div>
<!-- / 页尾 -->

 <script type="text/javascript" src="/kan/js/read.js"></script>

<div style="display:none">
<div class="login-box" id="login-dialog">
<div class="login-top"><a class="current" rel="nofollow" id="login1" onclick="setTab('login',1,2);" >登录</a></div>
<div class="login-form" id="nav-signin">
 <!-- <div class="login-ico"><a rel="nofollow" class="qq" id="qqlogin" target="_blank" href="/user-center-qqlogin.html"> QQ </a></div>  -->


<div class="login-box-form" id="con_login_1">
<form id="loginform" action="/user-center-login.html" method="post" onsubmit="return false;">
<p class="int-text">
<input class="email" id="username" name="username" type="text" value="用户名或Email" onfocus="if(this.value=='用户名或Email'){this.value='';}" onblur="if(this.value==''){this.value='用户名或Email';};" ></p>
<p class="int-text">
<input class="password1" type="password" id="password" name="password"  value="******"  onBlur="if(this.value=='') this.value='******';" onFocus="if(this.value=='******') this.value='';" >
</p>
<p class="int-info">
                <label class="ui-label">&nbsp;</label>
                <label for="agreement" class="ui-label-checkbox">
                <input type="checkbox" value="" name="cookietime" id="cookietime" checked="checked" value="2592000">
                <input type="hidden" name="notforward" id="notforward" value="1">
                <input  type="hidden" name="dosubmit" id="dosubmit" value="1">记住我的登录 </label>                           
       <a rel="nofollow" class="aright" href="/user-center-forgetpwd.html" target="_blank"> 忘记密码? </a></p>
  <p class="int-btn"><a rel="nofollow" id="loginbt"  class="loginbtn"><span>登录</span></a></p> 
  </form>
</div>
<form id="regform" action="/user-center-reg.html" method="post">
<div  class="login-reg" style="display: none;" id="con_login_2">
<input type="hidden" name="t" id="t"/>
  <p class="int-text">
    <input  id="email" name="email" type="text" value="Email" onfocus="if(this.value=='Email'){this.value='';}" onblur="if(this.value==''){this.value='Email';};"></p>
    <p class="int-text">
    <input id="uname" name="username" type="text" value="用户名或昵称" onfocus="if(this.value=='用户名或昵称'){this.value='';}" onblur="if(this.value==''){this.value='用户名或昵称';};"></p>
  <p class="int-text">
  <input  type="password" id="pwd" name="password" value="******"  onBlur="if(this.value=='') this.value='******';" onFocus="if(this.value=='******') this.value='';"> </p>
  <p class="int-text1"><span class="inputbox">
    <input id="validate" name="validate" type="text" value="验证码" onfocus="if(this.value=='验证码'){this.value='';}" onblur="if(this.value==''){this.value='验证码';};">
    </span><span class="yzm-img"><img src="/user-checkcode-index" alt="看不清楚换一张"  id="indexlogin"></p>
  <p class="int-info">
    <label>
      <input value="" name="agreement" id="agreement" CHECKED="checked" type="checkbox">
      我已阅读<a rel="nofollow" href="/user-center-agreement.html">用户协议</a>及<a rel="nofollow" href="/user-center-agreement.html">版权声明</a></label>
  </p>
  <p class="int-btn"><input type="hidden" name="dosubmit"/>
<a rel="nofollow" class="loginbtn"  id="register"><span>注册</span></a></p>
</div>
 </form>
</div>
</div>

</div>















</div>
 
<script type="text/javascript" src="/kan/js/foot_js.js"></script>   
<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?6dc1c3c5281cf70f49bc0bc860ec24f2";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>
 <script type="text/javascript" src="/layui/layui.js"></script>
    <script>
    layui.use('code', function() {
        layui.code({
            elem: 'pre', //默认值为.layui-code
            about: false,
            skin: 'notepad',
            title: 'php怎么实现数据库验证跳转代码块',
            encode: true //是否转义html标签。默认不开启
        });
    });
    </script>

</body>

</html>