diff --git a/src/main/core/ipc.ts b/src/main/core/ipc.ts index 2ea473c50..568b61026 100644 --- a/src/main/core/ipc.ts +++ b/src/main/core/ipc.ts @@ -130,9 +130,9 @@ const ipcListen = () => { } }); - ipcMain.handle('sniffer-media', async (_, url) => { + ipcMain.handle('sniffer-media', async (_, url, script) => { const ua = setting.find({ key: "ua" }).value; - const res = await puppeteerInElectron(url, ua); + const res = await puppeteerInElectron(url, script, ua); return res; }); diff --git a/src/main/utils/pie.ts b/src/main/utils/pie.ts index 244b3759d..d317a509c 100644 --- a/src/main/utils/pie.ts +++ b/src/main/utils/pie.ts @@ -45,14 +45,14 @@ const isVideoUrl = (reqUrl) => { return reqUrl.match(urlRegex) && !isExcludedUrl(reqUrl); } - -const puppeteerInElectron = async (url: string, ua: string | null = null): Promise => { +const puppeteerInElectron = async (url: string, script: string = '', ua: string | null = null): Promise => { logger.info(`[sniffer] sniffer url: ${url}`); + logger.info(`[sniffer] sniffer script: ${script}`); logger.info(`[sniffer] sniffer ua: ${ua}`); try { const browser = await pie.connect(app, puppeteer as any); // 连接puppeteer - snifferWindow = new BrowserWindow({ show: false }); // 创建无界面窗口 + snifferWindow = new BrowserWindow({ show: true }); // 创建无界面窗口 snifferWindow.webContents.setAudioMuted(true); // 设置窗口静音 const page = await pie.getPage(browser, snifferWindow); // 获取页面 @@ -60,7 +60,7 @@ const puppeteerInElectron = async (url: string, ua: string | null = null): Promi await page.setRequestInterception(true); // 开启请求拦截 - return new Promise((resolve, reject) => { + return new Promise(async(resolve, reject) => { page.on('request', async(req) => { const reqUrl = req.url(); // 请求url @@ -73,15 +73,19 @@ const puppeteerInElectron = async (url: string, ua: string | null = null): Promi await page.close(); await browser.disconnect(); - req.abort().catch((e) => console.error(e)); + req.abort().catch((e) => logger.error(e)); resolve(handleResponse(200, 'sucess', { url: reqUrl, header: headers })); } if (req.isInterceptResolutionHandled()) return; // 已处理过的请求不再处理 - if (req.resourceType() === 'image') { - req.abort().catch((err) => console.error(err)); + if (req.method().toLowerCase() === 'head') { + req.abort().catch((err) => logger.error(err)); + } + const resourceTypesToAbort = ['image', 'stylesheet', 'font']; + if (resourceTypesToAbort.includes(req.resourceType())) { + req.abort().catch((err) => logger.error(err)); } else { - req.continue().catch((err) => console.error(err)); + req.continue().catch((err) => logger.error(err)); } }); @@ -95,11 +99,36 @@ const puppeteerInElectron = async (url: string, ua: string | null = null): Promi }, 15000); } - page.goto(url).catch(e => reject(e)); + await page.goto(url, { waitUntil: 'domcontentloaded' }).catch(err => reject(err)); + if (script) { + try { + logger.info(`[pie]start run script`) + const js_code = ` + (function() { + var scriptTimer; + var scriptCounter = 0; + scriptTimer = setInterval(function() { + if (location.href !== 'about:blank') { + scriptCounter += 1; + console.log('---第' + scriptCounter + '次执行script[' + location.href + ']---'); + ${script} + clearInterval(scriptTimer); + scriptCounter = 0; + console.log('---执行script成功---'); + } + }, 200); + })(); + `; + await page.evaluateOnNewDocument(script=js_code); + await page.evaluate(js_code); + } catch (err) { + logger.info(`[pie][error]run script: ${err}`); + } + } }); - } catch (e) { - return handleResponse(500, 'fail', e as Error); + } catch (err) { + return handleResponse(500, 'fail', err as Error); } }; -export default puppeteerInElectron; \ No newline at end of file +export default puppeteerInElectron; diff --git a/src/renderer/src/pages/Play.vue b/src/renderer/src/pages/Play.vue index 3dd7a455b..74b11757b 100644 --- a/src/renderer/src/pages/Play.vue +++ b/src/renderer/src/pages/Play.vue @@ -316,7 +316,7 @@ import 'v3-infinite-loading/lib/style.css'; import 'xgplayer/es/plugins/danmu/index.css'; import Base64 from 'crypto-js/enc-base64'; -import Utf8 from 'crypto-js/enc-utf8.js'; +import Utf8 from 'crypto-js/enc-utf8'; import DPlayer from 'dplayer'; import flvjs from 'flv.js'; @@ -878,8 +878,8 @@ const fetchHipyPlayUrlHelper = async (site: { [key: string]: any }, flag: string try { const playRes = await fetchHipyPlayUrl(site, flag, url); playUrl = playRes.url; - script = playRes.js?Base64.stringify(Utf8.parse(playRes.js)):''; - extra = playRes.parse_extra||extra; + script = playRes.js ? Base64.stringify(Utf8.parse(playRes.js)) : ''; + extra = playRes.parse_extra || extra; console.log(`[detail][hipy][return]${playUrl}`); } catch (err) { console.log(`[detail][hipy][error]${err}`); @@ -902,8 +902,8 @@ const fetchT3PlayUrlHelper = async (flag: string, id: string, flags: string[] = }; playUrl = playRes.url; - script = playRes.js?Base64.stringify(Utf8.parse(playRes.js)):''; - extra = playRes.parse_extra||extra; + script = playRes.js ? Base64.stringify(Utf8.parse(playRes.js)) : ''; + extra = playRes.parse_extra || extra; console.log(`[detail][t3][return]${playUrl}`); } catch (err) { console.log(`[detail][t3][error]${err}`); @@ -1017,9 +1017,9 @@ const initFilmPlayer = async (isFirst) => { tmp.url = url; tmp.sourceUrl = url; let playerUrl = url; - let script:string = ''; - let extra:string = ''; - let playData: object = {playUrl:url,script:'',extra:''}; + let script: string = ''; + let extra: string = ''; + let playData: object = { playUrl: url, script: '',extra: ''}; if (site.playUrl) { playerUrl = await fetchJsonPlayUrlHelper(site.playUrl, url); @@ -1084,12 +1084,10 @@ const initFilmPlayer = async (isFirst) => { console.log(`[detail][sniffer][reveal]尝试提取播放链接,type:${site.type}`); try { MessagePlugin.info('嗅探资源中, 如10s没有结果请换源,咻咻咻!'); - let snifferPlayUrl:string = url; - if(snifferMode.type === 'custom'){ - let snifferTool = new URL(snifferMode.url); - let snifferApi = snifferTool.origin + snifferTool.pathname; - snifferPlayUrl = `${snifferApi}?url=${url}&script=${script}${extra}`; - } + let snifferPlayUrl: string = url; + let snifferTool = new URL(snifferMode.url); + let snifferApi = snifferTool.origin + snifferTool.pathname; + snifferPlayUrl = `${snifferApi}?url=${url}&script=${script}${extra}`; playerUrl = await sniffer(snifferMode.type, snifferPlayUrl); createPlayer(playerUrl); } catch (err) { diff --git a/src/renderer/src/pages/film/Detail.vue b/src/renderer/src/pages/film/Detail.vue index 47bc44a4b..80a147caa 100644 --- a/src/renderer/src/pages/film/Detail.vue +++ b/src/renderer/src/pages/film/Detail.vue @@ -96,7 +96,7 @@