xxxx
This commit is contained in:
220
scripts/麻雀视频.php
Normal file
220
scripts/麻雀视频.php
Normal file
@@ -0,0 +1,220 @@
|
||||
<?php
|
||||
/**
|
||||
* 麻雀视频 - PHP 适配版
|
||||
* 1. 核心:实现了 JS 源码中的 XOR + Base64 算法 (Token 生成与数据解密)
|
||||
* 2. 播放:集成了 JS 中的解密逻辑及多线路解析
|
||||
* 3. 搜索:支持 Token 验证的搜索接口
|
||||
*/
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
error_reporting(0);
|
||||
|
||||
// ================= 全局配置 =================
|
||||
$HOST = 'https://www.mqtv.cc';
|
||||
$KEY = 'Mcxos@mucho!nmme';
|
||||
$UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36';
|
||||
|
||||
// ================= 核心加解密函数 =================
|
||||
|
||||
/**
|
||||
* 对应 JS 中的 encodeData 和 decodeData (XOR + Base64)
|
||||
*/
|
||||
function mq_xor_codec($data, $key, $is_decode = false) {
|
||||
if ($is_decode) {
|
||||
$data = base64_decode($data);
|
||||
} else {
|
||||
$data = json_encode($data, JSON_UNESCAPED_UNICODE);
|
||||
$data = base64_encode($data);
|
||||
}
|
||||
|
||||
$res = '';
|
||||
$keyLen = strlen($key);
|
||||
for ($i = 0; $i < strlen($data); $i++) {
|
||||
$res .= $data[$i] ^ $key[$i % $keyLen];
|
||||
}
|
||||
|
||||
if ($is_decode) {
|
||||
return json_decode(base64_decode($res), true);
|
||||
} else {
|
||||
return urlencode(base64_encode($res));
|
||||
}
|
||||
}
|
||||
|
||||
function fetch($url, $referer = '/') {
|
||||
global $UA, $HOST;
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
'User-Agent: ' . $UA,
|
||||
'Referer: ' . $HOST . $referer,
|
||||
'X-Requested-With: XMLHttpRequest'
|
||||
]);
|
||||
$data = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
return $data;
|
||||
}
|
||||
|
||||
// 获取页面 PageID 并生成 Token
|
||||
function getToken($path, $ref = '/') {
|
||||
global $HOST, $KEY;
|
||||
$html = fetch($HOST . $path, $ref);
|
||||
preg_match("/window\.pageid\s?=\s?'(.*?)';/i", $html, $m);
|
||||
$pageId = $m[1] ?? "";
|
||||
return mq_xor_codec($pageId, $KEY);
|
||||
}
|
||||
|
||||
// ================= 路由逻辑 =================
|
||||
|
||||
$ac = $_GET['ac'] ?? null;
|
||||
$t = $_GET['t'] ?? null; // 类型,如 /type/movie
|
||||
$pg = $_GET['pg'] ?? '1';
|
||||
$wd = $_GET['wd'] ?? null;
|
||||
$ids = $_GET['ids'] ?? null;
|
||||
$play = $_GET['play'] ?? null; // 格式: url@parse1,parse2
|
||||
|
||||
// 1. 播放解析
|
||||
if ($play !== null) {
|
||||
$parts = explode('@', $play);
|
||||
$rawUrl = $parts[0];
|
||||
$parses = isset($parts[1]) ? explode(',', $parts[1]) : [];
|
||||
|
||||
// 默认返回第一个解析地址配合嗅探,模拟 JS 中的逻辑
|
||||
$finalUrl = $rawUrl;
|
||||
if (!empty($parses)) {
|
||||
$finalUrl = $parses[0] . $rawUrl;
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'parse' => 1,
|
||||
'url' => $finalUrl,
|
||||
'header' => ['User-Agent' => $UA]
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 2. 视频详情 (detail)
|
||||
if (!empty($ids)) {
|
||||
$pathParts = explode('/', trim($ids, '/'));
|
||||
$realId = end($pathParts);
|
||||
$token = getToken($ids);
|
||||
|
||||
$apiUrl = $HOST . "/libs/VodInfo.api.php?type=ct&id=$realId&token=$token";
|
||||
$json = json_decode(fetch($apiUrl, $ids), true);
|
||||
$data = $json['data'];
|
||||
|
||||
// 处理解析线路
|
||||
$parsesArr = [];
|
||||
foreach (($data['playapi'] ?? []) as $p) {
|
||||
if (isset($p['url'])) {
|
||||
$parsesArr[] = (strpos($p['url'], '//') === 0) ? "https:" . $p['url'] : $p['url'];
|
||||
}
|
||||
}
|
||||
$parsesStr = implode(',', $parsesArr);
|
||||
|
||||
$playFrom = [];
|
||||
$playUrls = [];
|
||||
foreach (($data['playinfo'] ?? []) as $site) {
|
||||
$playFrom[] = $site['cnsite'];
|
||||
$urls = [];
|
||||
foreach ($site['player'] as $ep) {
|
||||
// 将解析接口封装在 URL 后面,供 play 阶段调用
|
||||
$urls[] = $ep['no'] . '$' . $ep['url'] . '@' . $parsesStr;
|
||||
}
|
||||
$playUrls[] = implode('#', $urls);
|
||||
}
|
||||
|
||||
$vod = [
|
||||
'vod_id' => $ids,
|
||||
'vod_name' => $data['title'],
|
||||
'vod_pic' => $data['img'],
|
||||
'vod_remarks' => $data['remark'],
|
||||
'vod_year' => $data['year'],
|
||||
'vod_area' => $data['area'],
|
||||
'vod_actor' => $data['actor'],
|
||||
'vod_director' => $data['director'],
|
||||
'vod_content' => $data['content'] ?? '',
|
||||
'vod_play_from' => implode('$$$', $playFrom),
|
||||
'vod_play_url' => implode('$$$', $playUrls)
|
||||
];
|
||||
|
||||
echo json_encode(['list' => [$vod]], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 3. 搜索 (search)
|
||||
if (!empty($wd)) {
|
||||
$path = '/search/' . urlencode($wd);
|
||||
$token = getToken($path);
|
||||
$apiUrl = $HOST . "/libs/VodList.api.php?search=" . urlencode($wd) . "&token=$token";
|
||||
|
||||
$resp = json_decode(fetch($apiUrl, $path), true);
|
||||
$data = mq_xor_codec($resp['data'], $KEY, true); // 搜索数据需要解密
|
||||
|
||||
$list = [];
|
||||
if (isset($data['vod_all'])) {
|
||||
foreach ($data['vod_all'] as $item) {
|
||||
foreach ($item['show'] as $v) {
|
||||
$list[] = [
|
||||
'vod_id' => $v['url'],
|
||||
'vod_name' => $v['title'],
|
||||
'vod_pic' => $v['img'],
|
||||
'vod_remarks' => $v['remark']
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
echo json_encode(['list' => $list, 'page' => $pg], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 4. 分类列表 (category)
|
||||
if (!empty($t)) {
|
||||
$typeKey = explode('/', trim($t, '/'))[1] ?? 'movie';
|
||||
$token = getToken($t);
|
||||
$apiUrl = $HOST . "/libs/VodList.api.php?type=$typeKey&rank=rankhot&page=$pg&token=$token";
|
||||
|
||||
$resp = json_decode(fetch($apiUrl, $t), true);
|
||||
$list = [];
|
||||
foreach (($resp['data'] ?? []) as $v) {
|
||||
$list[] = [
|
||||
'vod_id' => $v['url'],
|
||||
'vod_name' => $v['title'],
|
||||
'vod_pic' => $v['img'],
|
||||
'vod_remarks' => $v['remark']
|
||||
];
|
||||
}
|
||||
echo json_encode(['list' => $list, 'page' => intval($pg)], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 5. 首页 (homeVod)
|
||||
$token = getToken('/');
|
||||
$apiUrl = $HOST . "/libs/VodList.api.php?home=index&token=$token";
|
||||
$resp = json_decode(fetch($apiUrl), true);
|
||||
$list = [];
|
||||
if (isset($resp['data']['movie'])) {
|
||||
foreach ($resp['data']['movie'] as $section) {
|
||||
foreach ($section['show'] as $v) {
|
||||
$list[] = [
|
||||
'vod_id' => $v['url'],
|
||||
'vod_name' => $v['title'],
|
||||
'vod_pic' => $v['img'],
|
||||
'vod_remarks' => $v['remark']
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'class' => [
|
||||
['type_id' => '/type/movie', 'type_name' => '电影'],
|
||||
['type_id' => '/type/tv', 'type_name' => '电视剧'],
|
||||
['type_id' => '/type/va', 'type_name' => '综艺'],
|
||||
['type_id' => '/type/ct', 'type_name' => '动漫']
|
||||
],
|
||||
'list' => array_slice($list, 0, 30)
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
Reference in New Issue
Block a user