找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 678|回复: 12

版主“湖北另一个版本加地方台”简化

[复制链接]

9

主题

138

回帖

353

积分

中级会员

积分
353
发表于 2025-12-23 10:00:42 | 显示全部楼层 |阅读模式
本帖最后由 mama1027 于 2025-12-23 18:29 编辑

请你测试:
在$n里增加:     'hbxw' => 'new-hbtv/new-hbgg', //湖北公共新闻
  1. <?php
  2. error_reporting(0);
  3. $n = [
  4.      'hbws' => 'new-hbtv/new-hbws',//湖北卫视
  5.      'hbzh' => 'new-hbtv/new-hbzh', //湖北综合
  6.      'hbjs' => 'new-hbtv/new-hbjs', //湖北经视
  7.      'hbjy' => 'new-hbtv/new-hbjy', //湖北教育
  8.      'hbys' => 'new-hbtv/new-hbys', //湖北影视
  9.      'hbsh' => 'new-hbtv/new-hbsh', //湖北生活
  10.      'hbls' => 'new-hbtv/new-hbls', //垄上频道
  11.      'hszh' => '10200/s10200-huangshitv01', //黄石新闻综合
  12.      'xyzh' => '10125/s10125-news_hd', //襄阳综合
  13.      'xgsh' => '10139/s10139-xg', //孝感生活
  14.      'jzzh' => '10085/s10085-jingzhou-tv01', //荆州新闻综合
  15.      'hgzh' => '10210/s10210-xwzh', //黄冈新闻综合
  16.      'xtzh' => '10141/s10141-xtzh', //仙桃综合
  17.      'tmzh' => '10143/s10143-tmtv-1', //天门综合
  18.      ];
  19. $id = $_GET['id'] ?? 'hbws';
  20. $stream = "https://9hbfm-live21.cjyun.org.cn/{$n[$id]}.m3u8";
  21. $p = fetch_channel_info($stream)['url'];
  22. $burl = dirname($p)."/";
  23. $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http';
  24. $php = $protocol . '://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
  25. $ts = $_GET['ts'];
  26. if(empty($ts)) {
  27.         header('Content-Type: application/vnd.apple.mpegurl');
  28.         print_r(preg_replace("/(.*?.ts)/i",$php."?ts=$burl$1",get($p)));
  29. } else {
  30.         $data = get($ts);
  31.         header('Content-Type: video/MP2T');
  32.         echo $data;
  33. }

  34. function fetch_channel_info($stream_url) {
  35.         $client_info = get_cookies(['client-id', 'aa-look', 'client-token', 'acw_tc']);
  36.         send_ws_heartbeat($client_info);
  37.         $cookie_str = build_cookie_str($client_info);
  38.         $api_url = "https://m.hbtv.com.cn/get_cdn_9hbfm?url=$stream_url&client-id=" . $client_info['client-id'];
  39.         $response = get($api_url);
  40.         $data = json_decode($response, true);
  41.         $client_info['url'] = $data['data'];
  42.         return $client_info;
  43. }
  44. function get($url) {
  45.         $ch = curl_init($url);
  46.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  47.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  48.         curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
  49.         curl_setopt($ch, CURLOPT_REFERER, 'https://m.hbtv.com.cn/');
  50.         $response = curl_exec($ch);
  51.         return $response;
  52. }
  53. function get_cookies($cookie_names) {
  54.         $ch = curl_init('https://m.hbtv.com.cn/9hbfmtv');
  55.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  56.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  57.         curl_setopt($ch, CURLOPT_COOKIEFILE, '');
  58.         curl_exec($ch);
  59.         $cookie_list = curl_getinfo($ch, CURLINFO_COOKIELIST);
  60.         curl_close($ch);
  61.         $result = [];
  62.         foreach ($cookie_names as $name) {
  63.                 foreach ($cookie_list as $cookie) {
  64.                         if (strpos($cookie, $name) !== false) {
  65.                                 preg_match("/$name\s+(.+)/", $cookie, $matches);
  66.                                 $result[$name] = $matches[1];
  67.                                 break;
  68.                         }
  69.                 }
  70.         }
  71.         return $result;
  72. }
  73. function build_cookie_str($cookies) {
  74.         $parts = [];
  75.         foreach ($cookies as $key => $value) {
  76.                 $parts[] = "$key=$value";
  77.         }
  78.         return implode('; ', $parts);
  79. }
  80. function send_ws_heartbeat($client_info) {
  81.         $ws = new NetTCP('wss://remote-wa.cjyun.org.cn/liveweb', [
  82.                     'Upgrade' => 'websocket',
  83.                     'Origin' => 'https://m.hbtv.com.cn',
  84.                 ]);
  85.         $ws->send(json_encode([
  86.                     'client_id' => $client_info['client-id'],
  87.                     'aa_look' => $client_info['aa-look'],
  88.                     'client_token' => $client_info['client-token'],
  89.                 ]));
  90. }
  91. class NetTCP {
  92.         private $socket = null;
  93.         private $options = ['timeout' => 5];
  94.         public function __construct($socket_uri = null, $headers = null) {
  95.                 $this->socket_uri = $socket_uri;
  96.                 $this->options['headers'] = $headers;
  97.                 $this->connect();
  98.         }
  99.         public function __destruct() {
  100.                 if ($this->socket) fclose($this->socket);
  101.         }
  102.         public function send($payload) {
  103.                 $payload_chunks = str_split($payload, 4096);
  104.                 $frame_opcode = 'text';
  105.                 foreach ($payload_chunks as $index => $chunk) {
  106.                         $final = $index == count($payload_chunks) - 1;
  107.                         $this->sendFragment($final, $chunk, $frame_opcode, true);
  108.                         $frame_opcode = 'continuation';
  109.                 }
  110.         }
  111.         private function connect() {
  112.                 $parts = parse_url($this->socket_uri);
  113.                 $host = $parts['host'];
  114.                 $port = $parts['port'] ?? ($parts['scheme'] === 'wss' ? 443 : 80);
  115.                 $path = $parts['path'] ?? '/';
  116.                 $this->socket = @stream_socket_client(
  117.                             ($parts['scheme'] === 'wss' ? 'ssl://' : 'tcp://') . "{$host}:{$port}",
  118.                             $errno, $errstr, $this->options['timeout'], STREAM_CLIENT_CONNECT);
  119.                 $key = base64_encode(random_bytes(16));
  120.                 $headers = [
  121.                             'Host' => "{$host}:{$port}",
  122.                             'Connection' => 'Upgrade',
  123.                             'Upgrade' => 'websocket',
  124.                             'Sec-WebSocket-Key' => $key,
  125.                             'Sec-WebSocket-Version' => '13'
  126.                         ];
  127.                 $headers = array_merge($headers, $this->options['headers']);
  128.                 $header = "GET {$path} HTTP/1.1\r\n";
  129.                 foreach ($headers as $name => $value) {
  130.                         $header .= "{$name}: {$value}\r\n";
  131.                 }
  132.                 $header .= "\r\n";
  133.                 @fwrite($this->socket, $header);
  134.                 @stream_get_line($this->socket, 1024, "\r\n\r\n");
  135.         }
  136.         private function sendFragment($final, $payload, $opcode, $masked) {
  137.                 $opcodes = [
  138.                             'continuation' => 0,
  139.                             'text' => 1,
  140.                             'binary' => 2,
  141.                             'close' => 8,
  142.                             'ping' => 9,
  143.                             'pong' => 10,
  144.                         ];
  145.                 $byte_1 = $final ? 0b10000000 : 0b00000000;
  146.                 $byte_1 |= $opcodes[$opcode];
  147.                 $data = pack('C', $byte_1);
  148.                 $byte_2 = $masked ? 0b10000000 : 0b00000000;
  149.                 $payload_length = strlen($payload);
  150.                 if ($payload_length > 65535) {
  151.                         $data .= pack('C', $byte_2 | 0b01111111);
  152.                         $data .= pack('J', $payload_length);
  153.                 } elseif ($payload_length > 125) {
  154.                         $data .= pack('C', $byte_2 | 0b01111110);
  155.                         $data .= pack('n', $payload_length);
  156.                 } else {
  157.                         $data .= pack('C', $byte_2 | $payload_length);
  158.                 }
  159.                 if ($masked) {
  160.                         $mask = random_bytes(4);
  161.                         $data .= $mask;
  162.                         for ($i = 0; $i < $payload_length; $i++) {
  163.                                 $data .= $payload[$i] ^ $mask[$i % 4];
  164.                         }
  165.                 } else {
  166.                         $data .= $payload;
  167.                 }
  168.                 @fwrite($this->socket, $data);
  169.         }
  170. }
复制代码

点评

不错(*≧∪≦)👍🏻  发表于 2025-12-23 11:02

0

主题

36

回帖

267

积分

中级会员

积分
267
发表于 2025-12-23 10:24:17 | 显示全部楼层
感谢分享

2

主题

134

回帖

1112

积分

金牌会员

积分
1112
发表于 2025-12-23 10:34:20 | 显示全部楼层
感谢大佬分享改进版

0

主题

13

回帖

38

积分

新手上路

积分
38
发表于 2025-12-23 10:35:43 | 显示全部楼层
大佬你的dsk不开了吗

9

主题

138

回帖

353

积分

中级会员

积分
353
 楼主| 发表于 2025-12-23 11:00:08 | 显示全部楼层
271919827 发表于 2025-12-23 10:35
大佬你的dsk不开了吗

可能被合作朋友关闭了。

0

主题

8

回帖

49

积分

新手上路

积分
49
发表于 2025-12-23 11:30:41 | 显示全部楼层
这个要跑服务器流量么?

0

主题

21

回帖

51

积分

注册会员

积分
51
发表于 2025-12-23 17:15:55 来自手机 | 显示全部楼层
jey2008 发表于 2025-12-23 11:30
这个要跑服务器流量么?

要的

1

主题

74

回帖

478

积分

中级会员

积分
478
发表于 2025-12-23 18:21:31 来自手机 | 显示全部楼层
感觉缓存还是有必要加的,每次重新获取切片,都要重新请求接口地址,感觉可以加缓存减轻官方服务器压力的哎

9

主题

138

回帖

353

积分

中级会员

积分
353
 楼主| 发表于 2025-12-23 18:50:21 | 显示全部楼层
asyph 发表于 2025-12-23 18:21
感觉缓存还是有必要加的,每次重新获取切片,都要重新请求接口地址,感觉可以加缓存减轻官方服务器压力的哎 ...

湖北电视台线路有效时间并不长,缓存没必要,而且播放切片仍然要官方服务器运行。

17

主题

352

回帖

1887

积分

金牌会员

积分
1887
发表于 2025-12-27 07:28:07 | 显示全部楼层
感谢大佬分享改进版
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋| 吾看

GMT+8, 2026-5-15 04:14 Powered by Discuz! X3.5

本站以兴趣爱好为宗旨,非经营性质,不以任何形式收取任何费用,请勿相信一切有偿信息。 免责声明:本站上述内容来自网络,不得用于商业或非法用途,您必须在下载后24小时内,从设备中删除,否则后果自负。如内容侵犯您的版权、著作权,请联系我,第一时间处理。