找回密码
 立即注册
搜索
查看: 224|回复: 7

js切换php

[复制链接]

16

主题

135

回帖

164

积分

彩电迷

积分
164
发表于 2026-1-28 10:35:05 | 显示全部楼层 |阅读模式
悬赏10海贝已解决
云南

function main(item) {
    const id = item.id || 'ynws';

    const channelMap = {
        "ynws": "yunnanweishi",
        "ynds": "yunnandushi",
        "ynyl": "yunnanyule",
        "ynkl": "yunnangonggong",
        "yngj": "yunnanguoji",
        "ynse": "yunnanshaoer"
    };

    const apiUrl = `https://api.yntv.ynradio.com/index/jmd/getRq?name=${channelMap[id]}`;
    const headers = {
        'Referer': 'https://www.yntv.cn/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36'
    };

    // 获取直播凭证
    const res = ku9.request(apiUrl, "GET", headers);
    if (!res.body) return JSON.stringify({});

    try {
        const data = JSON.parse(res.body);
        const liveUrl = `https://tvlive.yntv.cn${data.url}?wsSecret=${data.string}&wsTime=${data.time}`;

        return JSON.stringify({
            url: liveUrl,
            headers: {
                'Referer': 'https://www.yntv.cn/',
                'User-Agent': headers['User-Agent']
            }
        });
    } catch (e) {
        return JSON.stringify({});
    }
}






function main(item) {
    //杭州TV
    const id = item.id || 'hzzh';
    const channelMap = {
        hzzh: [16, 'hztv1'], //杭州综合
        hzmz: [17, 'hztv2'], //西湖明珠
        hzsh: [18, 'hztv3'], //杭州生活
        hzys: [21, 'hztv4'], //杭州影视
        hzqsty: [20, 'hztv5'], //青少体育
        hzds: [22, 'hztv6'], //杭州导视
        fyxwzh: [32, 'fyxwzh'] //富阳新闻综合
    };
    const channelInfo = channelMap[id];
    if (!channelInfo) return { url: 'ID不存在...' };

    const apiUrl = `https://mapi.hoolo.tv/api/v1/channel_detail.php?channel_id=${channelInfo[0]}`;
    const apiRes = ku9.request(apiUrl, 'GET', { Referer: 'https://tv.hoolo.tv/' });
    if (apiRes.code !== 200) return { url: '获取频道信息,Error...' };
    const data = JSON.parse(apiRes.body);
    const m3u8Url = data[0]?.m3u8;
     if (!m3u8Url) return { url: 'm3u8 Error...' };
    const uri = ku9.Uri(m3u8Url);
    const baseUrl = `${uri.Scheme}://${uri.Host}/`;
    const channelPath = `${baseUrl}${channelInfo[1]}/`;

    const liveRes = ku9.request(m3u8Url, 'GET', { Referer: 'https://tv.hoolo.tv/' });
    if (liveRes.code !== 200 || !liveRes.body) return { url: '无法获取数据...' };
    const liveContent = liveRes.body;

    let streamPath;
    if (['hzzh', 'hzmz', 'hzsh'].includes(id)) {
        const hdPos = liveContent.indexOf('hd');
        if (hdPos === -1) return { url: '' };
        streamPath = liveContent.slice(hdPos);
    } else {
        const sdPos = liveContent.indexOf('sd');
        if (sdPos === -1) return { url: '' };
        const sdContent = liveContent.slice(sdPos);
        const extPos = sdContent.indexOf('#EXT');
        streamPath = extPos > -1 ? sdContent.substring(0, extPos) : sdContent;
    }
    const finalUrl = channelPath + streamPath;
    const finalRes = ku9.request(finalUrl, 'GET', { Referer: 'https://tv.hoolo.tv/' });
    if (finalRes.code !== 200 || !finalRes.body) {
        return { url: '' };
    }
    const proxyM3U8 = finalRes.body.replace(/\/(.*?\.ts)/gi, `${baseUrl}$1`);
    return { m3u8: proxyM3U8, headers: { Referer: 'https://tv.hoolo.tv/' }};
}

最佳答案

查看完整内容

云南那个因为你给的apiurl域名我这不可解析,所以就没弄,只给了杭州的php代码

1

主题

98

回帖

117

积分

彩电迷

积分
117
发表于 2026-1-28 10:35:06 | 显示全部楼层
云南那个因为你给的apiurl域名我这不可解析,所以就没弄,只给了杭州的php代码
<?php

function getHangzhouStream($item = []) {
    $id = $item['id'] ?? 'hzzh';
   
    $channelMap = [
        'hzzh' => [16, 'hztv1'],
        'hzmz' => [17, 'hztv2'],
        'hzsh' => [18, 'hztv3'],
        'hzys' => [21, 'hztv4'],
        'hzqsty' => [20, 'hztv5'],
        'hzds' => [22, 'hztv6'],
        'fyxwzh' => [32, 'fyxwzh']
    ];
   
    if (!isset($channelMap[$id])) {
        return ['url' => 'ID不存在...'];
    }
   
    list($channelId, $channelCode) = $channelMap[$id];
   
    $apiUrl = "https://mapi.hoolo.tv/api/v1/channel_detail.php?channel_id={$channelId}";
    $apiRes = httpRequest($apiUrl, 'GET', ['Referer: https://tv.hoolo.tv/']);
   
    if ($apiRes['code'] !== 200) {
        return ['url' => '获取频道信息失败'];
    }
   
    $data = json_decode($apiRes['body'], true);
    if (!isset($data[0]['m3u8'])) {
        return ['url' => 'm3u8字段不存在'];
    }
   
    $m3u8Url = $data[0]['m3u8'];
   
    $liveRes = httpRequest($m3u8Url, 'GET', ['Referer: https://tv.hoolo.tv/']);
    if ($liveRes['code'] !== 200 || empty($liveRes['body'])) {
        return ['url' => '无法获取播放列表'];
    }
   
    $liveContent = $liveRes['body'];
    $streamPath = '';
   
    if (in_array($id, ['hzzh', 'hzmz', 'hzsh'])) {
        $hdPos = strpos($liveContent, 'hd');
        if ($hdPos === false) {
            return ['url' => '未找到HD流'];
        }
        $streamPath = trim(substr($liveContent, $hdPos));
    } else {
        $sdPos = strpos($liveContent, 'sd');
        if ($sdPos === false) {
            return ['url' => '未找到SD流'];
        }
        $sdContent = substr($liveContent, $sdPos);
        $extPos = strpos($sdContent, '#EXT');
        $streamPath = trim($extPos > 0 ? substr($sdContent, 0, $extPos) : $sdContent);
    }
   
    $uri = parse_url($m3u8Url);
    $baseUrl = $uri['scheme'] . '://' . $uri['host'] . '/';
    $channelPath = $baseUrl . $channelCode . '/';
    $finalUrl = $channelPath . $streamPath;
   
    $finalRes = httpRequest($finalUrl, 'GET', ['Referer: https://tv.hoolo.tv/']);
    if ($finalRes['code'] !== 200 || empty($finalRes['body'])) {
        return ['url' => '无法获取最终m3u8内容'];
    }
   
    $scriptUrl = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];
   
    $proxyM3U8 = preg_replace_callback('/\/(.*?\.ts[^\s]*)/i', function($matches) use ($baseUrl, $scriptUrl) {
        $tsUrl = $baseUrl . $matches[1];
        return $scriptUrl . '?ts=' . urlencode($tsUrl);
    }, $finalRes['body']);
   
    return [
        'm3u8' => $proxyM3U8,
        'headers' => ['Referer' => 'https://tv.hoolo.tv/']
    ];
}

function httpRequest($url, $method = 'GET', $headers = []) {
    $ch = curl_init();
   
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
   
    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
   
    $body = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
   
    return ['code' => $code, 'body' => $body];
}

if (isset($_GET['ts'])) {
    $tsUrl = $_GET['ts'];
   
    $tsRes = httpRequest($tsUrl, 'GET', ['Referer: https://tv.hoolo.tv/']);
   
    if ($tsRes['code'] === 200 && !empty($tsRes['body'])) {
        header('Content-Type: video/MP2T');
        header('Content-Length: ' . strlen($tsRes['body']));
        echo $tsRes['body'];
    } else {
        header('HTTP/1.1 404 Not Found');
        echo 'TS file not found';
    }
    exit;
}

$id = $_GET['id'] ?? 'hzzh';
$result = getHangzhouStream(['id' => $id]);

if (!empty($result['m3u8'])) {
    header('Content-Type: application/vnd.apple.mpegurl; charset=utf-8');
    echo $result['m3u8'];
} else {
    header('Content-Type: text/plain; charset=utf-8');
    echo $result['url'] ?? '未知错误';
}

?>

1

主题

98

回帖

117

积分

彩电迷

积分
117
发表于 2026-1-29 00:46:27 | 显示全部楼层
本帖最后由 vtest 于 2026-1-30 20:27 编辑

看了一下官网,api接口域名是yntv-api.yntv.cn然后重新改了下代码代理m3u8和ts,已经可以用了。
<?php

function getYunnanStream($item = []) {
    $id = $item['id'] ?? 'ynws';
   
    $channelMap = [
        'ynws' => 'yunnanweishi',
        'ynds' => 'yunnandushi',
        'ynyl' => 'yunnanyule',
        'ynkl' => 'yunnangonggong',
        'yngj' => 'yunnanguoji',
        'ynse' => 'yunnanshaoer'
    ];
   
    if (!isset($channelMap[$id])) {
        return ['error' => 'ID不存在'];
    }
   
    $channelName = $channelMap[$id];
    //$apiUrl = "https://api.yntv.ynradio.com/index/jmd/getRq?name={$channelName}";
    $apiUrl = "https://yntv-api.yntv.cn/index/jmd/getRq?name={$channelName}";
   
    $headers = [
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Accept: application/json, text/plain, */*',
        'Accept-Language: zh-CN,zh;q=0.9',
        'Origin: https://www.yntv.cn',
        'Referer: https://www.yntv.cn/'
    ];
   
    $apiRes = httpRequest($apiUrl, $headers);
    if (!$apiRes) {
        return ['error' => '获取直播凭证失败'];
    }
   
    $data = json_decode($apiRes, true);
    if (!isset($data['url']) || !isset($data['string']) || !isset($data['time'])) {
        return ['error' => 'API返回数据不完整'];
    }
   
    $liveUrl = "https://tvlive.yntv.cn{$data['url']}?wsSecret={$data['string']}&wsTime={$data['time']}";
   
    $m3u8Content = httpRequest($liveUrl, $headers);
    if (!$m3u8Content) {
        return ['error' => '获取m3u8失败'];
    }
   
    $proxyM3u8 = preg_replace(
        "/(.*?\.ts)/i",
        "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . "?ts=https://tvlive.yntv.cn/live/{$channelName}/$1",
        $m3u8Content
    );
   
    return [
        'success' => true,
        'm3u8' => $proxyM3u8,
        'liveUrl' => $liveUrl
    ];
}

function httpRequest($url, $headers = []) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
   
    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
   
    $result = curl_exec($ch);
    curl_close($ch);
   
    return $result;
}

function proxyTS($tsUrl) {
    $headers = [
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Referer: https://www.yntv.cn/'
    ];
   
    $ch = curl_init($tsUrl);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
   
    header('Content-Type: video/MP2T');
    curl_exec($ch);
    curl_close($ch);
}

if (isset($_GET['ts'])) {
    proxyTS(trim($_GET['ts']));
    exit;
}

$id = $_GET['id'] ?? 'ynws';
$result = getYunnanStream(['id' => $id]);

if (!empty($result['success'])) {
    header('Content-Type: application/vnd.apple.mpegurl; charset=utf-8');
    echo $result['m3u8'];
} else {
    header('Content-Type: text/plain; charset=utf-8');
    echo $result['error'] ?? '未知错误';
}
?>

16

主题

135

回帖

164

积分

彩电迷

积分
164
 楼主| 发表于 2026-1-29 09:42:49 | 显示全部楼层
vtest 发表于 2026-1-29 00:28
云南那个因为你给的apiurl域名我这不可解析,所以就没弄,只给了杭州的php代码
...

收到感谢,我看看

1

主题

98

回帖

117

积分

彩电迷

积分
117
发表于 2026-1-30 02:39:13 | 显示全部楼层
555 发表于 2026-1-29 09:42
收到感谢,我看看

杭州的我测试正常播放。云南接口不可用,不知道json输出是否正确,应该是可以的

1

主题

98

回帖

117

积分

彩电迷

积分
117
发表于 2026-1-30 20:30:03 | 显示全部楼层
555 发表于 2026-1-29 09:42
收到感谢,我看看

重新修改了云南换了官网上的接口地址,两个都可以用了,都是代理m3u8和ts,需要流量。我这测试ok了。
杭州的:
curl -i -L http://127.0.0.1:8080/hangzhoujs.php?id=hzzh
HTTP/1.1 200 OK
Server: nginx/1.29.3
Date: Fri, 30 Jan 2026 12:24:39 GMT
Content-Type: application/vnd.apple.mpegurl; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/8.3.28

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:3659202
#EXT-X-TARGETDURATION:9
#EXTINF:6.884,
http://127.0.0.1:8080/hangzhoujs ... c48cff49c8aff358d96
#EXTINF:9.284,
http://127.0.0.1:8080/hangzhoujs ... 9cdde4e0e1b4ccbe2a8
#EXTINF:4.932,
http://127.0.0.1:8080/hangzhoujs ... a108701cdf84f8efa77

云南的:
curl -i -L http://127.0.0.1:8080/yunnanjs.php?id=ynws
HTTP/1.1 200 OK
Server: nginx/1.29.3
Date: Fri, 30 Jan 2026 12:22:21 GMT
Content-Type: application/vnd.apple.mpegurl; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/8.3.28

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:622118
#EXTINF:5.76,
http://127.0.0.1:8080/yunnanjs.p ... _p308_3126205480.ts
#EXTINF:5.76,
http://127.0.0.1:8080/yunnanjs.p ... _p308_3126211240.ts
#EXTINF:5.76,
http://127.0.0.1:8080/yunnanjs.p ... _p308_3126217000.ts

两个都可以直接播放器正常播放。可以关闭悬赏了

16

主题

135

回帖

164

积分

彩电迷

积分
164
 楼主| 发表于 2026-2-2 11:26:29 | 显示全部楼层
vtest 发表于 2026-1-30 20:30
重新修改了云南换了官网上的接口地址,两个都可以用了,都是代理m3u8和ts,需要流量。我这测试ok了。
杭 ...

不知道怎么关闭

16

主题

135

回帖

164

积分

彩电迷

积分
164
 楼主| 发表于 2026-2-2 11:27:35 | 显示全部楼层
vtest 发表于 2026-1-30 20:30
重新修改了云南换了官网上的接口地址,两个都可以用了,都是代理m3u8和ts,需要流量。我这测试ok了。
杭 ...

好了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋

创办于 2025 年 5 月 5 日

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