AI写的,好繁琐……
<?php
/**
* 马鞍山市广播电视台频道播放地址获取器
* 根据频道ID获取相应的播放地址
*/
// 显示所有错误
ini_set('display_errors', 1);
error_reporting(E_ALL);
/**
* 主函数 - 获取频道播放地址
* @param array $item 包含频道参数的数组
* @return array 包含播放地址或错误信息的数组
*/
function main($item) {
// 频道名称映射表
$channelMap = [
"xwzh" => "新闻综合",
"kjsh" => "科教生活",
"masxwlb" => "马鞍山新闻联播"
];
// 获取传入的参数
$inputParam = isset($item['id']) ? $item['id'] :
(isset($item['channel']) ? $item['channel'] :
(isset($item['name']) ? $item['name'] : "xwzh"));
// 根据映射表获取实际的频道名称
$channelName = isset($channelMap[$inputParam]) ? $channelMap[$inputParam] : $inputParam;
// 生成当前时间戳
$timestamp = time() * 1000; // PHP的time()返回秒,JS的getTime()返回毫秒
// API URL
$apiUrl = "https://maanshanxinwenwangzhan.masbcx.cn/json/channel/ds/list.json?_t={$timestamp}&appId=pc-4f11e7ed62b349ef8be0035b283a0d9f&siteId=8b233b99cc134eabb6a9c2965c038118";
try {
// 使用cURL发送请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 忽略SSL证书验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HEADER, true); // 获取响应头
// 设置请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer: https://www.masbcx.cn/',
'Accept-Encoding: gzip, deflate'
]);
// 执行请求
$response = curl_exec($ch);
// 检查请求是否成功
if (curl_errno($ch)) {
throw new Exception('cURL请求失败: ' . curl_error($ch));
}
// 获取响应状态码
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// 获取响应头大小
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
// 分离响应头和响应体
$headers = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);
// 关闭cURL会话
curl_close($ch);
// 检查状态码
if ($httpCode !== 200) {
return ["error" => "请求失败,状态码: {$httpCode}"];
}
// 解析响应头
$responseHeaders = [];
$headerLines = explode("\r\n", $headers);
foreach ($headerLines as $line) {
if (strpos($line, ':') !== false) {
list($key, $value) = explode(':', $line, 2);
$responseHeaders[trim($key)] = trim($value);
}
}
// 检查是否为gzip压缩
$contentEncoding = isset($responseHeaders['Content-Encoding']) ? $responseHeaders['Content-Encoding'] : '';
if (strpos(strtolower($contentEncoding), 'gzip') !== false && function_exists('gzinflate')) {
// 尝试解压gzip内容
try {
// 移除gzip头部
$body = substr($body, 10);
$body = gzinflate($body);
} catch (Exception $e) {
return [
"error" => "解压gzip内容失败: " . $e->getMessage(),
"rawData" => base64_encode($body), // 编码为base64便于传输
"headers" => $responseHeaders
];
}
}
// 尝试解析JSON
$data = json_decode($body, true);
if (json_last_error() !== JSON_ERROR_NONE) {
return [
"error" => "JSON解析失败: " . json_last_error_msg(),
"rawResponse" => substr($body, 0, 100) . "..."
];
}
// 查找频道
$targetChannel = null;
if (isset($data['list']) && is_array($data['list'])) {
foreach ($data['list'] as $listItem) {
if (isset($listItem['data']) && $listItem['data']['title'] === $channelName) {
$targetChannel = $listItem['data'];
break;
}
}
}
if (!$targetChannel) {
// 获取可用频道列表
$availableChannels = [];
if (isset($data['list']) && is_array($data['list'])) {
foreach ($data['list'] as $item) {
if (isset($item['data'])) {
$availableChannels[] = [
"title" => $item['data']['title'] ?? "",
"id" => $item['data']['id'] ?? ""
];
}
}
}
return [
"error" => "未找到频道: {$channelName}",
"availableChannels" => $availableChannels
];
}
// 获取播放地址
$playUrl = isset($targetChannel['otherUrl']) ? $targetChannel['otherUrl'] :
(isset($targetChannel['url']) ? $targetChannel['url'] : "");
if (empty($playUrl)) {
return [
"error" => "频道 {$channelName} 没有播放地址",
"channelInfo" => [
"title" => $targetChannel['title'] ?? "",
"id" => $targetChannel['id'] ?? ""
]
];
}
// 返回播放地址
return [
"url" => $playUrl,
"headers" => [
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer' => 'https://www.masbcx.cn/'
],
"channelInfo" => [
"title" => $targetChannel['title'] ?? "",
"id" => $targetChannel['id'] ?? "",
"inputParam" => $inputParam
]
];
} catch (Exception $error) {
return [
"error" => "请求失败: " . $error->getMessage(),
"inputParam" => $inputParam,
"channelMap" => $channelMap
];
}
}
/**
* 执行主函数并输出结果
*/
function execute_main() {
// 从GET参数获取输入
$item = $_GET;
// 执行主函数
$result = main($item);
// 设置响应头为JSON
header('Content-Type: application/json; charset=utf-8');
// 如果有URL,直接跳转
if (isset($result['url'])) {
// 输出调试信息
if (isset($_GET['debug']) && $_GET['debug'] == 1) {
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit;
}
// 执行跳转
header('Location: ' . $result['url']);
exit;
}
// 输出JSON结果
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit;
}
/**
* 显示使用说明
*/
function show_usage() {
echo "<h2>马鞍山市广播电视台频道播放地址获取器</h2>\n";
echo "<p>使用方法:</p>\n";
echo "<pre>\n";
echo "1. 直接访问:ahmas.php\n";
echo " (默认获取新闻综合频道)\n\n";
echo "2. 指定频道:ahmas.php?id=频道标识\n";
echo " 可用频道标识:\n";
echo " - xwzh: 新闻综合\n";
echo " - kjsh: 科教生活\n";
echo " - masxwlb: 马鞍山新闻联播\n\n";
echo "3. 调试模式:ahmas.php?id=频道标识&debug=1\n";
echo " (显示详细信息而不进行跳转)\n";
echo "</pre>\n";
echo "<p>示例:</p>\n";
echo "<ul>\n";
echo "<li><a href='ahmas.php?id=xwzh'>访问新闻综合频道</a></li>\n";
echo "<li><a href='ahmas.php?id=kjsh'>访问科教生活频道</a></li>\n";
echo "<li><a href='ahmas.php?id=xwzh&debug=1'>调试模式 - 新闻综合频道</a></li>\n";
echo "</ul>\n";
}
// 主程序入口
if (empty($_GET) || isset($_GET['help']) || isset($_GET['usage'])) {
// 显示使用说明
show_usage();
} else {
// 执行主函数
execute_main();
}
|