puppeteer-pro 1.9.11 → 2.1.0
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/README.md +86 -84
- package/index.d.ts +36 -21
- package/index.d.ts.map +1 -1
- package/index.js +99 -78
- package/index.js.map +1 -1
- package/package.json +2 -2
- package/plugins/anonymize.user.agent/index.d.ts +3 -4
- package/plugins/anonymize.user.agent/index.d.ts.map +1 -1
- package/plugins/anonymize.user.agent/index.js +2 -2
- package/plugins/anonymize.user.agent/index.js.map +1 -1
- package/plugins/avoid.detection/index.d.ts +3 -4
- package/plugins/avoid.detection/index.d.ts.map +1 -1
- package/plugins/avoid.detection/index.js +4 -4
- package/plugins/avoid.detection/index.js.map +1 -1
- package/plugins/block.resources/index.d.ts +1 -1
- package/plugins/block.resources/index.d.ts.map +1 -1
- package/plugins/block.resources/index.js +2 -2
- package/plugins/block.resources/index.js.map +1 -1
- package/plugins/disable.dialogs/index.d.ts +1 -1
- package/plugins/disable.dialogs/index.d.ts.map +1 -1
- package/plugins/disable.dialogs/index.js +2 -2
- package/plugins/disable.dialogs/index.js.map +1 -1
- package/plugins/manage.cookies/index.d.ts +1 -1
- package/plugins/manage.cookies/index.d.ts.map +1 -1
- package/plugins/manage.cookies/index.js +10 -7
- package/plugins/manage.cookies/index.js.map +1 -1
- package/plugins/manage.localstorage/index.d.ts +1 -1
- package/plugins/manage.localstorage/index.d.ts.map +1 -1
- package/plugins/manage.localstorage/index.js +2 -2
- package/plugins/manage.localstorage/index.js.map +1 -1
- package/plugins/solve.recaptchas/index.d.ts +12 -0
- package/plugins/solve.recaptchas/index.d.ts.map +1 -0
- package/plugins/{solve.recaptcha → solve.recaptchas}/index.js +6 -6
- package/plugins/solve.recaptchas/index.js.map +1 -0
- package/plugins/{solve.recaptcha → solve.recaptchas}/injections/utils.js +144 -144
- package/plugins/solve.recaptcha/index.d.ts +0 -12
- package/plugins/solve.recaptcha/index.d.ts.map +0 -1
- package/plugins/solve.recaptcha/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,84 +1,86 @@
|
|
|
1
|
-
# Puppeteer-Pro
|
|
2
|
-
|
|
3
|
-
A simple [`puppeteer`](https://github.com/puppeteer/puppeteer) wrapper to enable useful plugins with ease
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
Requires node v10 and higher
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm install puppeteer-pro
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Quickstart
|
|
14
|
-
|
|
15
|
-
Puppeteer-Pro can do all the same things as [`puppeteer`](https://github.com/puppeteer/puppeteer), just now with plugins!
|
|
16
|
-
|
|
17
|
-
```js
|
|
18
|
-
// Puppeteer-Pro is a drop-in replacement for puppeteer
|
|
19
|
-
const PuppeteerPro = require('puppeteer-pro');
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
PuppeteerPro.
|
|
23
|
-
|
|
24
|
-
// Enable the '
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
await page.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
await
|
|
38
|
-
await solver.
|
|
39
|
-
await
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
- If amongst 5 handlers,
|
|
50
|
-
- If amongst 5 handlers,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
1
|
+
# Puppeteer-Pro
|
|
2
|
+
|
|
3
|
+
A simple [`puppeteer`](https://github.com/puppeteer/puppeteer) wrapper to enable useful plugins with ease
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Requires node v10 and higher
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install puppeteer-pro
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Quickstart
|
|
14
|
+
|
|
15
|
+
Puppeteer-Pro can do all the same things as [`puppeteer`](https://github.com/puppeteer/puppeteer), just now with plugins!
|
|
16
|
+
|
|
17
|
+
```js
|
|
18
|
+
// Puppeteer-Pro is a drop-in replacement for puppeteer
|
|
19
|
+
const PuppeteerPro = require('puppeteer-pro');
|
|
20
|
+
|
|
21
|
+
(async () => {
|
|
22
|
+
const browser = await PuppeteerPro.launch();
|
|
23
|
+
|
|
24
|
+
// Enable the 'avoidDetection' plugin to prevent headless detection
|
|
25
|
+
browser.avoidDetection();
|
|
26
|
+
|
|
27
|
+
// Enable the 'solveRecaptchas' plugin to solve Google's recaptchas (remember to provide a wit.api API access token)
|
|
28
|
+
const solver = await browser.solveRecaptchas('WIT_AI_ACCESS_TOKEN');
|
|
29
|
+
|
|
30
|
+
const page = await browser.newPage();
|
|
31
|
+
|
|
32
|
+
console.log('Testing the 🐱👤 avoidDetection 🐱👤 plugin..')
|
|
33
|
+
await page.goto('https://arh.antoinevastel.com/bots/areyouheadless');
|
|
34
|
+
await page.screenshot({ path: 'are-you-headless.png' });
|
|
35
|
+
|
|
36
|
+
console.log('Testing the recaptcha solver..')
|
|
37
|
+
await page.goto('https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php');
|
|
38
|
+
await solver.waitForCaptcha(page); // Captcha script is deferred, so will load after page.goto completes
|
|
39
|
+
await solver.solveRecaptcha(page);
|
|
40
|
+
await page.screenshot({ path: 'is-recaptcha-solved.png' });
|
|
41
|
+
|
|
42
|
+
await browser.close();
|
|
43
|
+
})();
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Passive Improvements
|
|
47
|
+
|
|
48
|
+
- There can be multiple request interception handlers for the same request. In such cases, the resulting response will prioritize [`respond`](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#httprequestrespondresponse), followed by [`abort`](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#httprequestaborterrorcode), followed by [`continue`](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#httprequestcontinueoverrides). For example:
|
|
49
|
+
- If amongst 5 handlers, respond is called 1 time, abort is called 2 times and continue is called 2 times, the result will be `respond`. This will occur after the first respond is called and not when all handlers are finished.
|
|
50
|
+
- If amongst 5 handlers, abort is called 1 time and continue is called 4 times, the result will be `abort`. This will occur after all handlers are finished.
|
|
51
|
+
- If amongst 5 handlers, all handlers call continue, the result will be `continue`. This will occur after all handlers are finished.
|
|
52
|
+
- New `page.waitAndClick` function that sequentially runs `page.waitForSelector` and `page.click`.
|
|
53
|
+
|
|
54
|
+
## Optional Built-in Plugins
|
|
55
|
+
|
|
56
|
+
### Anonymize User Agent
|
|
57
|
+
|
|
58
|
+
- Anonymize the user-agent across all pages
|
|
59
|
+
|
|
60
|
+
### Avoid Detection
|
|
61
|
+
|
|
62
|
+
- Multiple techniques to combat headless browser detection
|
|
63
|
+
|
|
64
|
+
### Block Resources
|
|
65
|
+
|
|
66
|
+
- Block any [resource type](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#httprequestresourcetype) from loading
|
|
67
|
+
- Can be used to speed up loading websites by blocking style sheets and images
|
|
68
|
+
|
|
69
|
+
### Disable Dialogs
|
|
70
|
+
|
|
71
|
+
- Block dialogs from popping up and stopping execution
|
|
72
|
+
|
|
73
|
+
### Manage Cookies
|
|
74
|
+
|
|
75
|
+
- Save and load cookies across sessions
|
|
76
|
+
- Supports multiple profiles and switching between profiles
|
|
77
|
+
|
|
78
|
+
### Manage Local Storage
|
|
79
|
+
|
|
80
|
+
- Save and load local storage across sessions
|
|
81
|
+
- Supports multiple profiles and switching between profiles
|
|
82
|
+
|
|
83
|
+
### Solve Recaptcha
|
|
84
|
+
|
|
85
|
+
- Solve Google's reCAPTCHA v2
|
|
86
|
+
- Requires a FREE [wit.ai](https://wit.ai/apps) access token
|
package/index.d.ts
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
|
+
import * as events from 'events';
|
|
1
2
|
import * as Puppeteer from 'puppeteer';
|
|
2
|
-
export declare function connect(options?: Puppeteer.ConnectOptions): Promise<
|
|
3
|
-
|
|
4
|
-
export
|
|
3
|
+
export declare function connect(options?: Puppeteer.ConnectOptions): Promise<Browser>;
|
|
4
|
+
export declare function launch(options?: Puppeteer.LaunchOptions & Puppeteer.ConnectOptions): Promise<Browser>;
|
|
5
|
+
export interface Browser extends Puppeteer.Browser, Pluginable {
|
|
6
|
+
createBrowserContext(options?: Puppeteer.BrowserContextOptions): Promise<BrowserContext>;
|
|
7
|
+
newPage(): Promise<Page>;
|
|
8
|
+
}
|
|
9
|
+
export interface BrowserContext extends Puppeteer.BrowserContext, Pluginable {
|
|
10
|
+
newPage(): Promise<Page>;
|
|
11
|
+
}
|
|
12
|
+
export interface Page extends Puppeteer.Page {
|
|
13
|
+
waitAndClick(selector: string, options?: Readonly<Puppeteer.ClickOptions>): Promise<void>;
|
|
14
|
+
}
|
|
5
15
|
export declare class Plugin {
|
|
6
|
-
protected browser:
|
|
16
|
+
protected browser: Browser | BrowserContext | null;
|
|
7
17
|
private initialized;
|
|
8
18
|
private startCounter;
|
|
9
19
|
protected dependencies: Plugin[];
|
|
@@ -11,11 +21,11 @@ export declare class Plugin {
|
|
|
11
21
|
get isInitialized(): boolean;
|
|
12
22
|
get isStopped(): boolean;
|
|
13
23
|
addDependency(plugin: Plugin): Promise<void>;
|
|
14
|
-
init(browser:
|
|
15
|
-
protected afterLaunch(_browser:
|
|
24
|
+
init(browser: Browser | BrowserContext): Promise<void>;
|
|
25
|
+
protected afterLaunch(_browser: Browser | BrowserContext): Promise<void>;
|
|
16
26
|
protected onClose(): Promise<void>;
|
|
17
27
|
protected onTargetCreated(target: Puppeteer.Target): Promise<void>;
|
|
18
|
-
protected onPageCreated(_page:
|
|
28
|
+
protected onPageCreated(_page: Page): Promise<void>;
|
|
19
29
|
protected onRequest(request: Puppeteer.HTTPRequest): Promise<void>;
|
|
20
30
|
protected processRequest(_request: Puppeteer.HTTPRequest): Promise<void>;
|
|
21
31
|
protected onDialog(dialog: Dialog): Promise<void>;
|
|
@@ -28,24 +38,29 @@ export declare class Plugin {
|
|
|
28
38
|
protected afterStop(): Promise<void>;
|
|
29
39
|
protected getFirstPage(): Promise<Puppeteer.Page | null>;
|
|
30
40
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
41
|
+
interface Pluginable {
|
|
42
|
+
plugins: Plugin[];
|
|
43
|
+
browserEvents: events.EventEmitter;
|
|
44
|
+
interceptions: number;
|
|
45
|
+
addPlugin: (plugin: Plugin) => Promise<void>;
|
|
46
|
+
clearPlugins: () => void;
|
|
47
|
+
anonymizeUserAgent: () => Promise<AnonymizeUserAgentPlugin>;
|
|
48
|
+
avoidDetection: () => Promise<AvoidDetectionPlugin>;
|
|
49
|
+
blockResources: (...resources: Resource[]) => Promise<BlockResourcesPlugin>;
|
|
50
|
+
disableDialogs: (logMessages?: boolean) => Promise<DisableDialogsPlugin>;
|
|
51
|
+
manageCookies: (opts: ManageCookiesOption) => Promise<ManageCookiesPlugin>;
|
|
52
|
+
manageLocalStorage: (opts: ManageLocalStorageOption) => Promise<ManageLocalStoragePlugin>;
|
|
53
|
+
solveRecaptchas: (accessToken: string) => Promise<SolveRecaptchasPlugin>;
|
|
54
|
+
}
|
|
55
|
+
interface Dialog extends Puppeteer.Dialog {
|
|
56
|
+
handled: boolean;
|
|
57
|
+
}
|
|
58
|
+
import { AnonymizeUserAgentPlugin } from './plugins/anonymize.user.agent';
|
|
35
59
|
import { AvoidDetectionPlugin } from './plugins/avoid.detection';
|
|
36
|
-
export declare function avoidDetection(): AvoidDetectionPlugin;
|
|
37
60
|
import { BlockResourcesPlugin, Resource } from './plugins/block.resources';
|
|
38
|
-
export declare function blockResources(...resources: Resource[]): BlockResourcesPlugin;
|
|
39
61
|
import { DisableDialogsPlugin } from './plugins/disable.dialogs';
|
|
40
|
-
export declare function disableDialogs(logMessages?: boolean): DisableDialogsPlugin;
|
|
41
62
|
import { ManageCookiesOption, ManageCookiesPlugin } from './plugins/manage.cookies';
|
|
42
|
-
export declare function manageCookies(opts: ManageCookiesOption): ManageCookiesPlugin;
|
|
43
63
|
import { ManageLocalStorageOption, ManageLocalStoragePlugin } from './plugins/manage.localstorage';
|
|
44
|
-
|
|
45
|
-
import { SolveRecaptchaPlugin } from './plugins/solve.recaptcha';
|
|
46
|
-
export declare function solveRecaptchas(accessToken: string): SolveRecaptchaPlugin;
|
|
47
|
-
interface Dialog extends Puppeteer.Dialog {
|
|
48
|
-
handled: boolean;
|
|
49
|
-
}
|
|
64
|
+
import { SolveRecaptchasPlugin } from './plugins/solve.recaptchas';
|
|
50
65
|
export {};
|
|
51
66
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/index.js
CHANGED
|
@@ -3,50 +3,114 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Plugin = void 0;
|
|
4
4
|
exports.connect = connect;
|
|
5
5
|
exports.launch = launch;
|
|
6
|
-
exports.addPlugin = addPlugin;
|
|
7
|
-
exports.clearPlugins = clearPlugins;
|
|
8
|
-
exports.anonymizeUserAgent = anonymizeUserAgent;
|
|
9
|
-
exports.avoidDetection = avoidDetection;
|
|
10
|
-
exports.blockResources = blockResources;
|
|
11
|
-
exports.disableDialogs = disableDialogs;
|
|
12
|
-
exports.manageCookies = manageCookies;
|
|
13
|
-
exports.manageLocalStorage = manageLocalStorage;
|
|
14
|
-
exports.solveRecaptchas = solveRecaptchas;
|
|
15
6
|
/* eslint-disable prefer-rest-params */
|
|
16
7
|
const events = require("events");
|
|
17
8
|
// Puppeteer Defaults
|
|
18
9
|
const Puppeteer = require("puppeteer");
|
|
19
|
-
const browserEvents = new events.EventEmitter();
|
|
20
10
|
async function connect(options) {
|
|
21
11
|
const browser = await Puppeteer.connect(options || {});
|
|
22
|
-
|
|
23
|
-
await plugin.init(browser);
|
|
24
|
-
}
|
|
25
|
-
const _close = browser.close;
|
|
26
|
-
browser.close = async () => {
|
|
27
|
-
await _close.apply(browser);
|
|
28
|
-
browserEvents.emit('close');
|
|
29
|
-
};
|
|
30
|
-
return browser;
|
|
12
|
+
return createBrowser(browser);
|
|
31
13
|
}
|
|
32
|
-
/** The method launches a browser instance with given arguments. The browser will be closed when the parent node.js process is closed. */
|
|
33
14
|
async function launch(options) {
|
|
34
15
|
if (!options)
|
|
35
16
|
options = {};
|
|
36
17
|
process.env.PUPPETEER_DISABLE_HEADLESS_WARNING = 'true';
|
|
37
18
|
const browser = await Puppeteer.launch({ defaultViewport: undefined, ...options });
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
19
|
+
return createBrowser(browser);
|
|
20
|
+
}
|
|
21
|
+
async function createBrowser(puppeteerBrowser) {
|
|
22
|
+
const browser = puppeteerBrowser;
|
|
41
23
|
const _close = browser.close;
|
|
42
24
|
browser.close = async () => {
|
|
43
25
|
await _close.apply(browser);
|
|
44
|
-
browserEvents.emit('close');
|
|
26
|
+
browser.browserEvents.emit('close');
|
|
27
|
+
};
|
|
28
|
+
const _createBrowserContext = browser.createBrowserContext;
|
|
29
|
+
browser.createBrowserContext = async (options) => {
|
|
30
|
+
const context = await _createBrowserContext.apply(browser, options);
|
|
31
|
+
return createBrowserContext(context);
|
|
45
32
|
};
|
|
33
|
+
const _newPage = browser.newPage;
|
|
34
|
+
browser.newPage = async () => {
|
|
35
|
+
const page = await _newPage.apply(browser);
|
|
36
|
+
return newPage(page);
|
|
37
|
+
};
|
|
38
|
+
addPluginSupport(browser);
|
|
39
|
+
return browser;
|
|
40
|
+
}
|
|
41
|
+
async function createBrowserContext(puppeteerBrowserContext) {
|
|
42
|
+
const browser = puppeteerBrowserContext;
|
|
43
|
+
const _close = browser.close;
|
|
44
|
+
browser.close = async () => {
|
|
45
|
+
await _close.apply(browser);
|
|
46
|
+
browser.browserEvents.emit('close');
|
|
47
|
+
};
|
|
48
|
+
const _newPage = browser.newPage;
|
|
49
|
+
browser.newPage = async () => {
|
|
50
|
+
const page = await _newPage.apply(browser);
|
|
51
|
+
return newPage(page);
|
|
52
|
+
};
|
|
53
|
+
addPluginSupport(browser);
|
|
46
54
|
return browser;
|
|
47
55
|
}
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
function newPage(oldPage) {
|
|
57
|
+
const page = oldPage;
|
|
58
|
+
page.waitAndClick = async (selector, options) => {
|
|
59
|
+
await page.waitForSelector(selector);
|
|
60
|
+
await page.click(selector, options);
|
|
61
|
+
};
|
|
62
|
+
return page;
|
|
63
|
+
}
|
|
64
|
+
function addPluginSupport(browser) {
|
|
65
|
+
browser.plugins = [];
|
|
66
|
+
browser.browserEvents = new events.EventEmitter();
|
|
67
|
+
browser.interceptions = 0;
|
|
68
|
+
browser.addPlugin = async (plugin) => {
|
|
69
|
+
browser.plugins.push(plugin);
|
|
70
|
+
await plugin.init(browser);
|
|
71
|
+
};
|
|
72
|
+
browser.clearPlugins = () => {
|
|
73
|
+
browser.plugins.forEach(async (plugin) => {
|
|
74
|
+
await plugin.stop();
|
|
75
|
+
});
|
|
76
|
+
browser.plugins = [];
|
|
77
|
+
};
|
|
78
|
+
browser.anonymizeUserAgent = async () => {
|
|
79
|
+
const plugin = new anonymize_user_agent_1.AnonymizeUserAgentPlugin();
|
|
80
|
+
await browser.addPlugin(plugin);
|
|
81
|
+
return plugin;
|
|
82
|
+
};
|
|
83
|
+
browser.avoidDetection = async () => {
|
|
84
|
+
const plugin = new avoid_detection_1.AvoidDetectionPlugin();
|
|
85
|
+
await browser.addPlugin(plugin);
|
|
86
|
+
return plugin;
|
|
87
|
+
};
|
|
88
|
+
browser.blockResources = async (...resources) => {
|
|
89
|
+
const plugin = new block_resources_1.BlockResourcesPlugin(resources);
|
|
90
|
+
await browser.addPlugin(plugin);
|
|
91
|
+
return plugin;
|
|
92
|
+
};
|
|
93
|
+
browser.disableDialogs = async (logMessages = false) => {
|
|
94
|
+
const plugin = new disable_dialogs_1.DisableDialogsPlugin(logMessages);
|
|
95
|
+
await browser.addPlugin(plugin);
|
|
96
|
+
return plugin;
|
|
97
|
+
};
|
|
98
|
+
browser.manageCookies = async (opts) => {
|
|
99
|
+
const plugin = new manage_cookies_1.ManageCookiesPlugin(opts);
|
|
100
|
+
await browser.addPlugin(plugin);
|
|
101
|
+
return plugin;
|
|
102
|
+
};
|
|
103
|
+
browser.manageLocalStorage = async (opts) => {
|
|
104
|
+
const plugin = new manage_localstorage_1.ManageLocalStoragePlugin(opts);
|
|
105
|
+
await browser.addPlugin(plugin);
|
|
106
|
+
return plugin;
|
|
107
|
+
};
|
|
108
|
+
browser.solveRecaptchas = async (accessToken) => {
|
|
109
|
+
const plugin = new solve_recaptchas_1.SolveRecaptchasPlugin(accessToken);
|
|
110
|
+
await browser.addPlugin(plugin);
|
|
111
|
+
return plugin;
|
|
112
|
+
};
|
|
113
|
+
}
|
|
50
114
|
class Plugin {
|
|
51
115
|
constructor() {
|
|
52
116
|
this.browser = null;
|
|
@@ -65,7 +129,7 @@ class Plugin {
|
|
|
65
129
|
return;
|
|
66
130
|
this.browser = browser;
|
|
67
131
|
const offOnClose = [];
|
|
68
|
-
browserEvents.once('close', async () => {
|
|
132
|
+
browser.browserEvents.once('close', async () => {
|
|
69
133
|
offOnClose.forEach(fn => fn());
|
|
70
134
|
this.browser = null;
|
|
71
135
|
this.initialized = false;
|
|
@@ -87,7 +151,7 @@ class Plugin {
|
|
|
87
151
|
return;
|
|
88
152
|
if (target.type() !== 'page')
|
|
89
153
|
return;
|
|
90
|
-
const page = await target.page();
|
|
154
|
+
const page = newPage(await target.page());
|
|
91
155
|
if (page.isClosed())
|
|
92
156
|
return;
|
|
93
157
|
const offOnClose = [];
|
|
@@ -168,8 +232,8 @@ class Plugin {
|
|
|
168
232
|
async restart() {
|
|
169
233
|
await this.beforeRestart();
|
|
170
234
|
this.startCounter++;
|
|
171
|
-
if (this.requiresInterception)
|
|
172
|
-
interceptions++;
|
|
235
|
+
if (this.requiresInterception && this.browser)
|
|
236
|
+
this.browser.interceptions++;
|
|
173
237
|
this.dependencies.forEach(x => x.restart());
|
|
174
238
|
await this.afterRestart();
|
|
175
239
|
}
|
|
@@ -178,9 +242,9 @@ class Plugin {
|
|
|
178
242
|
async stop() {
|
|
179
243
|
await this.beforeStop();
|
|
180
244
|
this.startCounter--;
|
|
181
|
-
if (this.requiresInterception)
|
|
182
|
-
interceptions--;
|
|
183
|
-
if (
|
|
245
|
+
if (this.requiresInterception && this.browser)
|
|
246
|
+
this.browser.interceptions--;
|
|
247
|
+
if (this.browser && this.browser.interceptions === 0) {
|
|
184
248
|
const pages = await this.browser.pages();
|
|
185
249
|
pages.filter(x => !x.isClosed()).forEach(async (page) => {
|
|
186
250
|
await page.setRequestInterception(false);
|
|
@@ -200,54 +264,11 @@ class Plugin {
|
|
|
200
264
|
}
|
|
201
265
|
}
|
|
202
266
|
exports.Plugin = Plugin;
|
|
203
|
-
|
|
204
|
-
function addPlugin(plugin) { plugins.push(plugin); }
|
|
205
|
-
async function clearPlugins() {
|
|
206
|
-
plugins.forEach(async (plugin) => {
|
|
207
|
-
await plugin.stop();
|
|
208
|
-
});
|
|
209
|
-
plugins = [];
|
|
210
|
-
}
|
|
211
|
-
const index_1 = require("./plugins/anonymize.user.agent/index");
|
|
212
|
-
function anonymizeUserAgent() {
|
|
213
|
-
const plugin = new index_1.AnonymizeUserAgentPlugin();
|
|
214
|
-
plugins.push(plugin);
|
|
215
|
-
return plugin;
|
|
216
|
-
}
|
|
267
|
+
const anonymize_user_agent_1 = require("./plugins/anonymize.user.agent");
|
|
217
268
|
const avoid_detection_1 = require("./plugins/avoid.detection");
|
|
218
|
-
function avoidDetection() {
|
|
219
|
-
const plugin = new avoid_detection_1.AvoidDetectionPlugin();
|
|
220
|
-
plugins.push(plugin);
|
|
221
|
-
return plugin;
|
|
222
|
-
}
|
|
223
269
|
const block_resources_1 = require("./plugins/block.resources");
|
|
224
|
-
function blockResources(...resources) {
|
|
225
|
-
const plugin = new block_resources_1.BlockResourcesPlugin(resources);
|
|
226
|
-
plugins.push(plugin);
|
|
227
|
-
return plugin;
|
|
228
|
-
}
|
|
229
270
|
const disable_dialogs_1 = require("./plugins/disable.dialogs");
|
|
230
|
-
function disableDialogs(logMessages = false) {
|
|
231
|
-
const plugin = new disable_dialogs_1.DisableDialogsPlugin(logMessages);
|
|
232
|
-
plugins.push(plugin);
|
|
233
|
-
return plugin;
|
|
234
|
-
}
|
|
235
271
|
const manage_cookies_1 = require("./plugins/manage.cookies");
|
|
236
|
-
function manageCookies(opts) {
|
|
237
|
-
const plugin = new manage_cookies_1.ManageCookiesPlugin(opts);
|
|
238
|
-
plugins.push(plugin);
|
|
239
|
-
return plugin;
|
|
240
|
-
}
|
|
241
272
|
const manage_localstorage_1 = require("./plugins/manage.localstorage");
|
|
242
|
-
|
|
243
|
-
const plugin = new manage_localstorage_1.ManageLocalStoragePlugin(opts);
|
|
244
|
-
plugins.push(plugin);
|
|
245
|
-
return plugin;
|
|
246
|
-
}
|
|
247
|
-
const solve_recaptcha_1 = require("./plugins/solve.recaptcha");
|
|
248
|
-
function solveRecaptchas(accessToken) {
|
|
249
|
-
const plugin = new solve_recaptcha_1.SolveRecaptchaPlugin(accessToken);
|
|
250
|
-
plugins.push(plugin);
|
|
251
|
-
return plugin;
|
|
252
|
-
}
|
|
273
|
+
const solve_recaptchas_1 = require("./plugins/solve.recaptchas");
|
|
253
274
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-rest-params */\nimport * as events from 'events';\n\n// Puppeteer Defaults\nimport * as Puppeteer from 'puppeteer';\n\nconst browserEvents = new events.EventEmitter();\n\nexport async function connect(options?: Puppeteer.ConnectOptions): Promise<Puppeteer.Browser> {\n const browser = await Puppeteer.connect(options || {});\n\n for (const plugin of plugins) {\n await plugin.init(browser);\n }\n\n const _close = browser.close;\n browser.close = async () => {\n await _close.apply(browser);\n browserEvents.emit('close');\n };\n\n return browser;\n}\n\n/** The method launches a browser instance with given arguments. The browser will be closed when the parent node.js process is closed. */\nexport async function launch(options?: Puppeteer.LaunchOptions & Puppeteer.ConnectOptions): Promise<Puppeteer.Browser> {\n if (!options) options = {};\n\n process.env.PUPPETEER_DISABLE_HEADLESS_WARNING = 'true';\n const browser = await Puppeteer.launch({ defaultViewport: undefined, ...options });\n\n for (const plugin of plugins) {\n await plugin.init(browser);\n }\n\n const _close = browser.close;\n browser.close = async () => {\n await _close.apply(browser);\n browserEvents.emit('close');\n };\n\n return browser;\n}\n\n// PuppeteerPro\nlet interceptions = 0;\nexport class Plugin {\n protected browser: Puppeteer.Browser | null = null;\n private initialized = false;\n private startCounter = 0;\n protected dependencies: Plugin[] = [];\n protected requiresInterception = false;\n\n get isInitialized() { return this.initialized; }\n get isStopped() { return this.startCounter === 0; }\n\n async addDependency(plugin: Plugin) {\n this.dependencies.push(plugin);\n }\n\n async init(browser: Puppeteer.Browser) {\n if (this.initialized) return;\n\n this.browser = browser;\n\n const offOnClose: (() => void)[] = [];\n browserEvents.once('close', async () => {\n offOnClose.forEach(fn => fn());\n\n this.browser = null;\n this.initialized = false;\n this.startCounter = 0;\n\n await this.onClose();\n });\n\n this.startCounter++;\n\n const thisOnTargetCreated = this.onTargetCreated.bind(this);\n browser.on('targetcreated', thisOnTargetCreated);\n offOnClose.push(() => browser.off('targetcreated', thisOnTargetCreated));\n\n this.initialized = true;\n\n this.dependencies.forEach(x => x.init(browser));\n\n return this.afterLaunch(browser);\n }\n\n protected async afterLaunch(_browser: Puppeteer.Browser) { null; }\n protected async onClose() { null; }\n\n protected async onTargetCreated(target: Puppeteer.Target) {\n if (this.isStopped) return;\n\n if (target.type() !== 'page') return;\n const page = await target.page() as Puppeteer.Page;\n if (page.isClosed()) return;\n\n const offOnClose: (() => void)[] = [];\n page.once('close', async () => {\n offOnClose.forEach(fn => fn());\n });\n\n const requestHandlers: ((request: any) => void)[] = [];\n page.on('request', request => {\n const _respond = request.respond;\n let responded = 0;\n let respondArgs: IArguments;\n\n const _abort = request.abort;\n let aborted = 0;\n let abortArgs: IArguments;\n\n const _continue = request.continue;\n let continued = 0;\n let continueArgs: IArguments;\n\n const handleRequest = async function () {\n const total = responded + aborted + continued;\n\n if (!(request as any)._interceptionHandled) {\n if (responded === 1) await _respond.apply(request, respondArgs);\n else if (responded === 0 && aborted >= 1 && total === requestHandlers.length) await _abort.apply(request, abortArgs);\n else if (continued === requestHandlers.length) await _continue.apply(request, continueArgs);\n }\n };\n\n request.respond = async function () { responded++; respondArgs = respondArgs || arguments; await handleRequest(); };\n request.abort = async function () { aborted++; abortArgs = abortArgs || arguments; await handleRequest(); };\n request.continue = async function () { continued++; continueArgs = continueArgs || arguments; await handleRequest(); };\n\n requestHandlers.forEach(handler => handler(request));\n });\n\n const _pageOn = page.on;\n page.on = function async(eventName, handler) {\n if (eventName === 'request') {\n requestHandlers.push(handler);\n\n return page;\n } else {\n return _pageOn.call(page, eventName, handler);\n }\n };\n\n if (this.requiresInterception) {\n await page.setRequestInterception(true);\n\n const thisOnRequest = this.onRequest.bind(this);\n page.on('request', thisOnRequest);\n offOnClose.push(() => page.off('request', thisOnRequest));\n }\n\n const thisOnDialog = this.onDialog.bind(this);\n page.on('dialog', thisOnDialog);\n offOnClose.push(() => page.off('dialog', thisOnDialog));\n\n await this.onPageCreated(page);\n }\n\n protected async onPageCreated(_page: Puppeteer.Page) { null; }\n\n protected async onRequest(request: Puppeteer.HTTPRequest) {\n const interceptionHandled = (request as any)._interceptionHandled;\n if (interceptionHandled) return;\n if (this.isStopped) return request.continue();\n\n await this.processRequest(request);\n }\n\n protected async processRequest(_request: Puppeteer.HTTPRequest) { null; }\n\n protected async onDialog(dialog: Dialog) {\n if (this.isStopped) return;\n\n const _dismiss = dialog.dismiss;\n dialog.dismiss = async () => {\n if (dialog.handled) return;\n\n await _dismiss.apply(dialog);\n };\n\n await this.processDialog(dialog);\n }\n\n protected async processDialog(_dialog: Dialog) { null; }\n\n protected async beforeRestart() { null; }\n async restart() {\n await this.beforeRestart();\n\n this.startCounter++;\n if (this.requiresInterception) interceptions++;\n\n this.dependencies.forEach(x => x.restart());\n\n await this.afterRestart();\n }\n\n protected async afterRestart() { null; }\n\n protected async beforeStop() { null; }\n async stop() {\n await this.beforeStop();\n\n this.startCounter--;\n if (this.requiresInterception) interceptions--;\n\n if (interceptions === 0 && this.browser) {\n const pages = await this.browser.pages();\n\n pages.filter(x => !x.isClosed()).forEach(async (page: Puppeteer.Page) => {\n await page.setRequestInterception(false);\n });\n }\n\n this.dependencies.forEach(x => x.stop());\n\n await this.afterStop();\n }\n\n protected async afterStop() { null; }\n\n protected async getFirstPage() {\n if (!this.browser) return null;\n\n const pages = await this.browser.pages();\n const openPages = pages.filter(x => !x.isClosed());\n const activePages = pages.filter(x => x.url() !== 'about:blank');\n\n return activePages[0] || openPages[0];\n }\n}\n\nlet plugins: Plugin[] = [];\nexport function addPlugin(plugin: Plugin) { plugins.push(plugin); }\nexport async function clearPlugins() {\n plugins.forEach(async plugin => {\n await plugin.stop();\n });\n\n plugins = [];\n}\n\nimport { AnonymizeUserAgentPlugin } from './plugins/anonymize.user.agent/index';\nexport function anonymizeUserAgent(): AnonymizeUserAgentPlugin {\n const plugin = new AnonymizeUserAgentPlugin();\n plugins.push(plugin);\n return plugin;\n}\n\nimport { AvoidDetectionPlugin } from './plugins/avoid.detection';\nexport function avoidDetection(): AvoidDetectionPlugin {\n const plugin = new AvoidDetectionPlugin();\n plugins.push(plugin);\n return plugin;\n}\n\nimport { BlockResourcesPlugin, Resource } from './plugins/block.resources';\nexport function blockResources(...resources: Resource[]): BlockResourcesPlugin {\n const plugin = new BlockResourcesPlugin(resources);\n plugins.push(plugin);\n return plugin;\n}\n\nimport { DisableDialogsPlugin } from './plugins/disable.dialogs';\nexport function disableDialogs(logMessages = false): DisableDialogsPlugin {\n const plugin = new DisableDialogsPlugin(logMessages);\n plugins.push(plugin);\n return plugin;\n}\n\nimport { ManageCookiesOption, ManageCookiesPlugin } from './plugins/manage.cookies';\nexport function manageCookies(opts: ManageCookiesOption): ManageCookiesPlugin {\n const plugin = new ManageCookiesPlugin(opts);\n plugins.push(plugin);\n return plugin;\n}\n\nimport { ManageLocalStorageOption, ManageLocalStoragePlugin } from './plugins/manage.localstorage';\nexport function manageLocalStorage(opts: ManageLocalStorageOption): ManageLocalStoragePlugin {\n const plugin = new ManageLocalStoragePlugin(opts);\n plugins.push(plugin);\n return plugin;\n}\n\nimport { SolveRecaptchaPlugin } from './plugins/solve.recaptcha';\nexport function solveRecaptchas(accessToken: string): SolveRecaptchaPlugin {\n const plugin = new SolveRecaptchaPlugin(accessToken);\n plugins.push(plugin);\n return plugin;\n}\n\ninterface Dialog extends Puppeteer.Dialog {\n handled: boolean;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-rest-params */\r\nimport * as events from 'events';\r\n\r\n// Puppeteer Defaults\r\nimport * as Puppeteer from 'puppeteer';\r\n\r\nexport async function connect(options?: Puppeteer.ConnectOptions): Promise<Browser> {\r\n const browser = await Puppeteer.connect(options || {});\r\n\r\n return createBrowser(browser);\r\n}\r\n\r\nexport async function launch(options?: Puppeteer.LaunchOptions & Puppeteer.ConnectOptions): Promise<Browser> {\r\n if (!options) options = {};\r\n\r\n process.env.PUPPETEER_DISABLE_HEADLESS_WARNING = 'true';\r\n const browser = await Puppeteer.launch({ defaultViewport: undefined, ...options });\r\n\r\n return createBrowser(browser);\r\n}\r\n\r\nasync function createBrowser(puppeteerBrowser: Puppeteer.Browser): Promise<Browser> {\r\n const browser = puppeteerBrowser as Browser;\r\n\r\n const _close = browser.close;\r\n browser.close = async () => {\r\n await _close.apply(browser);\r\n browser.browserEvents.emit('close');\r\n };\r\n\r\n const _createBrowserContext = browser.createBrowserContext;\r\n browser.createBrowserContext = async (options?: Puppeteer.BrowserContextOptions) => {\r\n const context: Puppeteer.BrowserContext = await _createBrowserContext.apply(browser, options);\r\n\r\n return createBrowserContext(context);\r\n };\r\n\r\n const _newPage = browser.newPage;\r\n browser.newPage = async () => {\r\n const page: Puppeteer.Page = await _newPage.apply(browser);\r\n\r\n return newPage(page);\r\n };\r\n\r\n addPluginSupport(browser);\r\n\r\n return browser;\r\n}\r\n\r\nasync function createBrowserContext(puppeteerBrowserContext: Puppeteer.BrowserContext): Promise<BrowserContext> {\r\n const browser = puppeteerBrowserContext as BrowserContext;\r\n\r\n const _close = browser.close;\r\n browser.close = async () => {\r\n await _close.apply(browser);\r\n browser.browserEvents.emit('close');\r\n };\r\n\r\n const _newPage = browser.newPage;\r\n browser.newPage = async () => {\r\n const page: Puppeteer.Page = await _newPage.apply(browser);\r\n\r\n return newPage(page);\r\n };\r\n\r\n addPluginSupport(browser);\r\n\r\n return browser;\r\n}\r\n\r\nfunction newPage(oldPage: Puppeteer.Page): Page {\r\n const page = oldPage as Page;\r\n\r\n page.waitAndClick = async (selector: string, options?: Readonly<Puppeteer.ClickOptions>): Promise<void> => {\r\n await page.waitForSelector(selector);\r\n await page.click(selector, options);\r\n };\r\n\r\n return page;\r\n}\r\n\r\nfunction addPluginSupport(browser: Browser | BrowserContext) {\r\n browser.plugins = [];\r\n browser.browserEvents = new events.EventEmitter();\r\n browser.interceptions = 0;\r\n\r\n browser.addPlugin = async (plugin: Plugin) => {\r\n browser.plugins.push(plugin);\r\n await plugin.init(browser);\r\n };\r\n\r\n browser.clearPlugins = () => {\r\n browser.plugins.forEach(async plugin => {\r\n await plugin.stop();\r\n });\r\n\r\n browser.plugins = [];\r\n };\r\n\r\n browser.anonymizeUserAgent = async (): Promise<AnonymizeUserAgentPlugin> => {\r\n const plugin = new AnonymizeUserAgentPlugin();\r\n await browser.addPlugin(plugin);\r\n return plugin;\r\n };\r\n\r\n browser.avoidDetection = async (): Promise<AvoidDetectionPlugin> => {\r\n const plugin = new AvoidDetectionPlugin();\r\n await browser.addPlugin(plugin);\r\n return plugin;\r\n };\r\n\r\n browser.blockResources = async (...resources: Resource[]): Promise<BlockResourcesPlugin> => {\r\n const plugin = new BlockResourcesPlugin(resources);\r\n await browser.addPlugin(plugin);\r\n return plugin;\r\n };\r\n\r\n browser.disableDialogs = async (logMessages = false): Promise<DisableDialogsPlugin> => {\r\n const plugin = new DisableDialogsPlugin(logMessages);\r\n await browser.addPlugin(plugin);\r\n return plugin;\r\n };\r\n\r\n browser.manageCookies = async (opts: ManageCookiesOption): Promise<ManageCookiesPlugin> => {\r\n const plugin = new ManageCookiesPlugin(opts);\r\n await browser.addPlugin(plugin);\r\n return plugin;\r\n };\r\n\r\n browser.manageLocalStorage = async (opts: ManageLocalStorageOption): Promise<ManageLocalStoragePlugin> => {\r\n const plugin = new ManageLocalStoragePlugin(opts);\r\n await browser.addPlugin(plugin);\r\n return plugin;\r\n };\r\n\r\n browser.solveRecaptchas = async (accessToken: string): Promise<SolveRecaptchasPlugin> => {\r\n const plugin = new SolveRecaptchasPlugin(accessToken);\r\n await browser.addPlugin(plugin);\r\n return plugin;\r\n };\r\n}\r\n\r\n// PuppeteerPro\r\nexport interface Browser extends Puppeteer.Browser, Pluginable {\r\n createBrowserContext(options?: Puppeteer.BrowserContextOptions): Promise<BrowserContext>;\r\n newPage(): Promise<Page>;\r\n}\r\n\r\nexport interface BrowserContext extends Puppeteer.BrowserContext, Pluginable {\r\n newPage(): Promise<Page>;\r\n}\r\n\r\nexport interface Page extends Puppeteer.Page {\r\n waitAndClick(selector: string, options?: Readonly<Puppeteer.ClickOptions>): Promise<void>;\r\n}\r\n\r\nexport class Plugin {\r\n protected browser: Browser | BrowserContext | null = null;\r\n private initialized = false;\r\n private startCounter = 0;\r\n protected dependencies: Plugin[] = [];\r\n protected requiresInterception = false;\r\n\r\n get isInitialized() { return this.initialized; }\r\n get isStopped() { return this.startCounter === 0; }\r\n\r\n async addDependency(plugin: Plugin) {\r\n this.dependencies.push(plugin);\r\n }\r\n\r\n async init(browser: Browser | BrowserContext) {\r\n if (this.initialized) return;\r\n\r\n this.browser = browser;\r\n\r\n const offOnClose: (() => void)[] = [];\r\n browser.browserEvents.once('close', async () => {\r\n offOnClose.forEach(fn => fn());\r\n\r\n this.browser = null;\r\n this.initialized = false;\r\n this.startCounter = 0;\r\n\r\n await this.onClose();\r\n });\r\n\r\n this.startCounter++;\r\n\r\n const thisOnTargetCreated = this.onTargetCreated.bind(this);\r\n browser.on('targetcreated', thisOnTargetCreated);\r\n offOnClose.push(() => browser.off('targetcreated', thisOnTargetCreated));\r\n\r\n this.initialized = true;\r\n\r\n this.dependencies.forEach(x => x.init(browser));\r\n\r\n return this.afterLaunch(browser);\r\n }\r\n\r\n protected async afterLaunch(_browser: Browser | BrowserContext) { null; }\r\n protected async onClose() { null; }\r\n\r\n protected async onTargetCreated(target: Puppeteer.Target) {\r\n if (this.isStopped) return;\r\n\r\n if (target.type() !== 'page') return;\r\n const page = newPage(await target.page() as Puppeteer.Page);\r\n if (page.isClosed()) return;\r\n\r\n const offOnClose: (() => void)[] = [];\r\n page.once('close', async () => {\r\n offOnClose.forEach(fn => fn());\r\n });\r\n\r\n const requestHandlers: ((request: any) => void)[] = [];\r\n page.on('request', request => {\r\n const _respond = request.respond;\r\n let responded = 0;\r\n let respondArgs: IArguments;\r\n\r\n const _abort = request.abort;\r\n let aborted = 0;\r\n let abortArgs: IArguments;\r\n\r\n const _continue = request.continue;\r\n let continued = 0;\r\n let continueArgs: IArguments;\r\n\r\n const handleRequest = async function () {\r\n const total = responded + aborted + continued;\r\n\r\n if (!(request as any)._interceptionHandled) {\r\n if (responded === 1) await _respond.apply(request, respondArgs);\r\n else if (responded === 0 && aborted >= 1 && total === requestHandlers.length) await _abort.apply(request, abortArgs);\r\n else if (continued === requestHandlers.length) await _continue.apply(request, continueArgs);\r\n }\r\n };\r\n\r\n request.respond = async function () { responded++; respondArgs = respondArgs || arguments; await handleRequest(); };\r\n request.abort = async function () { aborted++; abortArgs = abortArgs || arguments; await handleRequest(); };\r\n request.continue = async function () { continued++; continueArgs = continueArgs || arguments; await handleRequest(); };\r\n\r\n requestHandlers.forEach(handler => handler(request));\r\n });\r\n\r\n const _pageOn = page.on;\r\n page.on = function async(eventName, handler) {\r\n if (eventName === 'request') {\r\n requestHandlers.push(handler);\r\n\r\n return page;\r\n } else {\r\n return _pageOn.call(page, eventName, handler);\r\n }\r\n };\r\n\r\n if (this.requiresInterception) {\r\n await page.setRequestInterception(true);\r\n\r\n const thisOnRequest = this.onRequest.bind(this);\r\n page.on('request', thisOnRequest);\r\n offOnClose.push(() => page.off('request', thisOnRequest));\r\n }\r\n\r\n const thisOnDialog = this.onDialog.bind(this);\r\n page.on('dialog', thisOnDialog);\r\n offOnClose.push(() => page.off('dialog', thisOnDialog));\r\n\r\n await this.onPageCreated(page);\r\n }\r\n\r\n protected async onPageCreated(_page: Page) { null; }\r\n\r\n protected async onRequest(request: Puppeteer.HTTPRequest) {\r\n const interceptionHandled = (request as any)._interceptionHandled;\r\n if (interceptionHandled) return;\r\n if (this.isStopped) return request.continue();\r\n\r\n await this.processRequest(request);\r\n }\r\n\r\n protected async processRequest(_request: Puppeteer.HTTPRequest) { null; }\r\n\r\n protected async onDialog(dialog: Dialog) {\r\n if (this.isStopped) return;\r\n\r\n const _dismiss = dialog.dismiss;\r\n dialog.dismiss = async () => {\r\n if (dialog.handled) return;\r\n\r\n await _dismiss.apply(dialog);\r\n };\r\n\r\n await this.processDialog(dialog);\r\n }\r\n\r\n protected async processDialog(_dialog: Dialog) { null; }\r\n\r\n protected async beforeRestart() { null; }\r\n async restart() {\r\n await this.beforeRestart();\r\n\r\n this.startCounter++;\r\n if (this.requiresInterception && this.browser) this.browser.interceptions++;\r\n\r\n this.dependencies.forEach(x => x.restart());\r\n\r\n await this.afterRestart();\r\n }\r\n\r\n protected async afterRestart() { null; }\r\n\r\n protected async beforeStop() { null; }\r\n async stop() {\r\n await this.beforeStop();\r\n\r\n this.startCounter--;\r\n if (this.requiresInterception && this.browser) this.browser.interceptions--;\r\n\r\n if (this.browser && this.browser.interceptions === 0) {\r\n const pages = await this.browser.pages();\r\n\r\n pages.filter(x => !x.isClosed()).forEach(async (page: Puppeteer.Page) => {\r\n await page.setRequestInterception(false);\r\n });\r\n }\r\n\r\n this.dependencies.forEach(x => x.stop());\r\n\r\n await this.afterStop();\r\n }\r\n\r\n protected async afterStop() { null; }\r\n\r\n protected async getFirstPage() {\r\n if (!this.browser) return null;\r\n\r\n const pages = await this.browser.pages();\r\n const openPages = pages.filter(x => !x.isClosed());\r\n const activePages = pages.filter(x => x.url() !== 'about:blank');\r\n\r\n return activePages[0] || openPages[0];\r\n }\r\n}\r\n\r\ninterface Pluginable {\r\n plugins: Plugin[];\r\n browserEvents: events.EventEmitter;\r\n interceptions: number;\r\n\r\n addPlugin: (plugin: Plugin) => Promise<void>;\r\n clearPlugins: () => void;\r\n anonymizeUserAgent: () => Promise<AnonymizeUserAgentPlugin>;\r\n avoidDetection: () => Promise<AvoidDetectionPlugin>;\r\n blockResources: (...resources: Resource[]) => Promise<BlockResourcesPlugin>;\r\n disableDialogs: (logMessages?: boolean) => Promise<DisableDialogsPlugin>;\r\n manageCookies: (opts: ManageCookiesOption) => Promise<ManageCookiesPlugin>;\r\n manageLocalStorage: (opts: ManageLocalStorageOption) => Promise<ManageLocalStoragePlugin>;\r\n solveRecaptchas: (accessToken: string) => Promise<SolveRecaptchasPlugin>;\r\n}\r\n\r\ninterface Dialog extends Puppeteer.Dialog {\r\n handled: boolean;\r\n}\r\n\r\nimport { AnonymizeUserAgentPlugin } from './plugins/anonymize.user.agent';\r\nimport { AvoidDetectionPlugin } from './plugins/avoid.detection';\r\nimport { BlockResourcesPlugin, Resource } from './plugins/block.resources';\r\nimport { DisableDialogsPlugin } from './plugins/disable.dialogs';\r\nimport { ManageCookiesOption, ManageCookiesPlugin } from './plugins/manage.cookies';\r\nimport { ManageLocalStorageOption, ManageLocalStoragePlugin } from './plugins/manage.localstorage';\r\nimport { SolveRecaptchasPlugin } from './plugins/solve.recaptchas';\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "puppeteer-pro",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "A simple puppeteer wrapper to enable useful plugins with ease",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/jest": "^29.5.14",
|
|
46
|
-
"@types/node": "^22.15.
|
|
46
|
+
"@types/node": "^22.15.30",
|
|
47
47
|
"@types/user-agents": "^1.0.4",
|
|
48
48
|
"copyfiles": "^2.4.1",
|
|
49
49
|
"dotenv-safe": "^9.1.0",
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Plugin } from '../../index';
|
|
1
|
+
import { Browser, BrowserContext, Page, Plugin } from '../..';
|
|
3
2
|
export declare class AnonymizeUserAgentPlugin extends Plugin {
|
|
4
3
|
private pages;
|
|
5
4
|
private userAgent?;
|
|
6
5
|
constructor();
|
|
7
|
-
protected afterLaunch(browser:
|
|
6
|
+
protected afterLaunch(browser: Browser | BrowserContext): Promise<void>;
|
|
8
7
|
protected onClose(): Promise<void>;
|
|
9
|
-
protected onPageCreated(page:
|
|
8
|
+
protected onPageCreated(page: Page): Promise<void>;
|
|
10
9
|
protected beforeRestart(): Promise<void>;
|
|
11
10
|
protected afterStop(): Promise<void>;
|
|
12
11
|
}
|