jumpy-lion 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-controller.d.ts +36 -0
- package/dist/browser-controller.d.ts.map +1 -0
- package/dist/browser-controller.js +84 -0
- package/dist/browser-controller.js.map +1 -0
- package/dist/browser-plugin.d.ts +56 -0
- package/dist/browser-plugin.d.ts.map +1 -0
- package/dist/browser-plugin.js +149 -0
- package/dist/browser-plugin.js.map +1 -0
- package/dist/browser-process.d.ts +10 -0
- package/dist/browser-process.d.ts.map +1 -0
- package/dist/browser-process.js +65 -0
- package/dist/browser-process.js.map +1 -0
- package/dist/browser-profiles/chrome/create.d.ts +5 -0
- package/dist/browser-profiles/chrome/create.d.ts.map +1 -0
- package/dist/browser-profiles/chrome/create.js +22 -0
- package/dist/browser-profiles/chrome/create.js.map +1 -0
- package/dist/browser-profiles/chrome/default.d.ts +175 -0
- package/dist/browser-profiles/chrome/default.d.ts.map +1 -0
- package/dist/browser-profiles/chrome/default.js +175 -0
- package/dist/browser-profiles/chrome/default.js.map +1 -0
- package/dist/browser-profiles/index.d.ts +3 -0
- package/dist/browser-profiles/index.d.ts.map +1 -0
- package/dist/browser-profiles/index.js +3 -0
- package/dist/browser-profiles/index.js.map +1 -0
- package/dist/crawler.d.ts +22 -0
- package/dist/crawler.d.ts.map +1 -0
- package/dist/crawler.js +42 -0
- package/dist/crawler.js.map +1 -0
- package/dist/events.d.ts +3 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +3 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/launcher-wrap.d.ts +10 -0
- package/dist/launcher-wrap.d.ts.map +1 -0
- package/dist/launcher-wrap.js +11 -0
- package/dist/launcher-wrap.js.map +1 -0
- package/dist/page.d.ts +79 -0
- package/dist/page.d.ts.map +1 -0
- package/dist/page.js +304 -0
- package/dist/page.js.map +1 -0
- package/dist/proxy/anonymize-proxy.d.ts +4 -0
- package/dist/proxy/anonymize-proxy.d.ts.map +1 -0
- package/dist/proxy/anonymize-proxy.js +35 -0
- package/dist/proxy/anonymize-proxy.js.map +1 -0
- package/dist/proxy/proxy-server.d.ts +2 -0
- package/dist/proxy/proxy-server.d.ts.map +1 -0
- package/dist/proxy/proxy-server.js +13 -0
- package/dist/proxy/proxy-server.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +7 -0
- package/dist/utils.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Options } from 'chrome-remote-interface';
|
|
2
|
+
import { BrowserController } from 'crawlee';
|
|
3
|
+
import type { CdpLauncher, LaunchReturn } from './launcher-wrap.js';
|
|
4
|
+
import type { Cookie } from './page.js';
|
|
5
|
+
import CdpPage from './page.js';
|
|
6
|
+
export type NewPageResult = CdpPage;
|
|
7
|
+
export default class CDPBrowserController extends BrowserController<CdpLauncher, // Library (CDP doesn't have a specific type)
|
|
8
|
+
Options, // LaunchOptions
|
|
9
|
+
LaunchReturn, // LaunchResult (CDP client)
|
|
10
|
+
{}, // NewPageOptions (empty as there are no specific options)
|
|
11
|
+
NewPageResult> {
|
|
12
|
+
private client?;
|
|
13
|
+
initialize(): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* @private
|
|
16
|
+
*/
|
|
17
|
+
protected _close(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* @private
|
|
20
|
+
*/
|
|
21
|
+
protected _kill(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* @private
|
|
24
|
+
*/
|
|
25
|
+
protected _newPage(): Promise<NewPageResult>;
|
|
26
|
+
/**
|
|
27
|
+
* @private
|
|
28
|
+
*/
|
|
29
|
+
protected _setCookies(page: NewPageResult, cookies: Cookie[]): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* @private
|
|
32
|
+
*/
|
|
33
|
+
protected _getCookies(page: NewPageResult): Promise<Cookie[]>;
|
|
34
|
+
normalizeProxyOptions(_proxyUrl: string | undefined, _pageOptions: any): Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=browser-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-controller.d.ts","sourceRoot":"","sources":["../src/browser-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAS,MAAM,SAAS,CAAC;AAGnD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,OAAO,MAAM,WAAW,CAAC;AAIhC,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC;AAEpC,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,iBAAiB,CAC/D,WAAW,EAAE,6CAA6C;AAC1D,OAAO,EAAE,gBAAgB;AACzB,YAAY,EAAE,4BAA4B;AAC1C,EAAE,EAAE,0DAA0D;AAC9D,aAAa,CAChB;IAEG,OAAO,CAAC,MAAM,CAAC,CAAa;IAEtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;OAEG;cACa,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvC;;OAEG;cACa,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC;;OAEG;cACa,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC;IAuBlD;;OAEG;cACa,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlF;;OAEG;cACa,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAS1D,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAE5G"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import CDP from 'chrome-remote-interface';
|
|
2
|
+
import { BrowserController, utils } from 'crawlee';
|
|
3
|
+
import { PAGE_CLOSED } from './events.js';
|
|
4
|
+
import CdpPage from './page.js';
|
|
5
|
+
export default class CDPBrowserController extends BrowserController {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
Object.defineProperty(this, "client", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
configurable: true,
|
|
11
|
+
writable: true,
|
|
12
|
+
value: void 0
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
async initialize() {
|
|
16
|
+
this.client = await CDP({ port: this.launchContext.debuggingPort });
|
|
17
|
+
const { Network, Page } = this.client;
|
|
18
|
+
await Network.enable();
|
|
19
|
+
await Page.enable();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* @private
|
|
23
|
+
*/
|
|
24
|
+
async _close() {
|
|
25
|
+
// @TODO:
|
|
26
|
+
// @ts-expect-error Fix types
|
|
27
|
+
this.launchContext.process.close();
|
|
28
|
+
await utils.sleep(5000);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @private
|
|
32
|
+
*/
|
|
33
|
+
async _kill() {
|
|
34
|
+
// @TODO:
|
|
35
|
+
// @ts-expect-error Fix types
|
|
36
|
+
this.launchContext.process.kill();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* @private
|
|
40
|
+
*/
|
|
41
|
+
async _newPage() {
|
|
42
|
+
if (!this.client) {
|
|
43
|
+
await this.initialize();
|
|
44
|
+
}
|
|
45
|
+
const { Target } = this.client;
|
|
46
|
+
const { targetId } = await Target.createTarget({ url: 'about:blank' });
|
|
47
|
+
const session = await CDP({ target: targetId, port: this.launchContext.debuggingPort });
|
|
48
|
+
await session.Network.enable();
|
|
49
|
+
await session.Page.enable();
|
|
50
|
+
const { targetInfos } = await Target.getTargets();
|
|
51
|
+
const pages = targetInfos.filter((target) => target.type === 'page' && !target.url.includes('chrome://'));
|
|
52
|
+
await Target.activateTarget({ targetId: pages[pages.length - 1].targetId });
|
|
53
|
+
const page = new CdpPage(session);
|
|
54
|
+
page.once(PAGE_CLOSED, () => {
|
|
55
|
+
this.activePages -= 1;
|
|
56
|
+
});
|
|
57
|
+
return page;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* @private
|
|
61
|
+
*/
|
|
62
|
+
async _setCookies(page, cookies) {
|
|
63
|
+
try {
|
|
64
|
+
await page.setCookies(cookies);
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
throw new Error(`Could not set cookies! ${e.message}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* @private
|
|
72
|
+
*/
|
|
73
|
+
async _getCookies(page) {
|
|
74
|
+
if (!page.getCookies) {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
const cookies = await page?.getCookies();
|
|
78
|
+
return cookies || [];
|
|
79
|
+
}
|
|
80
|
+
// @ts-expect-error
|
|
81
|
+
normalizeProxyOptions(_proxyUrl, _pageOptions) {
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=browser-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-controller.js","sourceRoot":"","sources":["../src/browser-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { BrowserPlugin, type LaunchContext } from 'crawlee';
|
|
2
|
+
import type { NewPageResult } from './browser-controller.js';
|
|
3
|
+
import CDPBrowserController from './browser-controller.js';
|
|
4
|
+
import { CdpLauncher, LaunchReturn } from './launcher-wrap.js';
|
|
5
|
+
type Library = CdpLauncher;
|
|
6
|
+
type LaunchResult = LaunchReturn;
|
|
7
|
+
interface NewPageOptions {
|
|
8
|
+
}
|
|
9
|
+
interface LaunchBrowserOptions {
|
|
10
|
+
browserType: string;
|
|
11
|
+
useIncognitoPages: boolean;
|
|
12
|
+
proxyUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
export default class CDPBrowserPlugin extends BrowserPlugin<Library, LaunchBrowserOptions, LaunchResult, NewPageOptions, NewPageResult> {
|
|
15
|
+
/**
|
|
16
|
+
*/
|
|
17
|
+
protected _addProxyToLaunchOptions(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Determines if the browser is Chromium-based.
|
|
20
|
+
*
|
|
21
|
+
* @private
|
|
22
|
+
*/
|
|
23
|
+
protected _isChromiumBasedBrowser(launchContext: LaunchContext<Library, LaunchBrowserOptions, LaunchResult, NewPageOptions, NewPageResult>): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Launches the browser using Chrome Remote Interface (CDP).
|
|
26
|
+
*
|
|
27
|
+
* @private
|
|
28
|
+
*/
|
|
29
|
+
protected _launch(launchContext: LaunchContext<Library, LaunchBrowserOptions, LaunchResult, NewPageOptions, NewPageResult>): Promise<LaunchResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Creates a new browser controller.
|
|
32
|
+
*
|
|
33
|
+
* @private
|
|
34
|
+
*/
|
|
35
|
+
protected _createController(): CDPBrowserController;
|
|
36
|
+
/**
|
|
37
|
+
* Launches a browser with a new profile.
|
|
38
|
+
*
|
|
39
|
+
* @private
|
|
40
|
+
*/
|
|
41
|
+
private _launchBrowser;
|
|
42
|
+
/**
|
|
43
|
+
* Waits for a port to be available.
|
|
44
|
+
*
|
|
45
|
+
* @private
|
|
46
|
+
*/
|
|
47
|
+
private _waitForPort;
|
|
48
|
+
/**
|
|
49
|
+
* Finds a free port to use.
|
|
50
|
+
*
|
|
51
|
+
* @private
|
|
52
|
+
*/
|
|
53
|
+
private _findFreePort;
|
|
54
|
+
}
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=browser-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-plugin.d.ts","sourceRoot":"","sources":["../src/browser-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAO,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI/D,KAAK,OAAO,GAAG,WAAW,CAAC;AAC3B,KAAK,YAAY,GAAG,YAAY,CAAC;AACjC,UAAU,cAAc;CAAI;AAC5B,UAAU,oBAAoB;IAAG,WAAW,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AAErG,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa,CACvD,OAAO,EACP,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,aAAa,CAChB;IACG;OACG;cACa,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzD;;;;OAIG;IACH,SAAS,CAAC,uBAAuB,CAC7B,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,GACzG,OAAO;IAKV;;;;OAIG;cACa,OAAO,CACnB,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,GACzG,OAAO,CAAC,YAAY,CAAC;IAuCxB;;;;OAIG;IAGH,SAAS,CAAC,iBAAiB,IAAI,oBAAoB;IAMnD;;;;OAIG;YACW,cAAc;IA2B5B;;;;OAIG;YACW,YAAY;IAmB1B;;;;OAIG;YACW,aAAa;CAsB9B"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import net from 'net';
|
|
2
|
+
import { Browser } from '@puppeteer/browsers';
|
|
3
|
+
import { BrowserPlugin, log } from 'crawlee';
|
|
4
|
+
import CDPBrowserController from './browser-controller.js';
|
|
5
|
+
import { launchChromeBrowserWithNewProfile } from './browser-process.js';
|
|
6
|
+
import { CdpLauncher } from './launcher-wrap.js';
|
|
7
|
+
import { anonymizeProxySugar } from './proxy/anonymize-proxy.js';
|
|
8
|
+
export default class CDPBrowserPlugin extends BrowserPlugin {
|
|
9
|
+
/**
|
|
10
|
+
*/
|
|
11
|
+
async _addProxyToLaunchOptions() {
|
|
12
|
+
// Do nothing; we use proxy launch arg
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Determines if the browser is Chromium-based.
|
|
16
|
+
*
|
|
17
|
+
* @private
|
|
18
|
+
*/
|
|
19
|
+
_isChromiumBasedBrowser(launchContext) {
|
|
20
|
+
const { browserType } = launchContext.launchOptions;
|
|
21
|
+
return browserType !== Browser.FIREFOX; // Assume non-Firefox is Chromium-based
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Launches the browser using Chrome Remote Interface (CDP).
|
|
25
|
+
*
|
|
26
|
+
* @private
|
|
27
|
+
*/
|
|
28
|
+
async _launch(launchContext) {
|
|
29
|
+
const { launchOptions, useIncognitoPages, proxyUrl } = launchContext;
|
|
30
|
+
if (!launchOptions.browserType) {
|
|
31
|
+
launchOptions.browserType = Browser.CHROME;
|
|
32
|
+
}
|
|
33
|
+
let browser;
|
|
34
|
+
launchOptions.useIncognitoPages = useIncognitoPages;
|
|
35
|
+
const [anonymizedProxyUrl, close] = await anonymizeProxySugar(proxyUrl);
|
|
36
|
+
if (anonymizedProxyUrl) {
|
|
37
|
+
launchOptions.proxyUrl = anonymizedProxyUrl;
|
|
38
|
+
}
|
|
39
|
+
const debuggingPort = await this._findFreePort(9233);
|
|
40
|
+
const browserProcess = await this._launchBrowser(debuggingPort, launchOptions);
|
|
41
|
+
try {
|
|
42
|
+
const cdpLauncher = new CdpLauncher();
|
|
43
|
+
browser = await cdpLauncher.launch({ port: debuggingPort });
|
|
44
|
+
if (anonymizedProxyUrl) {
|
|
45
|
+
browser.on('close', async () => {
|
|
46
|
+
await close();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
await close();
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
launchContext.debuggingPort = debuggingPort;
|
|
55
|
+
launchContext.process = browserProcess;
|
|
56
|
+
return browser;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Creates a new browser controller.
|
|
60
|
+
*
|
|
61
|
+
* @private
|
|
62
|
+
*/
|
|
63
|
+
// @TODO:
|
|
64
|
+
// @ts-expect-error Fix types
|
|
65
|
+
_createController() {
|
|
66
|
+
// @TODO:
|
|
67
|
+
// @ts-expect-error Fix types
|
|
68
|
+
return new CDPBrowserController(this);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Launches a browser with a new profile.
|
|
72
|
+
*
|
|
73
|
+
* @private
|
|
74
|
+
*/
|
|
75
|
+
async _launchBrowser(debuggingPort, launchOptions) {
|
|
76
|
+
const { proxyUrl, browserType } = launchOptions;
|
|
77
|
+
let browserProcess;
|
|
78
|
+
switch (browserType) {
|
|
79
|
+
case Browser.CHROME: {
|
|
80
|
+
browserProcess = await launchChromeBrowserWithNewProfile({ debuggingPort, anonymizedProxyUrl: proxyUrl });
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
default: {
|
|
84
|
+
throw new Error(`No browser found with this type: ${browserType}!`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
this._waitForPort(debuggingPort)
|
|
89
|
+
.then(() => {
|
|
90
|
+
log.info(`Browser is ready on port ${debuggingPort}`);
|
|
91
|
+
resolve(browserProcess);
|
|
92
|
+
})
|
|
93
|
+
.catch((err) => {
|
|
94
|
+
log.error(`Failed to connect to browser on port: ${debuggingPort}`, err);
|
|
95
|
+
reject(new Error(`Failed to connect to browser on port: ${debuggingPort}`));
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Waits for a port to be available.
|
|
101
|
+
*
|
|
102
|
+
* @private
|
|
103
|
+
*/
|
|
104
|
+
async _waitForPort(port, timeout = 30000, retryDelay = 500) {
|
|
105
|
+
const startTime = Date.now();
|
|
106
|
+
return new Promise((resolve, reject) => {
|
|
107
|
+
(function tryConnect() {
|
|
108
|
+
const socket = net.createConnection(port, '127.0.0.1');
|
|
109
|
+
socket.on('connect', () => {
|
|
110
|
+
socket.end();
|
|
111
|
+
resolve(true);
|
|
112
|
+
}).on('error', (_err) => {
|
|
113
|
+
if (Date.now() - startTime > timeout) {
|
|
114
|
+
reject(new Error(`Timeout waiting for port ${port}`));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
setTimeout(tryConnect, retryDelay); // Retry after a delay
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}());
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Finds a free port to use.
|
|
125
|
+
*
|
|
126
|
+
* @private
|
|
127
|
+
*/
|
|
128
|
+
async _findFreePort(startingPort) {
|
|
129
|
+
return new Promise((resolve, reject) => {
|
|
130
|
+
const server = net.createServer();
|
|
131
|
+
server.on('error', (err) => {
|
|
132
|
+
if (err.code === 'EADDRINUSE') {
|
|
133
|
+
this._findFreePort(startingPort + 1).then(resolve).catch(reject); // Port is in use, try the next one
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
reject(err);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
server.on('listening', () => {
|
|
140
|
+
const { port } = server.address();
|
|
141
|
+
server.close(() => {
|
|
142
|
+
resolve(port);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
server.listen(startingPort, '127.0.0.1');
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=browser-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-plugin.js","sourceRoot":"","sources":["../src/browser-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface LaunchBrowserOptions {
|
|
2
|
+
anonymizedProxyUrl?: string;
|
|
3
|
+
debuggingPort?: number;
|
|
4
|
+
windowWidth?: number;
|
|
5
|
+
windowHeight?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare const launchBrowserWithNewProfile: (executablePath: string, options?: LaunchBrowserOptions) => Promise<import("@puppeteer/browsers").Process>;
|
|
8
|
+
export declare const createTempUserDataDir: () => Promise<string>;
|
|
9
|
+
export declare const launchChromeBrowserWithNewProfile: (options?: LaunchBrowserOptions) => Promise<import("@puppeteer/browsers").Process>;
|
|
10
|
+
//# sourceMappingURL=browser-process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-process.d.ts","sourceRoot":"","sources":["../src/browser-process.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,oBAAoB;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AACD,eAAO,MAAM,2BAA2B,mBAA0B,MAAM,YAAW,oBAAoB,mDA6CtG,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,MAAM,CAK5D,CAAA;AAED,eAAO,MAAM,iCAAiC,aAAmB,oBAAoB,mDAIpF,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { log } from '@crawlee/core';
|
|
5
|
+
import { Browser, ChromeReleaseChannel, computeSystemExecutablePath, launch } from "@puppeteer/browsers";
|
|
6
|
+
import { createChromeProfile } from "./browser-profiles/index.js";
|
|
7
|
+
export const launchBrowserWithNewProfile = async (executablePath, options = {}) => {
|
|
8
|
+
const { anonymizedProxyUrl, debuggingPort, windowWidth = 1920, windowHeight = 1080 } = options;
|
|
9
|
+
try {
|
|
10
|
+
// Create a unique temporary directory for the browser's user data
|
|
11
|
+
const userDataDir = await createTempUserDataDir();
|
|
12
|
+
await createChromeProfile(userDataDir);
|
|
13
|
+
// Construct the browser launch command
|
|
14
|
+
const browserArgs = [
|
|
15
|
+
`--remote-debugging-port=${debuggingPort}`,
|
|
16
|
+
`--user-data-dir=${userDataDir}`,
|
|
17
|
+
"--no-sandbox",
|
|
18
|
+
"--disable-notifications",
|
|
19
|
+
"--start-maximized",
|
|
20
|
+
"--no-first-run",
|
|
21
|
+
"--start-fullscreen",
|
|
22
|
+
"--no-default-browser-check",
|
|
23
|
+
"--disable-infobars",
|
|
24
|
+
"--disable-features=IsolateOrigins,site-per-process",
|
|
25
|
+
];
|
|
26
|
+
if (anonymizedProxyUrl) {
|
|
27
|
+
browserArgs.push(`--proxy-server="${anonymizedProxyUrl}"`);
|
|
28
|
+
}
|
|
29
|
+
if (windowWidth && windowHeight) {
|
|
30
|
+
browserArgs.push(`--window-size=${windowWidth},${windowHeight}`);
|
|
31
|
+
}
|
|
32
|
+
log.debug(`Launching browser with user data dir: ${userDataDir}`);
|
|
33
|
+
const browserProcess = launch({
|
|
34
|
+
executablePath,
|
|
35
|
+
args: browserArgs,
|
|
36
|
+
onExit: async () => {
|
|
37
|
+
try {
|
|
38
|
+
await fs.rm(userDataDir, { recursive: true, force: true });
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
log.warning(`Could not delete browser profile dir: ${e.message}`);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
return browserProcess;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
log.error(`Error launching the browser: ${error}`);
|
|
49
|
+
throw new Error(`Error launching the browser: ${error}`);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
export const createTempUserDataDir = async () => {
|
|
53
|
+
const tempDirPrefix = path.join(os.tmpdir(), 'browser_');
|
|
54
|
+
const userDataDir = await fs.mkdtemp(tempDirPrefix);
|
|
55
|
+
return userDataDir;
|
|
56
|
+
};
|
|
57
|
+
export const launchChromeBrowserWithNewProfile = async (options = {}) => {
|
|
58
|
+
const executablePath = computeSystemExecutablePath({ browser: Browser.CHROME, channel: ChromeReleaseChannel.STABLE });
|
|
59
|
+
return launchBrowserWithNewProfile(executablePath, options);
|
|
60
|
+
};
|
|
61
|
+
// export const launchBraveBrowserWithNewProfile = async (options: LaunchBrowserOptions = {}) => {
|
|
62
|
+
// const executablePath = getBraveExecutablePath();
|
|
63
|
+
// return launchBrowserWithNewProfile(executablePath, options);
|
|
64
|
+
// };
|
|
65
|
+
//# sourceMappingURL=browser-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-process.js","sourceRoot":"","sources":["../src/browser-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/create.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,mBAAmB,YAAa,GAAG,mBAAkB,GAAG,QAMpE,CAAA;AACD,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAYjH"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { DEFAULT_PROFILE } from './default.js';
|
|
4
|
+
// Preparation for modifying the browser profile based on options
|
|
5
|
+
// @TODO: Implement
|
|
6
|
+
export const modifyChromeProfile = (profile, profileOptions = {}) => {
|
|
7
|
+
if (profileOptions.locale) {
|
|
8
|
+
return profile;
|
|
9
|
+
}
|
|
10
|
+
return profile;
|
|
11
|
+
};
|
|
12
|
+
export async function createChromeProfile(profilePath, profileOptions) {
|
|
13
|
+
if (!profilePath) {
|
|
14
|
+
throw new Error("Profile path cannot be empty");
|
|
15
|
+
}
|
|
16
|
+
// Create the Preferences file
|
|
17
|
+
const preferencesPath = path.join(profilePath, 'Default', 'Preferences');
|
|
18
|
+
await fs.mkdir(path.dirname(preferencesPath), { recursive: true });
|
|
19
|
+
const preferences = profileOptions ? modifyChromeProfile(DEFAULT_PROFILE, profileOptions) : DEFAULT_PROFILE;
|
|
20
|
+
await fs.writeFile(preferencesPath, JSON.stringify(preferences, null, 2));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,iEAAiE;AACjE,mBAAmB;AACnB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAY,EAAE,iBAAsB,EAAE,EAAE,EAAE;IAC1E,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;QACxB,OAAO,OAAO,CAAA;IAClB,CAAC;IACD,OAAO,OAAO,CAAA;AAElB,CAAC,CAAA;AACD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,cAAmC;IAC9F,IAAG,CAAC,WAAW,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC;IACD,8BAA8B;IAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACzE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnE,MAAM,WAAW,GAAG,cAAc,CAAA,CAAC,CAAC,mBAAmB,CAAC,eAAe,EAAE,cAAc,CAAC,CAAA,CAAC,CAAC,eAAe,CAAC;IAE1G,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAE9E,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
export declare const DEFAULT_PROFILE: {
|
|
2
|
+
distribution: {
|
|
3
|
+
import_bookmarks: boolean;
|
|
4
|
+
import_history: boolean;
|
|
5
|
+
import_search_engine: boolean;
|
|
6
|
+
make_chrome_default_for_user: boolean;
|
|
7
|
+
skip_first_run_ui: boolean;
|
|
8
|
+
suppress_first_run_bubble: boolean;
|
|
9
|
+
suppress_first_run_default_browser_prompt: boolean;
|
|
10
|
+
};
|
|
11
|
+
default_apps_install_state: number;
|
|
12
|
+
default_search_provider: {
|
|
13
|
+
choice_screen_completion_timestamp: string;
|
|
14
|
+
choice_screen_completion_version: string;
|
|
15
|
+
choice_screen_random_shuffle_seed: string;
|
|
16
|
+
choice_screen_shuffle_milestone: number;
|
|
17
|
+
guid: string;
|
|
18
|
+
keywords_use_extended_list: boolean;
|
|
19
|
+
synced_guid: string;
|
|
20
|
+
};
|
|
21
|
+
browser: {
|
|
22
|
+
app_window_placement: {
|
|
23
|
+
DevToolsApp: {
|
|
24
|
+
always_on_top: boolean;
|
|
25
|
+
bottom: number;
|
|
26
|
+
left: number;
|
|
27
|
+
maximized: boolean;
|
|
28
|
+
right: number;
|
|
29
|
+
top: number;
|
|
30
|
+
work_area_bottom: number;
|
|
31
|
+
work_area_left: number;
|
|
32
|
+
work_area_right: number;
|
|
33
|
+
work_area_top: number;
|
|
34
|
+
};
|
|
35
|
+
_crx_mdpkiolbdkhdjpekfbkbmhigcaggjagi: {
|
|
36
|
+
bottom: number;
|
|
37
|
+
left: number;
|
|
38
|
+
maximized: boolean;
|
|
39
|
+
right: number;
|
|
40
|
+
top: number;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
back_shortcut_bubble_shown_count: number;
|
|
44
|
+
clear_data: {
|
|
45
|
+
browsing_history_basic: boolean;
|
|
46
|
+
cache_basic: boolean;
|
|
47
|
+
cookies_basic: boolean;
|
|
48
|
+
hosted_apps_data: boolean;
|
|
49
|
+
site_settings: boolean;
|
|
50
|
+
time_period_basic: number;
|
|
51
|
+
};
|
|
52
|
+
has_seen_welcome_page: boolean;
|
|
53
|
+
last_clear_browsing_data_tab: number;
|
|
54
|
+
show_fullscreen_toolbar: boolean;
|
|
55
|
+
theme: {
|
|
56
|
+
color_variant: number;
|
|
57
|
+
user_color: number;
|
|
58
|
+
};
|
|
59
|
+
window_placement: {
|
|
60
|
+
always_on_top: boolean;
|
|
61
|
+
bottom: number;
|
|
62
|
+
left: number;
|
|
63
|
+
maximized: boolean;
|
|
64
|
+
right: number;
|
|
65
|
+
top: number;
|
|
66
|
+
work_area_bottom: number;
|
|
67
|
+
work_area_left: number;
|
|
68
|
+
work_area_right: number;
|
|
69
|
+
work_area_top: number;
|
|
70
|
+
};
|
|
71
|
+
window_placement_popup: {
|
|
72
|
+
bottom: number;
|
|
73
|
+
left: number;
|
|
74
|
+
maximized: boolean;
|
|
75
|
+
right: number;
|
|
76
|
+
top: number;
|
|
77
|
+
work_area_bottom: number;
|
|
78
|
+
work_area_left: number;
|
|
79
|
+
work_area_right: number;
|
|
80
|
+
work_area_top: number;
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
profile: {
|
|
84
|
+
avatar_index: number;
|
|
85
|
+
background_password_check: {
|
|
86
|
+
check_fri_weight: number;
|
|
87
|
+
check_interval: string;
|
|
88
|
+
check_mon_weight: number;
|
|
89
|
+
check_sat_weight: number;
|
|
90
|
+
check_sun_weight: number;
|
|
91
|
+
check_thu_weight: number;
|
|
92
|
+
check_tue_weight: number;
|
|
93
|
+
check_wed_weight: number;
|
|
94
|
+
next_check_time: string;
|
|
95
|
+
};
|
|
96
|
+
blacklisted_credentials_stripped: boolean;
|
|
97
|
+
content_settings: {
|
|
98
|
+
did_migrate_adaptive_notification_quieting_to_cpss: boolean;
|
|
99
|
+
disable_quiet_permission_ui_time: {
|
|
100
|
+
notifications: string;
|
|
101
|
+
};
|
|
102
|
+
enable_cpss: {
|
|
103
|
+
notifications: boolean;
|
|
104
|
+
};
|
|
105
|
+
enable_quiet_permission_ui: {
|
|
106
|
+
notifications: boolean;
|
|
107
|
+
};
|
|
108
|
+
enable_quiet_permission_ui_enabling_method: {
|
|
109
|
+
notifications: number;
|
|
110
|
+
};
|
|
111
|
+
pref_version: number;
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
session: {
|
|
115
|
+
restore_on_startup: number;
|
|
116
|
+
};
|
|
117
|
+
bookmark_bar: {
|
|
118
|
+
show_on_all_tabs: boolean;
|
|
119
|
+
};
|
|
120
|
+
sync_promo: {
|
|
121
|
+
user_skipped: boolean;
|
|
122
|
+
show_on_first_run_allowed: boolean;
|
|
123
|
+
};
|
|
124
|
+
alternate_error_pages: {
|
|
125
|
+
enabled: boolean;
|
|
126
|
+
};
|
|
127
|
+
safebrowsing: {
|
|
128
|
+
advanced_protection_last_refresh: string;
|
|
129
|
+
enabled: boolean;
|
|
130
|
+
event_timestamps: {};
|
|
131
|
+
metrics_last_log_time: string;
|
|
132
|
+
next_password_capture_event_log_time: string;
|
|
133
|
+
saw_interstitial_sber2: boolean;
|
|
134
|
+
scout_group_selected: boolean;
|
|
135
|
+
scout_reporting_enabled: boolean;
|
|
136
|
+
scout_reporting_enabled_when_deprecated: boolean;
|
|
137
|
+
unhandled_sync_password_reuses: {};
|
|
138
|
+
};
|
|
139
|
+
search: {
|
|
140
|
+
suggest_enabled: boolean;
|
|
141
|
+
};
|
|
142
|
+
privacy_sandbox: {
|
|
143
|
+
first_party_sets_data_access_allowed_initialized: boolean;
|
|
144
|
+
m1: {
|
|
145
|
+
ad_measurement_enabled: boolean;
|
|
146
|
+
consent_decision_made: boolean;
|
|
147
|
+
eea_notice_acknowledged: boolean;
|
|
148
|
+
fledge_enabled: boolean;
|
|
149
|
+
prompt_suppressed: number;
|
|
150
|
+
topics_enabled: boolean;
|
|
151
|
+
};
|
|
152
|
+
topics_consent: {
|
|
153
|
+
consent_given: boolean;
|
|
154
|
+
last_update_reason: number;
|
|
155
|
+
last_update_time: string;
|
|
156
|
+
text_at_last_update: string;
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
signin: {
|
|
160
|
+
allowed: boolean;
|
|
161
|
+
allowed_on_next_startup: boolean;
|
|
162
|
+
};
|
|
163
|
+
extensions: {
|
|
164
|
+
theme: {
|
|
165
|
+
use_system: boolean;
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
autofill: {
|
|
169
|
+
enabled: boolean;
|
|
170
|
+
};
|
|
171
|
+
intl: {
|
|
172
|
+
accept_languages: string;
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=default.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/default.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6K3B,CAAA"}
|