feat: 修改脚本文件后缀名为.js
This commit is contained in:
132
src/main/scripts/open_all_channel.js
Normal file
132
src/main/scripts/open_all_channel.js
Normal file
@@ -0,0 +1,132 @@
|
||||
import { chromium } from 'playwright';
|
||||
import log from 'electron-log';
|
||||
|
||||
const parseChannels = () => {
|
||||
const raw = process.env.CHANNELS || '';
|
||||
if (!raw) return [];
|
||||
try {
|
||||
const parsed = JSON.parse(raw);
|
||||
return Array.isArray(parsed) ? parsed : [];
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
};
|
||||
|
||||
const normalizeUrl = (value) => {
|
||||
const raw = String(value || '').trim();
|
||||
if (!raw) return null;
|
||||
try {
|
||||
return new URL(raw);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const isSameTarget = (currentUrl, targetUrl) => {
|
||||
if (!currentUrl || !targetUrl) return false;
|
||||
if (currentUrl.startsWith(targetUrl)) return true;
|
||||
|
||||
const current = normalizeUrl(currentUrl);
|
||||
const target = normalizeUrl(targetUrl);
|
||||
if (!current || !target) return false;
|
||||
if (current.origin !== target.origin) return false;
|
||||
if (!current.pathname.startsWith(target.pathname)) return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
const isBlankLikePage = (url) => {
|
||||
const u = String(url || '').trim().toLowerCase();
|
||||
if (!u) return true;
|
||||
if (u === 'about:blank' || u.startsWith('about:blank#') || u.startsWith('about:blank?')) return true;
|
||||
if (u === 'chrome://newtab/' || u.startsWith('chrome://newtab')) return true;
|
||||
if (u.startsWith('chrome://new-tab-page')) return true;
|
||||
return false;
|
||||
};
|
||||
|
||||
(async () => {
|
||||
let browser;
|
||||
|
||||
try {
|
||||
const channels = parseChannels();
|
||||
|
||||
if (!channels.length) {
|
||||
log.info('No channels provided, skip.');
|
||||
return;
|
||||
}
|
||||
|
||||
browser = await chromium.connectOverCDP('http://127.0.0.1:9222');
|
||||
const context = browser.contexts()[0];
|
||||
|
||||
if (!context) {
|
||||
throw new Error('No browser context available');
|
||||
}
|
||||
|
||||
await context.addInitScript(() => {
|
||||
Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
|
||||
});
|
||||
|
||||
const usedPages = new Set();
|
||||
|
||||
for (let i = 0; i < channels.length; i++) {
|
||||
const targetUrl = channels[i]?.channelUrl;
|
||||
|
||||
if (!targetUrl) continue;
|
||||
|
||||
let pages = await context.pages();
|
||||
let page = null;
|
||||
for (let j = 0; j < pages.length; j++) {
|
||||
const p = pages[j];
|
||||
const current = p.url();
|
||||
if (isSameTarget(current, targetUrl)) {
|
||||
page = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!page) {
|
||||
for (let j = 0; j < pages.length; j++) {
|
||||
const p = pages[j];
|
||||
if (usedPages.has(p)) continue;
|
||||
if (isBlankLikePage(p.url())) {
|
||||
page = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!page) {
|
||||
page = await context.newPage();
|
||||
}
|
||||
await page.bringToFront();
|
||||
usedPages.add(page);
|
||||
|
||||
const current = page.url();
|
||||
|
||||
if (!current || !isSameTarget(current, targetUrl)) {
|
||||
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
|
||||
}
|
||||
}
|
||||
|
||||
const pagesAfter = await context.pages();
|
||||
for (const p of pagesAfter) {
|
||||
if (!usedPages.has(p)) {
|
||||
try {
|
||||
await p.close();
|
||||
} catch {}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
log.error(error);
|
||||
process.exitCode = 1;
|
||||
} finally {
|
||||
if(browser){
|
||||
try {
|
||||
if (typeof browser.disconnect === 'function') {
|
||||
await browser.disconnect();
|
||||
} else {
|
||||
await browser.close();
|
||||
}
|
||||
} catch {}
|
||||
}
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user