PHP文件/视频中转/代理/在线播放代码,支持断点续传

      发布在:源码分享      评论:2 条评论

作用:做为文件下载/视频播放时的中转/代理服务器。
使用方法:访问该php,出现网址输入框,粘贴网址到输入框,点击“下载”或者“播放”即可。

源代码下载:d.php(3.52 KB)

相关帖子:https://hu60.net/q.php/bbs.topic.85435.html

这个程序不会向你的空间写入任何文件,它是把内容一块一块的从服务器读取到内存然后直接发送给你的,因此可以支持大于虚拟主机空间的任意文件。

文件下载时支持断点续传,视频播放时支持拖动进度条。

对m3u8视频不起作用,因为m3u8只是视频的播放列表,真正的视频还是会去原来的地址获取。

备注:如果复制代码后得到500错误,请删除最开头多余的空白,保证EOF;标记前面没有任何别的内容。建议通过上面的链接下载代码。

代码修改自proxy.php。
如果无法用于某些 https 网站,请修改第44行的ssltls

  1. <?php
  2. @error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
  3. @ignore_user_abort(0);
  4. @set_time_limit(0);
  5. 
    
  6. $url = trim($_GET['url']);
  7. $play = (bool)$_GET['play'];
  8. 
    
  9. if ($play && !empty($url)) {
  10.     $url = urlencode($url);
  11.     header('Content-Type: text/html; charset=utf-8');
  12.     echo <<<EOF
  13. <!doctype html>
  14. <html>
  15. <head>
  16.     <meta charset="utf-8">
  17.     <title>视频中转</title>
  18.     <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=1">
  19.     <style>
  20.         html, body, video {
  21.             width: 100%;
  22.             height: 100%;
  23.         }
  24.     </style>
  25. </head>
  26. <body>
  27.     <video src="?url=$url" controls>
  28. </body>
  29. </html>
  30. EOF;
  31.     return;
  32. }
  33. 
    
  34. if(!empty($url)) {
  35.     $urlArgs = parse_url($url);
  36. 
    
  37.     $host = $urlArgs['host'];
  38.     $requestUri = $urlArgs['path'];
  39. 
    
  40.     if (isset($urlArgs['query'])) {
  41.         $requestUri .= '?' . $urlArgs['query'];
  42.     }
  43. 
    
  44.     $protocol = ($urlArgs['scheme'] == 'http') ? 'tcp' : 'ssl';
  45.     $port = $urlArgs['port'];
  46. 
    
  47.     if (empty($port)) {
  48.         $port = ($protocol == 'tcp') ? 80 : 443;
  49.     }
  50. 
    
  51.     $header = "{$_SERVER['REQUEST_METHOD']} {$requestUri} HTTP/1.1\r\nHost: {$host}\r\n";
  52. 
    
  53.     unset($_SERVER['HTTP_HOST']);
  54.     $_SERVER['HTTP_CONNECTION'] = 'close';
  55. 
    
  56.     if ($_SERVER['CONTENT_TYPE']) {
  57.         $_SERVER['HTTP_CONTENT_TYPE'] = $_SERVER['CONTENT_TYPE'];
  58.     }
  59. 
    
  60.     foreach ($_SERVER as $x => $v) {
  61.         if (substr($x, 0, 5) !== 'HTTP_') {
  62.             continue;
  63.         }
  64.         $x = strtr(ucwords(strtr(strtolower(substr($x, 5)), '_', ' ')), ' ', '-');
  65.         $header .= "{$x}: {$v}\r\n";
  66.     }
  67. 
    
  68.     $header .= "\r\n";
  69. 
    
  70.     $remote = "{$protocol}://{$host}:{$port}";
  71. 
    
  72.     $context = stream_context_create();
  73.     stream_context_set_option($context, 'ssl', 'verify_host', false);
  74. 
    
  75.     $p = stream_socket_client($remote, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $context);
  76. 
    
  77.     if (!$p) {
  78.         exit;
  79.     }
  80. 
    
  81.     fwrite($p, $header);
  82. 
    
  83.     $pp = fopen('php://input', 'r');
  84. 
    
  85.     while ($pp && !feof($pp)) {
  86.         fwrite($p, fread($pp, 1024));
  87.     }
  88. 
    
  89.     fclose($pp);
  90. 
    
  91.     $header = '';
  92. 
    
  93.     $x = 0;
  94.     $len = false;
  95.     $off = 0;
  96. 
    
  97.     while (!feof($p)) {
  98.         if ($x == 0) {
  99.             $header .= fread($p, 1024);
  100. 
    
  101.             if (($i = strpos($header, "\r\n\r\n")) !== false) {
  102.                 $x = 1;
  103.                 $n = substr($header, $i + 4);
  104.                 $header = substr($header, 0, $i);
  105.                 $header = explode("\r\n", $header);
  106.                 foreach ($header as $m) {
  107.                     if (preg_match('!^\\s*content-length\\s*:!is', $m)) {
  108.                         $len = trim(substr($m, 15));
  109.                     }
  110.                     header($m);
  111.                 }
  112.                 $off = strlen($n);
  113.                 echo $n;
  114.                 flush();
  115.             }
  116.         } else {
  117.             if ($len !== false && $off >= $len) {
  118.                 break;
  119.             }
  120.             $n = fread($p, 1024);
  121.             $off += strlen($n);
  122.             echo $n;
  123.             flush();
  124.         }
  125.     }
  126. 
    
  127.     fclose($p);
  128.     return;
  129. }
  130. 
    
  131. header('Content-Type: text/html; charset=utf-8');
  132. echo <<<EOF
  133. <!doctype html>
  134. <html>
  135. <head>
  136.     <meta charset="utf-8">
  137.     <title>文件中转</title>
  138.     <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=1">
  139. </head>
  140. <body>
  141.     <h1>文件中转</h1>
  142.     <form action="" method="get">
  143.         文件地址:<input name="url">
  144.         <input type="submit" value="下载">
  145.         <input type="submit" value="播放" name="play">
  146.     </form>
  147. </body>
  148. </html>
  149. EOF;
Responses

    加载中...
  1. 很高级啊。

    回复
    • 5258博主

      这都被你看出来了,厉害!!!!

      回复