skills
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { spawn, execSync } from "node:child_process";
|
||||
import puppeteer from "puppeteer-core";
|
||||
|
||||
const useProfile = process.argv[2] === "--profile";
|
||||
|
||||
if (process.argv[2] && process.argv[2] !== "--profile") {
|
||||
console.log("Usage: browser-start.js [--profile]");
|
||||
console.log("\nOptions:");
|
||||
console.log(" --profile Copy your default Chrome profile (cookies, logins)");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const SCRAPING_DIR = `${process.env.HOME}/.cache/browser-tools`;
|
||||
|
||||
// Check if already running on :9222
|
||||
try {
|
||||
const browser = await puppeteer.connect({
|
||||
browserURL: "http://localhost:9222",
|
||||
defaultViewport: null,
|
||||
});
|
||||
await browser.disconnect();
|
||||
console.log("✓ Chrome already running on :9222");
|
||||
process.exit(0);
|
||||
} catch {}
|
||||
|
||||
// Setup profile directory
|
||||
execSync(`mkdir -p "${SCRAPING_DIR}"`, { stdio: "ignore" });
|
||||
|
||||
// Remove SingletonLock to allow new instance
|
||||
try {
|
||||
execSync(`rm -f "${SCRAPING_DIR}/SingletonLock" "${SCRAPING_DIR}/SingletonSocket" "${SCRAPING_DIR}/SingletonCookie"`, { stdio: "ignore" });
|
||||
} catch {}
|
||||
|
||||
if (useProfile) {
|
||||
console.log("Syncing profile...");
|
||||
execSync(
|
||||
`rsync -a --delete \
|
||||
--exclude='SingletonLock' \
|
||||
--exclude='SingletonSocket' \
|
||||
--exclude='SingletonCookie' \
|
||||
--exclude='*/Sessions/*' \
|
||||
--exclude='*/Current Session' \
|
||||
--exclude='*/Current Tabs' \
|
||||
--exclude='*/Last Session' \
|
||||
--exclude='*/Last Tabs' \
|
||||
"${process.env.HOME}/Library/Application Support/Google/Chrome/" "${SCRAPING_DIR}/"`,
|
||||
{ stdio: "pipe" },
|
||||
);
|
||||
}
|
||||
|
||||
// Start Chrome with flags to force new instance
|
||||
spawn(
|
||||
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
||||
[
|
||||
"--remote-debugging-port=9222",
|
||||
`--user-data-dir=${SCRAPING_DIR}`,
|
||||
"--no-first-run",
|
||||
"--no-default-browser-check",
|
||||
],
|
||||
{ detached: true, stdio: "ignore" },
|
||||
).unref();
|
||||
|
||||
// Wait for Chrome to be ready
|
||||
let connected = false;
|
||||
for (let i = 0; i < 30; i++) {
|
||||
try {
|
||||
const browser = await puppeteer.connect({
|
||||
browserURL: "http://localhost:9222",
|
||||
defaultViewport: null,
|
||||
});
|
||||
await browser.disconnect();
|
||||
connected = true;
|
||||
break;
|
||||
} catch {
|
||||
await new Promise((r) => setTimeout(r, 500));
|
||||
}
|
||||
}
|
||||
|
||||
if (!connected) {
|
||||
console.error("✗ Failed to connect to Chrome");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log(`✓ Chrome started on :9222${useProfile ? " with your profile" : ""}`);
|
||||
Reference in New Issue
Block a user