Repository navigation
Expand file tree
/
Copy pathbrowser.ts
More file actions
59 lines (54 loc) · 1.87 KB
/
Copy pathbrowser.ts
File metadata and controls
59 lines (54 loc) · 1.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import { chromium, type Browser, type BrowserContext } from "playwright";
export type BrowserCookie = Parameters<BrowserContext["addCookies"]>[0][number];
type ChromeMetadata = {
architecture: string;
bitness: string;
mobile: boolean;
model: string;
platform: string;
platformVersion: string;
wow64: boolean;
};
export function launchGardenBrowser() {
return chromium.launch({
channel: "chrome",
headless: true,
args: [
"--disable-blink-features=AutomationControlled",
"--screen-info={1920x1080 workAreaBottom=40}",
"--window-size=1440,900",
],
});
}
export async function newGardenPage(browser: Browser, cookies: BrowserCookie[] = []) {
// Read Chrome's native metadata on a secure internal page before contacting the site.
const versionPage = await browser.newPage();
let identity;
try {
await versionPage.goto("chrome://version/");
identity = await versionPage.evaluate(async () => {
const { userAgentData, userAgent } = navigator as Navigator & {
userAgentData: {
getHighEntropyValues(hints: string[]): Promise<ChromeMetadata>;
};
};
const metadata = await userAgentData.getHighEntropyValues([
"architecture", "bitness", "model", "platformVersion", "wow64",
]);
return { userAgent, metadata };
});
} finally {
await versionPage.close();
}
const userAgent = identity.userAgent.replace("HeadlessChrome/", "Chrome/");
const context = await browser.newContext({ viewport: null, userAgent });
if (cookies.length > 0) await context.addCookies(cookies);
const page = await context.newPage();
const session = await context.newCDPSession(page);
// Chrome fills in its own brand list and version hints when they are omitted.
await session.send("Emulation.setUserAgentOverride", {
userAgent,
userAgentMetadata: identity.metadata,
});
return page;
}