321 lines
10 KiB
JavaScript
321 lines
10 KiB
JavaScript
|
|
const webSite = 'https://api.zaqohu.com';
|
|
const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36';
|
|
|
|
//console.log('运行脚本');
|
|
//let key = Crypto.MD5('123456').toString();
|
|
//console.log(key);
|
|
//homeContent();
|
|
//categoryContent("6|9384",1,null);
|
|
//detailContent("66477");
|
|
//playerContent("https://www.czzy77.com/v_play/bXZfMTg5NTEtbm1fNDA=.html");
|
|
//searchContent("斗罗大陆");
|
|
|
|
|
|
//获取影视列表
|
|
async function categoryContent(tid, pg = 1, extend) {
|
|
let backData = new RepVideo();
|
|
try {
|
|
let listUrl = webSite;
|
|
let params='';
|
|
const tidArray = tid.split('|');
|
|
if (tidArray[1]) {
|
|
listUrl = listUrl + '/H5/Category/GetModuleList';
|
|
params = { show_id: tidArray[1], show_pid: tidArray[0], pageSize: 24, page: pg };
|
|
} else {
|
|
listUrl = listUrl + '/H5/Category/GetChoiceList';
|
|
params = { pid: tidArray[0], pageSize: 24, page: pg };
|
|
}
|
|
let pro = await req(listUrl, {
|
|
method: 'POST',
|
|
headers: {
|
|
'User-Agent': UA,
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({ params: aesEncode(JSON.stringify(params)) }),
|
|
});
|
|
let proData = await pro.text();
|
|
let obj2 = JSON.parse(proData);
|
|
let decryptBody = aesDecode(obj2.data);
|
|
let obj = JSON.parse(decryptBody);
|
|
let allVideo = obj.list;
|
|
let videos = [];
|
|
allVideo.forEach((e) => {
|
|
let vodUrl = e.vod_id || ''
|
|
let vodPic = e.c_pic || e.vod_pic
|
|
let vodName = e.c_name || e.vod_name
|
|
let vodDiJiJi = e.vod_continu || ''
|
|
let videoDet = new VideoList()
|
|
videoDet.vod_id = +vodUrl
|
|
videoDet.vod_pic = vodPic
|
|
videoDet.vod_name = vodName.trim()
|
|
videoDet.vod_remarks = vodDiJiJi.trim()
|
|
videos.push(videoDet)
|
|
});
|
|
backData.list = videos;
|
|
} catch (error) {
|
|
//console.error('Error in fetchData:', error);
|
|
backData.msg = error.statusText;
|
|
}
|
|
//console.log(JSON.stringify(backData));
|
|
return JSON.stringify(backData);
|
|
}
|
|
|
|
//获取影视详情信息
|
|
async function detailContent(ids) {
|
|
await toast('尝试获取影片信息',2);
|
|
let backData = new RepVideo();
|
|
const webUrl = `${webSite}/H5/Resource/GetVodInfo`
|
|
try {
|
|
let params = { vod_id: ids };
|
|
let pro = await req(webUrl, {
|
|
method: 'POST',
|
|
headers: {
|
|
'User-Agent': UA,
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({ params: aesEncode(JSON.stringify(params)) }),
|
|
});
|
|
let proData = await pro.text();
|
|
let obj2 = JSON.parse(proData);
|
|
let decryptBody = aesDecode(obj2.data);
|
|
let obj = JSON.parse(decryptBody).vodInfo;
|
|
let vod_content = obj.vod_use_content;
|
|
let vod_pic = obj.pic;
|
|
let vod_name = obj.vod_name;
|
|
let vod_year = obj.vod_year || '';
|
|
let vod_director = obj.vod_director || '';
|
|
let vod_actor = obj.vod_actor || '';
|
|
let vod_area = obj.vod_area || '';
|
|
await toast('尝试获取剧集信息',2);
|
|
let playlistUrl = `${webSite}/H5/Resource/GetOnePlayList`
|
|
let params2 = { vod_id: ids, pageSize: 10000, page: 1 };
|
|
let res = await req(playlistUrl, {
|
|
method: 'POST',
|
|
headers: {
|
|
'User-Agent': UA,
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({ params: aesEncode(JSON.stringify(params2)) }),
|
|
});
|
|
let playData = await res.text();
|
|
let obj3 = JSON.parse(playData);
|
|
let decryptBody2 = aesDecode(obj3.data);
|
|
let obj4 = JSON.parse(decryptBody2);
|
|
//let vod_play_url = obj4.urls.map((item) => item.name + '$' + item.url).join('#');
|
|
let vod_play_url = obj4.urls.map((item) => {
|
|
let name = item.name || '正片'; // 如果 item.name 为空,则使用 '正品'
|
|
return name + '$' + item.url;
|
|
}).join('#');
|
|
let detModel = new VideoDetail();
|
|
let videos = [];
|
|
detModel.vod_year = vod_year;
|
|
detModel.vod_director = vod_director;
|
|
detModel.vod_actor = vod_actor;
|
|
detModel.vod_area = vod_area;
|
|
detModel.vod_content = vod_content.replace(/\s+/g, '');
|
|
detModel.vod_pic = vod_pic;
|
|
detModel.vod_name = vod_name;
|
|
detModel.vod_play_from = '播放列表';
|
|
detModel.vod_play_url = vod_play_url;
|
|
detModel.vod_id = ids;
|
|
videos.push(detModel);
|
|
backData.list = videos;
|
|
} catch (error) {
|
|
//console.error('Error in fetchData:', error);
|
|
backData.msg = error.statusText;
|
|
}
|
|
//console.log(JSON.stringify(backData));
|
|
return JSON.stringify(backData);
|
|
}
|
|
|
|
//获取首页分类
|
|
async function homeContent() {
|
|
let backData = new RepVideo();
|
|
try {
|
|
let list = [];
|
|
let allClass = [
|
|
{
|
|
type_id: '3|',
|
|
type_name: '电影',
|
|
},
|
|
{
|
|
type_id: '4|',
|
|
type_name: '电视剧',
|
|
},
|
|
{
|
|
type_id: '5|',
|
|
type_name: '动漫',
|
|
},
|
|
{
|
|
type_id: '6|',
|
|
type_name: '综艺',
|
|
},
|
|
{
|
|
type_id: '3|19260',
|
|
type_name: 'TC抢先看',
|
|
},{
|
|
type_id: '3|15649',
|
|
type_name: '院线大片',
|
|
},{
|
|
type_id: '3|12814',
|
|
type_name: '网络新片',
|
|
},{
|
|
type_id: '3|9153',
|
|
type_name: '动作片',
|
|
},{
|
|
type_id: '3|12558',
|
|
type_name: '犯罪片',
|
|
},{
|
|
type_id: '3|14',
|
|
type_name: '喜剧片',
|
|
},{
|
|
type_id: '3|15511',
|
|
type_name: '惊悚恐怖片',
|
|
},{
|
|
type_id: '3|11517',
|
|
type_name: '科幻魔幻片',
|
|
},{
|
|
type_id: '3|466',
|
|
type_name: '情感剧情片',
|
|
},{
|
|
type_id: '3|15510',
|
|
type_name: 'Netflix电影',
|
|
},{
|
|
type_id: '4|17473',
|
|
type_name: '港剧',
|
|
},{
|
|
type_id: '4|15386',
|
|
type_name: '高分大陆剧',
|
|
},{
|
|
type_id: '4|17084',
|
|
type_name: '高分台剧',
|
|
},{
|
|
type_id: '5|127',
|
|
type_name: '国产动漫',
|
|
},{
|
|
type_id: '5|446',
|
|
type_name: '日本动漫',
|
|
},{
|
|
type_id: '5|128',
|
|
type_name: '欧美动漫',
|
|
},{
|
|
type_id: '5|14182',
|
|
type_name: '动漫电影',
|
|
},{
|
|
type_id: '5|6175',
|
|
type_name: '今日动漫',
|
|
},{
|
|
type_id: '5|10772',
|
|
type_name: '必追动漫',
|
|
},{
|
|
type_id: '5|12655',
|
|
type_name: '奇幻番剧榜',
|
|
},{
|
|
type_id: '5|8101',
|
|
type_name: '热血番剧榜',
|
|
},{
|
|
type_id: '6|6663',
|
|
type_name: '热门综艺',
|
|
},{
|
|
type_id: '6|14244',
|
|
type_name: 'NetFlix综艺',
|
|
},{
|
|
type_id: '6|7017',
|
|
type_name: '日韩综艺',
|
|
},{
|
|
type_id: '6|9384',
|
|
type_name: '卫视综艺',
|
|
},
|
|
];
|
|
//console.log(allClass.length);
|
|
allClass.forEach((e) => {
|
|
let videoClass = new VideoClass()
|
|
videoClass.type_id = e.type_id
|
|
videoClass.type_name = e.type_name
|
|
list.push(videoClass)
|
|
});
|
|
backData.class = list;
|
|
} catch (error) {
|
|
//console.error('Error in fetchData:', error);
|
|
backData.msg = error.statusText;
|
|
}
|
|
//console.log(JSON.stringify(backData));
|
|
return JSON.stringify(backData);
|
|
}
|
|
|
|
|
|
function aesEncode(str) {
|
|
const key = Crypto.enc.Utf8.parse('181cc88340ae5b2b')
|
|
const iv = Crypto.enc.Utf8.parse('4423d1e2773476ce')
|
|
|
|
let encData = Crypto.AES.encrypt(str, key, {
|
|
iv: iv,
|
|
mode: Crypto.mode.CBC,
|
|
padding: Crypto.pad.Pkcs7,
|
|
})
|
|
return encData.ciphertext.toString(Crypto.enc.Hex)
|
|
}
|
|
|
|
function aesDecode(str) {
|
|
const key = Crypto.enc.Utf8.parse('181cc88340ae5b2b')
|
|
const iv = Crypto.enc.Utf8.parse('4423d1e2773476ce')
|
|
|
|
str = Crypto.enc.Hex.parse(str)
|
|
return Crypto.AES.decrypt({ ciphertext: str }, key, {
|
|
iv: iv,
|
|
mode: Crypto.mode.CBC,
|
|
padding: Crypto.pad.Pkcs7,
|
|
}).toString(Crypto.enc.Utf8)
|
|
}
|
|
|
|
|
|
//解析获取播放地址
|
|
async function playerContent(vod_id) {
|
|
//await toast('正在分析直链...',2);
|
|
let backData = new RepVideoPlayUrl();
|
|
const headers = {'User-Agent': UA};
|
|
backData.url=vod_id;
|
|
backData.playUrl='';
|
|
backData.parse = 1;
|
|
backData.header = headersToString(headers);
|
|
//console.log(JSON.stringify(backData));
|
|
return JSON.stringify(backData);
|
|
}
|
|
|
|
async function searchContent(keyword) {
|
|
let backData = new RepVideo();
|
|
try {
|
|
let url = webSite + `/?s=${keyword}`
|
|
//console.log(url);
|
|
let pro = await req(url, {
|
|
headers: {
|
|
'User-Agent': UA
|
|
},
|
|
});
|
|
let proData = await pro.text();
|
|
let $ = cheerio.load(proData);
|
|
let allVideo = $('.search_list li');
|
|
let videos = [];
|
|
allVideo.each((_, e) => {
|
|
let url = $(e).find('a').attr('href');
|
|
let name = $(e).find('img.thumb').attr('alt');
|
|
let pic = $(e).find('img.thumb').attr('data-original');
|
|
let subTitle = $(e).find('.jidi span').text();
|
|
let hdinfo = $(e).find('.hdinfo .qb').text();
|
|
let videoDet = new VideoList();
|
|
videoDet.vod_id = url;
|
|
videoDet.vod_pic = pic;
|
|
videoDet.vod_name = name;
|
|
videoDet.vod_remarks = subTitle || hdinfo;
|
|
videos.push(videoDet);
|
|
})
|
|
backData.list = videos;
|
|
} catch (error) {
|
|
console.error('Error in fetchData:', error);
|
|
backData.msg = error.statusText;
|
|
}
|
|
//console.log(JSON.stringify(backData));
|
|
return JSON.stringify(backData);
|
|
}
|