找回密码
 注册需人工审核(节假日除外)
搜索
查看: 879|回复: 6

LiveTV聚合程序使用案例

[复制链接]

签到天数: 167 天

[LV.7]炉火纯青

发表于 2024-6-28 11:29:20 | 显示全部楼层 |阅读模式
本帖最后由 gogogo2000 于 2024-7-5 09:43 编辑

程序发布贴: https://www.tvzb.com/thread-3445-1-1.html

关于代理ts流的案例,请看 https://www.tvzb.com/forum.php?m ... 31&fromuid=9158


为了简单说明下聚合程序的使用场景和优点,以下使用 @guoma 大佬发布的看看视频php做案例来演示如何修改php以完全利用livetv来方便的观看直播
说明:
为了保护guoma大佬的劳动成果,以下php中部分代码被替换删除,完整代码请到原贴:https://www.tvzb.com/thread-3347-1-2.html 查看。

php源代码:
  1. <?php
  2. error_reporting(0);
  3. $id = $_GET['id']??'dfws';
  4. $n = [
  5.      'dfws' => 1, //东方卫视
  6.      'shxwzh' => 2, //上海新闻综合
  7.      'shics' => 3, //上海ics
  8.      'shds' => 4, //上海都市
  9.      'dycj' => 5, //第1财 经
  10.      'jsrw' => 6, //上海纪实人文
  11.      'hhxd' => 9, //哈哈炫动
  12.      ];
  13. $date = date('Y-m-d');
  14. $t = time();
  15. $nonce = getnonce(8);
  16. $sign = md5(md5("Api-Version=v1&channel_id={$n[$id]}&date={$date}&nonce={$nonce}&platform=pc&timestamp={$t}&version=v2.9.4&28c8edde3d61a0411511d3b1866f0636"));
  17. $h = [
  18.         "api-version: v1",
  19.         "nonce:$nonce",
  20.         "m-uuid: p8SxKgKBySMALI6mGICre",
  21.         "platform:pc",
  22.         "version:v2.9.4",
  23.         "timestamp:$t",
  24.         "referer: https://live.kankanews.com/",
  25.         "sign:$sign",
  26.         ];

  27. $json = json_decode(get("https://kapi.kankanews.com/content/pc/tv/programs?channel_id={$n[$id]}&date=".$date,$h)) -> result -> programs;
  28. for($i=0;$i < count($json);$i++){
  29.   if($json[$i] -> start_time < $t && $t < $json[$i] -> end_time)
  30.    $iid = $json[$i] -> id;
  31.   }

  32. $sign1 = md5(md5("Api-Version=v1&channel_program_id={$iid}&nonce={$nonce}&platform=pc&timestamp={$t}&version=v2.9.4&28c8edde3d61a0411511d3b1866f0636"));
  33. array_pop($h);
  34. $h[] = "sign:" .$sign1;
  35. $encrypted = json_decode(get("https://kapi.kankanews.com/content/pc/tv/program/detail?channel_program_id=".$iid,$h)) -> result -> channel_info -> live_address;

  36. //RSA公钥
  37. $public_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 请到原贴查看 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  38. $pu_key = openssl_pkey_get_public($public_key);

  39. $key_len = openssl_pkey_get_details($pu_key)['bits'];
  40. $decrypted= "";
  41. $part_len = $key_len / 8;
  42. $parts = str_split(base64_decode($encrypted), $part_len);

  43. foreach ($parts as $part) {
  44.         $decrypted_temp = '';
  45.         openssl_public_decrypt($part, $decrypted_temp, $pu_key);
  46.         $decrypted .= $decrypted_temp;
  47.         }

  48. if($id=='shds'||$id=='hhxd') {
  49.       $playurl = strstr(m3u8($decrypted),'https');
  50.       header('location:'.$playurl);
  51.       //echo $playurl;
  52.       } else {
  53.         $burl =  dirname($decrypted).'/';
  54.         $playurl = preg_replace("/(.*?.ts)/i",$burl."$1",m3u8($decrypted));
  55.         header('Content-Type: application/vnd.apple.mpegurl');
  56.         header('location:'.$playurl);
  57.         print_r($playurl);
  58.         }
  59. function get($url,$header){
  60.    $ch = curl_init($url);
  61.    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  62.    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  63.    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  64.    curl_setopt($ch, CURLOPT_REFERER, 'https://live.kankanews.com/');
  65.    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  66.    $d = curl_exec($ch);
  67.    curl_close($ch);
  68.    return $d;
  69.    }
  70. function m3u8($url){
  71.    $ch = curl_init($url);
  72.    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  73.    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  74.    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  75.    curl_setopt($ch, CURLOPT_REFERER, 'https://live.kankanews.com/');
  76.    $d = curl_exec($ch);
  77.    curl_close($ch);
  78.    return $d;
  79.    }
  80. function getnonce($length) {
  81.     $base36 = base_convert(mt_rand()/mt_getrandmax(), 10, 36);
  82.     return substr($base36, -$length);
  83. }
  84. ?>
复制代码
在此脚本中,由于看看对播放列表进行了referer校验,所以返回的m3u8是无法被播放器直接播放的,因此php通过返回一个修改过的m3u8,让最终的播放地址指向了php脚本本身。
脚本再通过仿造header来获得m3u8并推送给播放器。

此php脚本的问题在于每次访问m3u8时,都需要通过看看的api来重新解析一份m3u8,但事实上m3u8存在一个有效期,在有效期内并不需要重新解析。
我们对脚本进行一下修改:
  1. <?php
  2. error_reporting(0);
  3. $id = $_GET['id'] ?? 'dfws';
  4. $n = [
  5.         'dfws' => 1, //东方卫视
  6.         'shxwzh' => 2, //上海新闻综合
  7.         'shics' => 3, //上海ics
  8.         'shds' => 4, //上海都市
  9.         'dycj' => 5, //第1财 经
  10.         'jsrw' => 6, //上海纪实人文
  11.         'hhxd' => 9, //哈哈炫动
  12. ];
  13. $date = date('Y-m-d');
  14. $t = time();
  15. $nonce = getnonce(8);
  16. $sign = md5(md5("Api-Version=v1&channel_id={$n[$id]}&date={$date}&nonce={$nonce}&platform=pc&timestamp={$t}&version=v2.9.4&28c8edde3d61a0411511d3b1866f0636"));
  17. $h = [
  18.         "api-version: v1",
  19.         "nonce:$nonce",
  20.         "m-uuid: p8SxKgKBySMALI6mGICre",
  21.         "platform:pc",
  22.         "version:v2.9.4",
  23.         "timestamp:$t",
  24.         "referer: https://live.kankanews.com/",
  25.         "sign:$sign",
  26. ];

  27. $json = json_decode(get("https://kapi.kankanews.com/content/pc/tv/programs?channel_id={$n[$id]}&date=" . $date, $h))->result->programs;
  28. for ($i = 0; $i < count($json); $i++) {
  29.         if ($json[$i]->start_time < $t && $t < $json[$i]->end_time)
  30.                 $iid = $json[$i]->id;
  31. }

  32. $sign1 = md5(md5("Api-Version=v1&channel_program_id={$iid}&nonce={$nonce}&platform=pc&timestamp={$t}&version=v2.9.4&28c8edde3d61a0411511d3b1866f0636"));
  33. array_pop($h);
  34. $h[] = "sign:" . $sign1;
  35. $encrypted = json_decode(get("https://kapi.kankanews.com/content/pc/tv/program/detail?channel_program_id=" . $iid, $h))->result->channel_info->live_address;

  36. //RSA公钥
  37. $public_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 请到原贴查看 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  38. $pu_key = openssl_pkey_get_public($public_key);

  39. $key_len = openssl_pkey_get_details($pu_key)['bits'];
  40. $decrypted = "";
  41. $part_len = $key_len / 8;
  42. $parts = str_split(base64_decode($encrypted), $part_len);

  43. foreach ($parts as $part) {
  44.         $decrypted_temp = '';
  45.         openssl_public_decrypt($part, $decrypted_temp, $pu_key);
  46.         $decrypted .= $decrypted_temp;
  47. }

  48. // 这里直接通过location返回播放地址即可
  49. header('location:' . $decrypted);
  50. // 返回一个json,告诉livetv在访问m3u8时,需要模拟referer
  51. echo json_encode([
  52.         "headers"=> [
  53.                 "Referer" => "https://live.kankanews.com/",
  54.         ]
  55. ]);

  56. function get($url, $header)
  57. {
  58.         $ch = curl_init($url);
  59.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  60.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  61.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  62.         curl_setopt($ch, CURLOPT_REFERER, 'https://live.kankanews.com/');
  63.         curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  64.         $d = curl_exec($ch);
  65.         curl_close($ch);
  66.         return $d;
  67. }
  68. function m3u8($url)
  69. {
  70.         $ch = curl_init($url);
  71.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  72.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  73.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  74.         curl_setopt($ch, CURLOPT_REFERER, 'https://live.kankanews.com/');
  75.         $d = curl_exec($ch);
  76.         curl_close($ch);
  77.         return $d;
  78. }
  79. function getnonce($length)
  80. {
  81.         $base36 = base_convert(mt_rand() / mt_getrandmax(), 10, 36);
  82.         return substr($base36, -$length);
  83. }
复制代码



在livetv中新建频道,如下:


通过vlc播放生成的地址:


顺利播放


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册需人工审核(节假日除外)

×

人生没有彩排,每天都是直播。

Welcome to iptv.cc !

回复

使用道具 举报

签到天数: 128 天

[LV.7]炉火纯青

发表于 2024-6-28 11:33:04 | 显示全部楼层

人生没有彩排,每天都是直播。

Welcome to iptv.cc !

回复

使用道具 举报

签到天数: 284 天

[LV.8]自成一派

发表于 2024-6-28 11:41:48 | 显示全部楼层
可以的,教程

人生没有彩排,每天都是直播。

Welcome to iptv.cc !

回复

使用道具 举报

签到天数: 203 天

[LV.7]炉火纯青

发表于 2024-6-28 12:41:21 来自手机 | 显示全部楼层
本帖最后由 2353027474 于 2024-7-2 23:51 编辑

如果是ts呢?比如论坛里的山东地方代理

人生没有彩排,每天都是直播。

Welcome to iptv.cc !

回复

使用道具 举报

该用户从未签到

发表于 2024-7-5 09:10:46 来自手机 | 显示全部楼层
感谢教学

人生没有彩排,每天都是直播。

Welcome to iptv.cc !

回复

使用道具 举报

签到天数: 167 天

[LV.7]炉火纯青

 楼主| 发表于 2024-7-5 09:34:14 | 显示全部楼层
2353027474 发表于 2024-6-28 12:41
如果是ts呢?比如论坛里的山东地方代理

按照主贴的教学改成直接使用location提供m3u8,并勾选proxy stream即可。
不需要php自己的ts代理功能。

人生没有彩排,每天都是直播。

Welcome to iptv.cc !

回复

使用道具 举报

签到天数: 167 天

[LV.7]炉火纯青

 楼主| 发表于 2024-7-5 09:42:51 | 显示全部楼层
以  https://www.tvzb.com/thread-3515-1-1.html 为例,该脚本最后返回的是一个url地址,需要自己去实现ts代理,并且官方的ts存在头部验证,就可以这样改:
原始代码:
  1. echo get_url($id);
复制代码

修改后的代码:
  1. header("Location: ".get_url($id));
  2. // 返回一个json,告诉livetv在访问m3u8时,需要模拟referer
  3. echo json_encode([
  4.         "headers"=> [
  5.                 "Referer" => "https://v.iqilu.com/",
  6.         ]
  7. ]);
复制代码


然后在livetv中添加这个php,解释器选择httpRedirect,并勾选proxy stream。

这样解释器就会跟随这个location跳转,并且代理ts流了

人生没有彩排,每天都是直播。

Welcome to iptv.cc !

回复

使用道具 举报

本版积分规则

Archiver|手机版|小黑屋|IPTV论坛 | 管理员邮箱:a@8494.net

本站以兴趣爱好为宗旨,非经营性质,不以任何形式收取任何费用。IPTV论坛没有任何官方Q群,V群,T群,禁止留任何联系方式,请配合。

免责声明:本站上述内容来自网络,不得用于商业或非法用途,您必须在下载后24小时内,从设备中删除,否则后果自负。如内容侵犯您的版权、著作权,请联系我,第一时间处理。

GMT+8, 2025-1-31 13:59 , Processed in 0.100923 second(s), 19 queries .

IPTV论坛 创建于 2023年5月1日

快速回复 返回顶部 返回列表