m3u8去广告.json 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. 量子非凡暴风去广告2024年5月最新代码:
  2. <?php
  3. //关闭所有PHP错误报告
  4. error_reporting(0);
  5. //是否缓存视频链接 1 缓存 0 不缓存
  6. define('IFHC',1);
  7. //缓存保存的文件夹 如果不缓存请无视
  8. if(strstr($_GET['url'],'ffzy')){$mulu="/m3u8_chace/F/";}//非凡缓存目
  9. if(strstr($_GET['url'],'lz-cdn')){$mulu="/m3u8_chace/L/";}//量子缓存目录
  10. if(strstr($_GET['url'],'cdnlz')){$mulu="/m3u8_chace/L/";}//量子缓存目录
  11. if(strstr($_GET['url'],'bfeng')){$mulu="/m3u8_chace/B/";}//暴风缓存目录
  12. if($mulu == ''){$mulu="/m3u8_chace/m3u8/";}//其他缓存目录
  13. //如果目录地址为空,默认保存在目录中
  14. define('HCFILE',__DIR__.$mulu);
  15. //缓存时效 秒为单位 如果不缓存请无视
  16. define('HCTIME',86400);
  17. //设置编码
  18. header('Content-type: text/json;charset=utf-8');
  19. //开始接收url内容,get方式接收url播放地址
  20. $url = $_GET["url"];
  21. //将url 变量中所有的http替换成https
  22. $url = str_replace('http://','https://',$url);
  23. //存储从目标 URL 获取到的数据。
  24. $DATA = curl($url);
  25. //对 DATA 变量中的内容进行匹配,并将匹配结果存储在 jmurl 数组中。
  26. preg_match('/RESOLUTION=(.*)\n?(.*)/',$DATA,$jmurl);
  27. //将 url 中的 index.m3u8'替换为 jmurl[2] 的值。
  28. $url = str_replace('index.m3u8',$jmurl[2],$url);
  29. //根据 URL 中是否包含特定字符串来确定缓存目录的路径
  30. if(strstr($url, "ffzy")==true){
  31. //根据 URL 计算 MD5 值,并添加 m3u8扩展名作为缓存文件的文件名。
  32. $MD5 = Md5($url).'.m3u8';
  33. //创建缓存目录,设置权限为 0755,如果父目录不存在也会一并创建。
  34. if (is_dir(HCFILE)==false) {
  35. mkdir(HCFILE,0755,true);
  36. }
  37. //检查是否开启了缓存,并且缓存文件是否存在以及缓存文件是否仍然在有效期内。
  38. if (IFHC==1 && file_exists(HCFILE.$MD5) && filemtime(HCFILE.$MD5) + HCTIME > time()) {
  39. //确定当前请求的协议类型(HTTP 或 HTTPS)。
  40. //如果是 HTTPS 请求,那么被赋值为 https,否则被赋值为 http。
  41. $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
  42. //根据传入的参数判断是否包含特定的字符串。
  43. if(strstr($_GET['url'],'ffzy')){$mulu="/m3u8_chace/F/";}//非凡缓存目录
  44. if($mulu == ''){$mulu="/m3u8_chace/m3u8/";}//其他缓存目录
  45. //记录解析 M3U8 文件的时间,并返回解析结果的相关信息。
  46. $t1 = microtime(true);
  47. $t2 = microtime(true);
  48. $arr = array(
  49. 'code' => 200,
  50. 'type' => 'm3u8',
  51. 'url' => $http_type.$_SERVER['HTTP_HOST'].$mulu.$MD5,
  52. 'msg' => '非凡资源解析成功,JSON播放器通过读取url地址进行播放',
  53. );
  54. //输出并终止脚本的执行。将 JSON 字符串输出给前端后,脚本即停止执行,不再执行后续的代码。
  55. die(json_encode($arr,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
  56. }
  57. //检查从 URL 获取的数据是否为空。如果数据为空,它会输出 HTTP 状态码 404 并终止脚本的执行。
  58. $data = curl($url);
  59. if (empty($data)) {
  60. die(404);
  61. }
  62. //判断是否为.m3u8
  63. if(strstr($url, ".m3u8")==true){
  64. echo m3u8ts($url,$MD5,$data,$explode[2]);
  65. }
  66. }
  67. if(strstr($url, "lz-cdn")==true){
  68. $MD5 = Md5($url).'.m3u8';
  69. if (is_dir(HCFILE)==false) {
  70. mkdir(HCFILE,0755,true);
  71. }
  72. if (IFHC==1 && file_exists(HCFILE.$MD5) && filemtime(HCFILE.$MD5) + HCTIME > time()) {
  73. $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
  74. if(strstr($_GET['url'],'lz-cdn')){$mulu="/m3u8_chace/L/";}//量子缓存目录
  75. if($mulu == ''){$mulu="/m3u8_chace/m3u8/";}//其他缓存目录
  76. $arr = array(
  77. 'code' => 200,
  78. 'type' => 'm3u8',
  79. 'url' => $http_type.$_SERVER['HTTP_HOST'].$mulu.$MD5,
  80. 'msg' => '量子资源解析成功,JSON播放器通过读取url地址进行播放',
  81. );
  82. die(json_encode($arr,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
  83. }
  84. $data = curl($url);
  85. if (empty($data)) {
  86. die(404);
  87. }
  88. //判断是否为.m3u8
  89. if(strstr($url, ".m3u8")==true){
  90. echo m3u8ts($url,$MD5,$data,$explode[2]);
  91. }
  92. }
  93. if(strstr($url, "cdnlz")==true){
  94. $MD5 = Md5($url).'.m3u8';
  95. if (is_dir(HCFILE)==false) {
  96. mkdir(HCFILE,0755,true);
  97. }
  98. if (IFHC==1 && file_exists(HCFILE.$MD5) && filemtime(HCFILE.$MD5) + HCTIME > time()) {
  99. $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
  100. if(strstr($_GET['url'],'cdnlz')){$mulu="/m3u8_chace/L/";}//量子缓存目录
  101. if($mulu == ''){$mulu="/m3u8_chace/m3u8/";}//其他缓存目录
  102. $arr = array(
  103. 'code' => 200,
  104. 'type' => 'm3u8',
  105. 'date' => date("Y-m-d H:i:s"),
  106. 'ip' => rand_ip(),
  107. 'url' => $http_type.$_SERVER['HTTP_HOST'].$mulu.$MD5,
  108. 'msg' => '量子资源解析成功,JSON播放器通过读取url地址进行播放',
  109. );
  110. die(json_encode($arr,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
  111. }
  112. $data = curl($url);
  113. if (empty($data)) {
  114. die(404);
  115. }
  116. //判断是否为.m3u8
  117. if(strstr($url, ".m3u8")==true){
  118. echo m3u8ts($url,$MD5,$data,$explode[2]);
  119. }
  120. }
  121. if(strstr($_GET["url"], "bfeng")==true){
  122. $MD5 = Md5($_GET["url"]).'.m3u8';
  123. if (is_dir(HCFILE)==false) {
  124. mkdir(HCFILE,0755,true);
  125. }
  126. if (IFHC==1 && file_exists(HCFILE.$MD5) && filemtime(HCFILE.$MD5) + HCTIME > time()) {
  127. $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
  128. if(strstr($_GET['url'],'bfeng')){$mulu="/m3u8_chace/B/";}//暴风缓存目录
  129. if($mulu == ''){$mulu="/m3u8_chace/m3u8/";}//其他缓存目录
  130. $arr = array(
  131. 'code' => 200,
  132. 'type' => 'm3u8',
  133. 'url' => $http_type.$_SERVER['HTTP_HOST'].$mulu.$MD5,
  134. 'msg' => '暴风资源解析成功!JSON播放器通过读取url地址进行播放',
  135. );
  136. die(json_encode($arr,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
  137. }
  138. $data = curl($_GET["url"]);
  139. if (empty($data)) {
  140. die(404);
  141. }
  142. //判断是否为.m3u8
  143. if(strstr($_GET["url"], ".m3u8")==true){
  144. echo m3u8ts($_GET["url"],$MD5,$data,$explode[2]);
  145. }
  146. }
  147. //如果在url中没有找到包含以上解析的相关关键字,解析将会失败,返回JSON格式的404失败。
  148. //解析失败后,JSON播放器会自动调用下一个备用播放器进行解析,如果你只有一个播放器,而且解析失败后,想通过直链播放,可以将下面的nullurl修改为url
  149. if ($decrypted == false) {
  150. $add['code'] = 404;
  151. $add['ip'] = rand_ip();
  152. $add['url'] =$_GET["url"];
  153. $add["msg"]='解析失败,解析地址为空或服务器无法访问此URL。如果本地M3U8链接可以正常播放,你的解析服务器可能已经被对方屏蔽。';
  154. }
  155. //将404解析失败的错误转换为 JSON 格式,并将其发送给客户端。
  156. echo json_encode($add,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
  157. //对 m3u8 数据进行处理,根据不同条件匹配不同的正则表达式,从而实现对 m3u8 数据的定制化处理。
  158. function m3u8ts($wz , $file , $data , $name){
  159. //替换字符串中匹配特定模式,将匹配到的部分替换为空
  160. $data = preg_replace('/#EXT-X-DISCONTINUITY\n?/',"",$data);
  161. //注意:这里是删除m3u8中切片广告的核心部分,例如量子资源中广告部分是a4d95fd218f0718312.ts结尾数字与m3u8中的数字不是连续的就是广告。
  162. //通过正则匹配删除,前面11个字母+数字的字符,正则表达式是(\d+){11} 后面7位数字的正则是(\d{0,7}) 正则的写法可以在AI中查询。
  163. if(strstr($_GET["url"], "cdnlz")==true){
  164. $data = preg_replace('/[0-9a-z]{11}\d{7}.ts/',"",$data);
  165. }
  166. if(strstr($_GET["url"], "bfeng")==true){
  167. $data = preg_replace('/(\d+){12}(\d{0,9}).ts/',"",$data);
  168. }
  169. if(strstr($_GET["url"], "ffzy")==true){
  170. $data = preg_replace('/(\d+){12}(\d{0,9}).ts/',"",$data);
  171. }
  172. if(strstr($_GET["url"], "lz-cdn")==true){
  173. $data = preg_replace('/[0-9a-z]{11}\d{7}.ts/',"",$data);
  174. }
  175. //如果有其它的资源站删除切片广告,也可以使用这个方法删除。
  176. //下面是重新将切片文件打包过程。
  177. //提取URL部分,保存在$ym变量中
  178. preg_match('/\/\/(.*)\/'.$name.'/',$wz,$ym);
  179. //将上面提取到的URL添加https:和删除原始切片文件名,例如:删除掉index.m3u8 然后将URL保存在$web变量中。
  180. $web = 'https:'.str_replace($name,'', $ym[0]);
  181. //使用正则表达式匹配 $data 字符串中的 #EXTINF 标签行,将其替换为带有新的 URL 地址的 #EXTINF 标签行,并将结果存储在 $m3u8 变量中。
  182. $m3u8 = preg_replace('/#EXTINF:(.*),\n?(.*)\n?/',"#EXTINF:$1,\n$web$2\n",$data);
  183. //将替换后的$m3u8字符串按行拆分为数组,并将结果存储在 $lines 变量中。PHP_EOL 表示换行符
  184. $lines = explode(PHP_EOL, $m3u8);
  185. //初始化变量$last_order
  186. $last_order = -1;
  187. //查找$lines内容,按数字顺序保存名称,将内容保存在$filtered_lines中。
  188. foreach ($lines as $line) {
  189. if (strpos($line, 'http') !== false) {
  190. preg_match('/(\d+)\.ts/', $line, $matches);
  191. $order = intval($matches[1]);
  192. if ($order > $last_order) {
  193. $filtered_lines[] = $line;
  194. $last_order = $order;
  195. }
  196. } else {
  197. $filtered_lines[] = $line;
  198. }
  199. }
  200. //将M3U8的播放列表中特定格式的标签行删除,然后将处理后的结果存储在 $filtered_lines_hc 变量中
  201. //用于删除之前切片广告遗留下来的#EXTINF行,每个起始行的标记都是唯一的,切片广告删除条数多少,#EXTINF起始行后面加上几个#EXTINF
  202. $filtered_lines_hc=implode(PHP_EOL, $filtered_lines);
  203. $filtered_lines_hc=preg_replace('/#EXTINF:6.433333,\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?/',"",$filtered_lines_hc);
  204. $filtered_lines_hc=preg_replace('/#EXTINF:6.666667,\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?/',"",$filtered_lines_hc);
  205. $filtered_lines_hc=preg_replace('/#EXTINF:3,\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?/',"",$filtered_lines_hc);
  206. $filtered_lines_hc=preg_replace('/#EXTINF:4.066667,\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?/',"",$filtered_lines_hc);
  207. $filtered_lines_hc=preg_replace('/#EXTINF:4.12,\n?#EXTINF:(.*),\n?/',"",$filtered_lines_hc);
  208. $filtered_lines_hc=preg_replace('/#EXTINF:4.400000,\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?/',"",$filtered_lines_hc);
  209. $filtered_lines_hc=preg_replace('/#EXTINF:6.400000,\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?/',"",$filtered_lines_hc);
  210. //将经过处理的,打包好的m3u8数据写入到指定的文件中。
  211. file_put_contents(HCFILE.$file, $filtered_lines_hc);
  212. $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
  213. if(strstr($_GET['url'],'ffzy')){$mulu="/m3u8_chace/F/";}//非凡缓存目
  214. if(strstr($_GET['url'],'lz-cdn')){$mulu="/m3u8_chace/L/";}//量子缓存目录
  215. if(strstr($_GET['url'],'cdnlz')){$mulu="/m3u8_chace/L/";}//量子缓存目录
  216. if(strstr($_GET['url'],'bfeng')){$mulu="/m3u8_chace/B/";}//暴风缓存目录
  217. if($mulu == ''){$mulu="/m3u8_chace/m3u8/";}//其他缓存目录
  218. $arr = array(
  219. 'code' => 200,
  220. 'msg' => 'M3U8文件解析成功!',
  221. 'type'=>'m3u8',
  222. 'url' => $http_type.$_SERVER['HTTP_HOST'].$mulu.$file,
  223. );
  224. //输出解析成功的json内容。
  225. die(json_encode($arr,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
  226. return;
  227. }
  228. //执行 HTTP 请求
  229. function curl($url) {
  230. if(!function_exists('curl_init')) die('PHP未安装curl扩展,请安装PHP对应版本的curl扩展!');
  231. $user_agent = $_SERVER['HTTP_USER_AGENT'];
  232. $ch = curl_init();
  233. curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  234. "accept: */*",
  235. "accept-encoding: gzip, deflate",
  236. "accept-language: zh-CN,zh;q=0.9",
  237. "Accept: application/json, text/javascript, */*; q=0.01",
  238. "X-FORWARDED-FOR:".rand_ip(),
  239. "CLIENT-IP:".rand_ip(),
  240. "X-Real-IP:".rand_ip(),
  241. "Connection: keep-alive",
  242. ));
  243. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36');
  244. curl_setopt($ch, CURLOPT_REFERER,'');
  245. curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate");
  246. curl_setopt($ch, CURLOPT_URL, $url);
  247. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  248. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
  249. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  250. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  251. @ $file = curl_exec($ch);
  252. curl_close($ch);
  253. return $file;
  254. }
  255. //生成随机 IP 地址
  256. function rand_ip() {
  257. $ip_long = array(
  258. array('607649792', '608174079'), //36.56.0.0-36.63.255.255
  259. array('975044608', '977272831'), //58.30.0.0-58.63.255.255
  260. array('999751680', '999784447'), //59.151.0.0-59.151.127.255
  261. array('1019346944', '1019478015'), //60.194.0.0-60.195.255.255
  262. array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255
  263. array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255
  264. array('1947009024', '1947074559'), //116.13.0.0-116.13.255.255
  265. array('1987051520', '1988034559'), //118.112.0.0-118.126.255.255
  266. array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255
  267. array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255
  268. array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255
  269. array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255
  270. array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255
  271. array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255
  272. array('-569376768', '-564133889'), //222.16.0.0-222.95.255.255
  273. );
  274. $rand_key = mt_rand(0, 14);
  275. $huoduan_ip= long2ip(mt_rand($ip_long[$rand_key][0], $ip_long[$rand_key][1]));
  276. return $huoduan_ip;
  277. }
  278. 快看去广告代码
  279. 快看资源去广告代码,由于快看资源的m3u8的内部结构和以上的不同,所以重新写了一段针对快看资源的去广告代码。
  280. 下面的代码适用于不使用数字排序的。也可以修改其它切片插播广告的m3u8资源。
  281. <?php
  282. header("Cache-Control: no-cache, must-revalidate");//清理浏览器缓存
  283. header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');//禁止页面被缓存
  284. header("Access-Control-Allow-Headers: x-requested-with,content-type");
  285. header("Access-Control-Allow-Methods: GET, POST");
  286. header("Access-Control-Allow-Origin: *");
  287. header("Cache-Control: no-cache, no-store, max-age=0, must-revalidate");
  288. header("Connection: keep-alive");
  289. header("Transfer-Encoding: chunked");
  290. //关闭所有PHP错误报告
  291. error_reporting(0);
  292. //是否缓存视频链接 1 缓存 0 不缓存
  293. define('IFHC',1);
  294. //缓存保存的文件夹 如果不缓存请无视
  295. if(strstr($_GET['url'],'kuaikan')){$mulu="/m3u8_chace/K/";}//快看缓存目录
  296. if($mulu == ''){$mulu="/m3u8_chace/m3u8/";}//其他缓存目录
  297. //如果目录地址为空,默认保存在目录中
  298. define('HCFILE',__DIR__.$mulu);
  299. //缓存时效 秒为单位 如果不缓存请无视
  300. define('HCTIME',86400);
  301. //设置编码
  302. header('Content-type: text/json;charset=utf-8');
  303. //开始接收url内容,get方式接收url播放地址
  304. $url = $_GET["url"];
  305. //将url 变量中所有的http替换成https
  306. $url = str_replace('http://','https://',$url);
  307. if(strstr($url, "kuaikan")==true){
  308. $MD5 = Md5($url).'.m3u8';
  309. if (is_dir(HCFILE)==false) {
  310. mkdir(HCFILE,0755,true);
  311. }
  312. if (IFHC==1 && file_exists(HCFILE.$MD5) && filemtime(HCFILE.$MD5) + HCTIME > time()) {
  313. $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
  314. if(strstr($_GET['url'],'kuaikan')){$mulu="/m3u8_chace/K/";}//快看缓存目录
  315. if($mulu == ''){$mulu="/m3u8_chace/m3u8/";}//其他缓存目录
  316. $arr = array(
  317. 'code' => 200,
  318. 'type' => 'm3u8',
  319. 'date' => date("Y-m-d H:i:s"),
  320. 'ip' => rand_ip(),
  321. 'url' => $http_type.$_SERVER['HTTP_HOST'].$mulu.$MD5,
  322. 'msg' => '快看资源解析成功,JSON播放器通过读取url地址进行播放',
  323. );
  324. die(json_encode($arr,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
  325. }
  326. $data = curl($url);
  327. if (empty($data)) {
  328. die(404);
  329. }
  330. //判断是否为.m3u8
  331. if(strstr($url, ".m3u8")==true){
  332. echo m3u8ts($url,$MD5,$data,$explode[2]);
  333. }
  334. }
  335. if ($decrypted == false) {
  336. $add['code'] = 404;
  337. $add['ip'] = rand_ip();
  338. $add['nullurl'] =$_GET["url"];
  339. $add["msg"]='解析失败,解析地址为空或服务器无法访问此URL。如果本地M3U8链接可以正常播放,你的解析服务器可能已经被对方屏蔽。';
  340. }
  341. //将404解析失败的错误转换为 JSON 格式,并将其发送给客户端。
  342. echo json_encode($add,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
  343. function m3u8ts($wz , $file , $data , $name){
  344. //通过正则匹配删除
  345. if(strstr($_GET["url"], "kuaikan")==true){
  346. $data = preg_replace('/#EXT-X-DISCONTINUITY\n?/',"",$data);
  347. $data = preg_replace('/#EXT-X-KEY:METHOD=NONE\n?/',"",$data);
  348. $data = preg_replace('/\/(\d{4})(\d{2})(\d{2})\/.{8}\/hls\//',"",$data);
  349. $data = preg_replace('/\/(\d{4})(\d{2})(\d{2})\/.{8}\/10028kb\/hls\/.{8}.ts/',"",$data);
  350. }
  351. //下面是重新将切片文件打包过程。
  352. //提取URL部分,保存在$ym变量中
  353. preg_match('/\/\/(.*)\/'.$name.'/',$wz,$ym);
  354. //将上面提取到的URL添加https:和删除原始切片文件名,例如:删除掉index.m3u8 然后将URL保存在$web变量中。
  355. $web = 'https:'.str_replace($name,'', $ym[0]);
  356. //使用正则表达式匹配 $data 字符串中的 #EXTINF 标签行,将其替换为带有新的 URL 地址的 #EXTINF 标签行,并将结果存储在 $m3u8 变量中。
  357. $m3u8 = preg_replace('/#EXTINF:(.*),\n?(.*)\n?/',"#EXTINF:$1,\n$web$2\n",$data);
  358. //将替换后的$m3u8字符串按行拆分为数组,并将结果存储在 $lines 变量中。PHP_EOL 表示换行符
  359. $lines = explode(PHP_EOL, $m3u8);
  360. //初始化变量$last_order
  361. $last_order = -1;
  362. foreach ($lines as $line) {
  363. if (strpos($line, '.ts') !== false || strpos($line, '#EXT') !== false) {
  364. $filtered_lines[] = $line;
  365. }
  366. }
  367. //将M3U8的播放列表中特定格式的标签行删除,然后将处理后的结果存储在 $filtered_lines_hc 变量中
  368. //用于删除之前切片广告遗留下来的#EXTINF行,每个起始行的标记都是唯一的,切片广告删除条数多少,#EXTINF起始行后面加上几个#EXTINF
  369. $filtered_lines_hc=implode(PHP_EOL, $filtered_lines);
  370. $filtered_lines_hc=preg_replace('/#EXTINF:1.267,\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?#EXTINF:(.*),\n?/',"",$filtered_lines_hc);
  371. //将经过处理的,打包好的m3u8数据写入到指定的文件中。
  372. file_put_contents(HCFILE.$file, $filtered_lines_hc);
  373. $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
  374. if(strstr($_GET['url'],'kuaikan')){$mulu="/m3u8_chace/K/";}//快看缓存目录
  375. if($mulu == ''){$mulu="/m3u8_chace/m3u8/";}//其他缓存目录
  376. $arr = array(
  377. 'code' => 200,
  378. 'msg' => 'M3U8文件解析成功!',
  379. 'type'=>'m3u8',
  380. 'url' => $http_type.$_SERVER['HTTP_HOST'].$mulu.$file,
  381. );
  382. //输出解析成功的json内容。
  383. die(json_encode($arr,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
  384. return;
  385. }
  386. //执行 HTTP 请求
  387. function curl($url) {
  388. if(!function_exists('curl_init')) die('PHP未安装curl扩展,请安装PHP对应版本的curl扩展!');
  389. $user_agent = $_SERVER['HTTP_USER_AGENT'];
  390. $ch = curl_init();
  391. curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  392. "accept: */*",
  393. "accept-encoding: gzip, deflate",
  394. "accept-language: zh-CN,zh;q=0.9",
  395. "Accept: application/json, text/javascript, */*; q=0.01",
  396. "X-FORWARDED-FOR:".rand_ip(),
  397. "CLIENT-IP:".rand_ip(),
  398. "X-Real-IP:".rand_ip(),
  399. "Connection: keep-alive",
  400. ));
  401. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36');
  402. curl_setopt($ch, CURLOPT_REFERER,'');
  403. curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate");
  404. curl_setopt($ch, CURLOPT_URL, $url);
  405. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  406. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
  407. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  408. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  409. @ $file = curl_exec($ch);
  410. curl_close($ch);
  411. return $file;
  412. }
  413. //生成随机 IP 地址
  414. function rand_ip() {
  415. $ip_long = array(
  416. array('607649792', '608174079'), //36.56.0.0-36.63.255.255
  417. array('975044608', '977272831'), //58.30.0.0-58.63.255.255
  418. array('999751680', '999784447'), //59.151.0.0-59.151.127.255
  419. array('1019346944', '1019478015'), //60.194.0.0-60.195.255.255
  420. array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255
  421. array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255
  422. array('1947009024', '1947074559'), //116.13.0.0-116.13.255.255
  423. array('1987051520', '1988034559'), //118.112.0.0-118.126.255.255
  424. array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255
  425. array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255
  426. array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255
  427. array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255
  428. array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255
  429. array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255
  430. array('-569376768', '-564133889'), //222.16.0.0-222.95.255.255
  431. );
  432. $rand_key = mt_rand(0, 14);
  433. $huoduan_ip= long2ip(mt_rand($ip_long[$rand_key][0], $ip_long[$rand_key][1]));
  434. return $huoduan_ip;
  435. }