Files
sg/open/wpzy_search.js
2026-08-14 11:23:47 +02:00

436 lines
15 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
@header({
searchable: 1,
filterable: 0,
quickSearch: 1,
title: '网盘资源[搜]',
lang: 'ds'
})
*/
import '../lib/htmlParser.js';
import { Quark, Baidu, UC } from "../lib/pans.js";
// ==================== 全局变量 ====================
let siteName = '网盘资源搜索', siteKey = '', siteType = 0;
// ==================== 开关配置 1=开启,0=关闭)====================
let quarkInfinite = 0;
let quarkOrig = 1;
let quarkTransfer = 1;
let enableProxy = 0;
// ================================================
let UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36";
let headers = {
"User-Agent": UA,
"Accept": "application/json, text/plain, */*",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
};
let proxyurl = 'http://127.0.0.1:2525/proxy?url=';
let downThreads = '20';
let defaultImg = `https://cnb.cool/zhyadc/YsBox/-/git/raw/main/images/icon_cookie/网盘搜索.png`;
let host = 'https://so.yinpai.xyz';
let maxPages = 5;
function safeJSONParse(str, defaultValue = {}) {
if (!str || typeof str === 'object') return str || defaultValue;
try {
return JSON.parse(str);
} catch {
return defaultValue;
}
}
async function request(url, options = {}) {
const reqHeaders = { ...headers, ...options.headers };
let postType = reqHeaders['Content-Type']?.includes('json') ? 'json' :
reqHeaders['Content-Type']?.includes('form') ? 'form' : '';
try {
const response = await req(url, {
method: options.method || 'GET',
headers: reqHeaders,
data: options.data,
postType: postType,
timeout: options.timeout || 15000
});
return response?.content || response?.data || response;
} catch {
return null;
}
}
function mapResolution(res) {
const map = {
'low': '流畅', 'normal': '标清', 'high': '高清', 'super': '超清',
'4k': '4K', '2k': '2K', 'hdr': 'HDR', 'dolby_vision': 'HDR',
'M3U8_AUTO_480': '480P', 'M3U8_AUTO_720': '720P', 'M3U8_AUTO_1080': '1080P',
'M3U8_AUTO_2K': '2K', 'M3U8_AUTO_4K': '4K'
};
return map[res] || res;
}
async function loadRemoteConfig(cfgUrl) {
try {
const res = await request(cfgUrl, { timeout: 10000 });
if (res) {
const remoteCfg = safeJSONParse(res);
if (remoteCfg.quark_cookie?.length > 10) Quark.cookie = remoteCfg.quark_cookie;
if (remoteCfg.baidu_cookie?.length > 10) Baidu.cookie = remoteCfg.baidu_cookie;
if (remoteCfg.uc_cookie?.length > 10) UC.cookie = remoteCfg.uc_cookie;
if (remoteCfg.uc_token?.length > 10) UC.token = remoteCfg.uc_token;
if (remoteCfg.threads) downThreads = remoteCfg.threads;
if (remoteCfg.enableProxy !== undefined) enableProxy = remoteCfg.enableProxy;
if (remoteCfg.infinite !== undefined) quarkInfinite = remoteCfg.infinite;
if (remoteCfg.quark_original !== undefined) quarkOrig = remoteCfg.quark_original;
if (remoteCfg.quark_transfer !== undefined) quarkTransfer = remoteCfg.quark_transfer;
return true;
}
} catch (e) {}
return false;
}
async function init(cfg) {
siteName = cfg.skey?.split('_')[1] || cfg.skey || siteName;
siteKey = cfg.skey;
siteType = cfg.stype;
let ext = cfg.ext || cfg;
if (typeof ext === 'string') ext = decodeURIComponent(ext);
if (typeof ext === 'string') {
await loadRemoteConfig(ext);
}
}
function home() {
return JSON.stringify({
class: [
{ type_id: 'search', type_name: '这是一个搜索源' }
],
});
}
async function homeVod() {
return await category('search', 1, null, null);
}
async function category(tid, pg, filter, ext) {
if (tid === 'search') {
return JSON.stringify({
list: [{
vod_id: 'only_search',
vod_name: '🔍 网盘资源搜索',
vod_pic: defaultImg,
}]
});
}
return JSON.stringify({ list: [] });
}
async function detail(id) {
let detailObj;
try {
let decoded = decodeURIComponent(id);
detailObj = safeJSONParse(decoded);
} catch (e) {
let parts = id.split('|');
detailObj = {
rid: parts[0],
name: parts[1] || '网盘资源',
panName: parts[2] || '夸克网盘'
};
}
let resourceId = detailObj.rid;
let vod_name = detailObj.name;
let play_from = [];
let play_url = [];
let play_pic = [];
let apiUrl = `${host}/api.php?ids=${resourceId}`;
let response = await request(apiUrl, { headers: headers, timeout: 15000 });
let shareUrl = null;
if (response) {
try {
let data = safeJSONParse(response);
if (data.list && data.list[0]) {
let item = data.list[0];
shareUrl = item.vod_play_url?.split('$')?.[1] || '';
vod_name = item.vod_name || vod_name;
}
} catch (e) {}
}
if (shareUrl && shareUrl.startsWith('http')) {
let counters = { '夸克': 1, '百度': 1, '优汐': 1 };
if (/\.quark|pan\.quark/.test(shareUrl)) {
let shareData = Quark.getShareData(shareUrl);
if (shareData) {
let files = await Quark.getFilesByShareUrl(shareData);
if (files?.length) {
let url = files.map(v => {
let size = v.size ? ` 【${formatSize(v.size)}】` : '';
return `${v.file_name}${size}$${[shareData.shareId, v.stoken, v.fid, v.share_fid_token, v.pdir_fid || '', v.subtitle?.fid || '', v.subtitle?.share_fid_token || ''].join('*')}`;
}).join('#');
let imgs = files.map(v => v.thumbnail || v.thumb || v.pic || '').join('#');
play_from.push(`夸克#${counters['夸克']++}`);
play_url.push(url);
play_pic.push(imgs);
}
}
}
else if (/\.baidu|pan\.baidu/.test(shareUrl)) {
let shareData = Baidu.getShareData(shareUrl);
if (shareData) {
let files = await Baidu.getFilesByShareUrl(shareData);
if (files?.length) {
let url = files.map(v => {
let size = v.size ? ` 【${formatSize(v.size)}】` : '';
let info = { surl: shareData.surl, pwd: shareData.pwd || '' };
return `${v.name}${size}$${[v.path, v.uk, v.shareid, v.fsid, JSON.stringify(info)].join('*')}`;
}).join('#');
let imgs = files.map(v => v.thumbnail || v.thumb || v.pic || '').join('#');
play_from.push(`百度#${counters['百度']++}`);
play_url.push(url);
play_pic.push(imgs);
}
}
}
else if (/\.uc|drive\.uc/.test(shareUrl)) {
let shareData = UC.getShareData(shareUrl);
if (shareData) {
let files = await UC.getFilesByShareUrl(shareData);
if (files?.length) {
let url = files.map(v => {
let size = v.size ? ` 【${formatSize(v.size)}】` : '';
return `${v.file_name}${size}$${[shareData.shareId, v.stoken, v.fid, v.share_fid_token, v.subtitle?.fid || '', v.subtitle?.share_fid_token || ''].join('*')}`;
}).join('#');
let imgs = files.map(v => v.thumbnail || v.thumb || v.pic || '').join('#');
play_from.push(`优汐#${counters['优汐']++}`);
play_url.push(url);
play_pic.push(imgs);
}
}
}
}
if (play_from.length === 0) {
play_from.push('提示');
play_url.push(shareUrl ? `分享链接: ${shareUrl}` : `获取分享链接失败,资源ID: ${resourceId}`);
play_pic.push('');
}
let contentParts = [`资源ID: ${resourceId}`];
if (shareUrl) {
contentParts.push(`网盘链接: ${shareUrl}`);
}
let vod_content = contentParts.join(' | ');
let vod = {
vod_id: id,
vod_name: vod_name,
vod_pic: '',
vod_content: vod_content,
vod_remarks: play_from.length > 0 ? (play_from[0].split('#')[0] + '可播放') : '解析失败',
vod_play_from: play_from.join('$$$'),
vod_play_url: play_url.join('$$$'),
vod_play_pic: play_pic.join('$$$'),
vod_play_pic_ratio: 1.0
};
return JSON.stringify({ list: [vod] });
}
async function search(wd, quick, pg) {
let page = pg || 1;
const typeMap = [
{ type: 'baidu', name: '百度网盘', icon: 'https://cnb.cool/zhyadc/YsBox/-/git/raw/main/images/icon_cookie/百度.png' },
{ type: 'uc', name: '优汐网盘', icon: 'https://cnb.cool/zhyadc/YsBox/-/git/raw/main/images/icon_cookie/优汐.png' },
{ type: 'quark', name: '夸克网盘', icon: 'https://cnb.cool/zhyadc/YsBox/-/git/raw/main/images/icon_cookie/夸克.png' }
];
let urls = [];
for (let t of typeMap) {
urls.push({
url: `${host}/api.php?type=${t.type}&wd=${encodeURIComponent(wd)}`,
options: { headers: headers, timeout: 15000 }
});
}
let results = await batchFetch(urls);
let allList = [];
let seenIds = new Set();
for (let idx = 0; idx < results.length; idx++) {
let content = results[idx];
if (!content) continue;
let typeInfo = typeMap[idx];
try {
let data = safeJSONParse(content);
if (data.list && Array.isArray(data.list)) {
for (let item of data.list) {
let title = item.vod_name;
if (!title || title.length < 2) continue;
if (seenIds.has(item.vod_id)) continue;
seenIds.add(item.vod_id);
let detailObj = {
rid: item.vod_id,
name: title,
panName: typeInfo.name
};
let detailId = encodeURIComponent(JSON.stringify(detailObj));
allList.push({
vod_id: detailId,
vod_name: title,
vod_pic: typeInfo.icon,
vod_content: item.vod_remarks || '',
vod_remarks: typeInfo.name
});
}
}
} catch (e) {}
}
let filteredList = allList.filter(item => new RegExp(wd, "i").test(item.vod_name));
return JSON.stringify({
page: page,
pagecount: maxPages,
limit: filteredList.length,
total: filteredList.length,
list: filteredList
});
}
async function play(flag, id, flags) {
let ids = id.split('*');
let urls = [];
const addUrl = (name, u) => {
if (u) urls.push(name, proxyUrl(u) + `&thread=${downThreads}`);
};
if (flag.startsWith('夸克') && ids.length >= 4) {
let [shareId, stoken, fid, share_fid_token] = ids;
let header = {
'User-Agent': headers['User-Agent'],
'origin': 'https://pan.quark.cn',
'referer': 'https://pan.quark.cn/',
'Cookie': Quark.cookie
};
if (quarkInfinite == 1) {
const tokenUrls = await Quark.getUrl(shareId, stoken, fid, share_fid_token);
tokenUrls?.forEach(item => { if (item?.url) addUrl("无限" + (item.name || ''), item.url); });
}
let shouldTransfer = quarkTransfer;
if (quarkInfinite != 1 && quarkOrig != 1 && quarkTransfer != 1) {
shouldTransfer = 1;
}
if (shouldTransfer == 1) {
if (quarkOrig == 1) {
let down = await Quark.getDownload(shareId, stoken, fid, share_fid_token, true);
if (down && down.error) {
const errorMsg = down.message || '未知错误';
return JSON.stringify({ parse: 0, msg: `夸克: ${errorMsg}`, header: header });
}
if (down?.download_url) addUrl("原画", down.download_url);
}
let transcoding = await Quark.getLiveTranscoding(shareId, stoken, fid, share_fid_token);
if (transcoding?.length) {
transcoding.filter(t => t.accessable).forEach(t => {
if (t?.video_info?.url) {
addUrl(mapResolution(t.resolution), t.video_info.url);
}
});
}
}
if (urls.length) {
return JSON.stringify({ parse: 0, url: urls, header: header });
}
}
if (flag.startsWith('百度') && ids.length >= 5) {
let [path, uk, shareid, fsid, shareDataStr] = ids;
let shareData = safeJSONParse(shareDataStr);
let original = await Baidu.getAppShareUrl(path, uk, shareid, fsid, shareData);
if (original && !original.error) {
addUrl("原画", original);
} else {
const errorMsg = original?.message || '获取链接失败,请检查Cookie是否有效';
return JSON.stringify({ parse: 0, msg: `百度: ${errorMsg}`, header: headers });
}
if (urls.length) {
return JSON.stringify({
parse: 0,
url: urls,
header: { "User-Agent": 'netdisk;P2SP;2.2.91.136;android-android;' }
});
}
}
if (flag.startsWith('优汐') && ids.length >= 4) {
let [shareId, stoken, fid, share_fid_token] = ids;
let down = await UC.getDownload(shareId, stoken, fid, share_fid_token, true);
if (down && down.error) {
const errorMsg = down.message || '未知错误';
return JSON.stringify({ parse: 0, msg: `优汐: ${errorMsg}`, header: headers });
}
if (down?.length) {
down.forEach(item => { if (item?.url) addUrl(mapResolution(item.name), item.url); });
}
if (urls.length) {
return JSON.stringify({ parse: 0, url: urls });
}
}
return JSON.stringify({ parse: 0, msg: `解析分享链接失败, 分享链接可能已失效`, header: headers });
}
function formatSize(bytes) {
let size = typeof bytes === 'string' ? parseInt(bytes, 10) : bytes;
if (!size || isNaN(size) || size <= 0) return '0 B';
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
let i = 0;
while (size >= 1024 && i < units.length - 1) { size /= 1024; i++; }
return size.toFixed(2) + ' ' + units[i];
}
function proxyUrl(url) {
if (!url) return '';
if (enableProxy && proxyurl) return proxyurl + encodeURIComponent(url);
return url;
}
async function proxy(params) {
let url = params.url;
return [302, '', '', { 'Location': url }];
}
export function __jsEvalReturn() {
return { init, home, homeVod, category, detail, play, search, proxy };
}