303 lines
9.2 KiB
JavaScript
303 lines
9.2 KiB
JavaScript
import { Crypto,_} from 'assets://js/lib/cat.js';
|
||
//import {} from './wrapper/index.js';
|
||
|
||
let siteUrl = 'http://118.25.18.217:6632';
|
||
let siteKey = '';
|
||
let siteType = 0;
|
||
let cookies = '';
|
||
|
||
let headers = {
|
||
'User-Agent': 'okhttp/3.12.1',
|
||
'Content-Type': 'application/json;'
|
||
};
|
||
|
||
let key = ['TFLYWVJ5EG5YB1PLZLVVMGVLBGRIDCSW', 'nj6E5K4yYYT5W4ScJ3J3rJ2zrzcJkpTk'];
|
||
|
||
async function request(reqUrl){
|
||
//console.log('req', reqUrl);
|
||
let res = await req(reqUrl, {
|
||
method: 'get',
|
||
headers: headers,
|
||
});
|
||
return res.content;
|
||
}
|
||
|
||
async function init(cfg) {
|
||
siteKey = cfg.skey;
|
||
siteType = cfg.stype;
|
||
initHost();
|
||
}
|
||
|
||
async function home(filter) {
|
||
let res = await request(`${siteUrl}/api/v3/drama/getCategory?orderBy=type_id`);
|
||
//console.log(res);
|
||
let data = JSON.parse(res).data;
|
||
let dy = {
|
||
"class": "类型",
|
||
"area": "地区",
|
||
"lang": "语言",
|
||
"year": "年份",
|
||
"letter": "字母",
|
||
"by": "排序",
|
||
"sort": "排序",
|
||
};
|
||
let filters = {};
|
||
let classes = [];
|
||
_.forEach(data, item => {
|
||
let jsontype_extend = JSON.parse(item["converUrl"]);
|
||
//console.log('jsontype_extend', jsontype_extend);
|
||
classes.push({
|
||
type_id: item['id'],
|
||
type_name: item['name']
|
||
});
|
||
filters[item['id']] = [];
|
||
for (let key in dy) {
|
||
if (jsontype_extend[key]) {
|
||
let values = jsontype_extend[key].split(',');
|
||
filters[item['id']].push({
|
||
key: key,
|
||
name: dy[key],
|
||
value: _.map(values, v => {
|
||
return {
|
||
n: v,
|
||
v: v
|
||
}
|
||
})
|
||
});
|
||
}
|
||
}
|
||
})
|
||
return JSON.stringify({
|
||
class: classes,
|
||
filters: filters,
|
||
});
|
||
}
|
||
//console.log(await home());
|
||
|
||
|
||
async function homeVod() {
|
||
let res = await request(`${siteUrl}/api/ex/v3/security/tag/list`);
|
||
let data = JSON.parse(res).data;
|
||
let result = aes(aes(data, key[0]), key[1], 'decrypt', true);
|
||
let videos = _.map(result[0]['carousels'], item => {
|
||
//console.log(item);
|
||
return {
|
||
vod_id: item['link'].split("id=")[1],
|
||
vod_name: item["title"],
|
||
vod_pic: item["cover"],
|
||
vod_remarks: item['sort'],
|
||
};
|
||
})
|
||
return JSON.stringify({
|
||
list: videos,
|
||
});
|
||
}
|
||
|
||
//console.log(await homeVod());
|
||
|
||
async function category(tid, pg, filter, extend) {
|
||
let param = '';
|
||
if (extend['area']) {
|
||
param = param + "vodArea=" + extend['area'] + "&";
|
||
}
|
||
if (extend['class']) {
|
||
param = param + "vodClass=" + extend['class'] + "&";
|
||
}
|
||
if (extend['lang']) {
|
||
param = param + "vodLang=" + extend['lang'] + "&";
|
||
}
|
||
if (extend['year']) {
|
||
param = param + "vodYear=" + extend['year'] + "&";
|
||
}
|
||
param = param + "pagesize=20&typeId1=" +tid + "&page=" + pg;
|
||
let path = aes(aes(param, key[1], 'encrypt'), key[0], 'encrypt', true);
|
||
let res = await request(`${siteUrl}/api/ex/v3/security/drama/list?query=${path}`);
|
||
let data = JSON.parse(res).data;
|
||
data = aes(aes(data, key[0]), key[1], 'decrypt', true)['list'];
|
||
let videos = _.map(data, item => {
|
||
return {
|
||
vod_id: item['id'],
|
||
vod_name: item['name'],
|
||
vod_pic: item['coverImage']['path'],
|
||
vod_year: item['year'],
|
||
vod_remarks: item['remark'],
|
||
};
|
||
});
|
||
return JSON.stringify({
|
||
list: videos,
|
||
page: pg,
|
||
pagecount: 999,
|
||
});
|
||
}
|
||
//console.log(await category('2', '1', '', ''));
|
||
|
||
|
||
async function detail(id) {
|
||
let res = await request(`${siteUrl}/api/v3/drama/getDetail?id=${id}`);
|
||
//console.log(res);
|
||
let data = JSON.parse(res).data;
|
||
let vod = {
|
||
'vod_name': data.name,
|
||
'vod_area': data.area,
|
||
'type_name': data.clazz,
|
||
'vod_actor': data.actor,
|
||
'vod_director': data.director,
|
||
'vod_content': data.brief,
|
||
}
|
||
let play = []
|
||
let names = []
|
||
let plays = {}
|
||
_.forEach(data['videos'], item => {
|
||
if(names.indexOf(item['sourceCn']) == -1) {
|
||
plays[item['source']] = [];
|
||
names.push(item['sourceCn']);
|
||
}
|
||
let url = `vodPlayFrom=${item['source']}&playUrl=${item['path']}`
|
||
if(item['path'] && (item['path'].includes('m3u8') || item['path'].includes('mp4') || item['path'].includes('flv'))) {
|
||
url = item['path']
|
||
}
|
||
plays[item['source']].push(item['titleOld'] + '$' + url);
|
||
});
|
||
//console.log(names);
|
||
//console.log(plays);
|
||
_.forEach(plays, (item, key) => {
|
||
play.push(item.join('#'));
|
||
})
|
||
vod.vod_play_url = play.join('$$$');
|
||
vod.vod_play_from = names.join('$$$');
|
||
return JSON.stringify({
|
||
list: [vod],
|
||
});
|
||
}
|
||
//console.log(await detail('105275'));
|
||
|
||
async function play(flag, id) {
|
||
let url = id;
|
||
if(id.includes('vodPlayFrom')) {
|
||
let path = aes(aes(id, key[1], 'encrypt'), key[0], 'encrypt', true);
|
||
let res = await request(`${siteUrl}/api/ex/v3/security/videoUsableUrl?query=${path}`);
|
||
let data = JSON.parse(res).data;
|
||
//console.log(data);
|
||
url = aes(aes(data, key[0]), key[1], 'decrypt', true)['playUrl']
|
||
//console.log(url);
|
||
if (url.includes('.jpg') || url.includes('.jpeg') || url.includes('.png')) {
|
||
const js2Base = await js2Proxy(true, siteType, siteKey, 'm3u8/', {});
|
||
url = js2Base + base64Encode(url);
|
||
}
|
||
}
|
||
return JSON.stringify({
|
||
parse: 0,
|
||
url: url,
|
||
});
|
||
}
|
||
//console.log(await play('', 'vodPlayFrom=Yzm3u8&playUrl=TNB-0C61E2C6562FDAE90B4121E29991104582919875B13189E00C02FDE3D84F41174860905A48FD727E784F72F24055D4D7A0199801E4FFD0D390A573D5AEE119881E2F67ADC7ABFDC5ABF1AFD9170AA7A6B9'));
|
||
|
||
|
||
|
||
|
||
async function search(wd, quick, pg = 1) {
|
||
let param = `pagesize=20&page=${pg}&searchKeys=${wd}`;
|
||
let path = aes(aes(param, key[1], 'encrypt'), key[0], 'encrypt', true);
|
||
let res = await request(`${siteUrl}/api/ex/v3/security/drama/list?query=${path}`);
|
||
let data = JSON.parse(res).data;
|
||
data = aes(aes(data, key[0]), key[1], 'decrypt', true)['list'];
|
||
let videos = _.map(data, item => {
|
||
return {
|
||
vod_id: item['id'],
|
||
vod_name: item['name'],
|
||
vod_pic: item['coverImage']['path'],
|
||
vod_year: item['year'],
|
||
vod_remarks: item['remark'],
|
||
};
|
||
});
|
||
return JSON.stringify({
|
||
list: videos
|
||
});
|
||
}
|
||
|
||
//console.log(await search('战狼', '', '1'));
|
||
|
||
|
||
|
||
async function proxy(segments, headers) {
|
||
let what = segments[0];
|
||
let url = base64Decode(segments[1]);
|
||
if (what == 'm3u8') {
|
||
let data = await request(url);
|
||
// 处理M3U8文件内容
|
||
let lines = data.trim().split('\n');
|
||
lines = lines.map((string, index) => {
|
||
if (!string.startsWith('#EXT') && !/^(http|https):\/\//.test(string)) {
|
||
return `${durl}${string.startsWith('/') ? '' : '/'}${string}`;
|
||
}
|
||
return string;
|
||
});
|
||
// 返回修改后的内容
|
||
return [200, "application/vnd.apple.mpegurl", lines.join('\n')];
|
||
}
|
||
return JSON.stringify({
|
||
code: 500,
|
||
content: '',
|
||
});
|
||
}
|
||
|
||
function base64Encode(text) {
|
||
return Crypto.enc.Base64.stringify(Crypto.enc.Utf8.parse(text));
|
||
}
|
||
|
||
function base64Decode(text) {
|
||
return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text));
|
||
}
|
||
|
||
async function initHost() {
|
||
try {
|
||
let res = await request('https://www.shijue.pro/token.txt');
|
||
siteUrl = JSON.parse(res).domain;
|
||
} catch (e) {
|
||
console.log('initHost error', e);
|
||
}
|
||
}
|
||
function aes(word, key, mode = 'decrypt', bool = false) {
|
||
// 将字符串转换为字节数组,并处理key长度以匹配AES要求(通常是16, 24或32字节)
|
||
const secretKey = Crypto.enc.Utf8.parse(key);
|
||
|
||
if (mode === 'decrypt') {
|
||
// 解码Base64编码的字符串
|
||
const base64Word = Crypto.enc.Base64.parse(word);
|
||
const cipherParams = Crypto.lib.CipherParams.create({ ciphertext: base64Word });
|
||
|
||
// 使用AES ECB模式进行解密
|
||
const decrypted = Crypto.AES.decrypt(cipherParams, secretKey, { mode: Crypto.mode.ECB, padding: Crypto.pad.Pkcs7 });
|
||
let result = decrypted.toString(Crypto.enc.Utf8);
|
||
|
||
if (bool) {
|
||
result = JSON.parse(result);
|
||
}
|
||
return result;
|
||
} else if (mode === 'encrypt') {
|
||
// 对word进行AES加密前先转为CryptoJS word数组
|
||
const source = Crypto.enc.Utf8.parse(word);
|
||
|
||
// 使用AES ECB模式进行加密
|
||
const encrypted = Crypto.AES.encrypt(source, secretKey, { mode: Crypto.mode.ECB, padding: Crypto.pad.Pkcs7 });
|
||
let result = encrypted.ciphertext.toString(Crypto.enc.Base64);
|
||
|
||
if (bool) {
|
||
result = encodeURIComponent(result);
|
||
}
|
||
return result;
|
||
}
|
||
}
|
||
|
||
export function __jsEvalReturn() {
|
||
return {
|
||
init: init,
|
||
home: home,
|
||
homeVod: homeVod,
|
||
category: category,
|
||
detail: detail,
|
||
play: play,
|
||
search: search,
|
||
proxy: proxy,
|
||
};
|
||
} |