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.
Files changed (38) hide show
  1. package/README.md +86 -84
  2. package/index.d.ts +36 -21
  3. package/index.d.ts.map +1 -1
  4. package/index.js +99 -78
  5. package/index.js.map +1 -1
  6. package/package.json +2 -2
  7. package/plugins/anonymize.user.agent/index.d.ts +3 -4
  8. package/plugins/anonymize.user.agent/index.d.ts.map +1 -1
  9. package/plugins/anonymize.user.agent/index.js +2 -2
  10. package/plugins/anonymize.user.agent/index.js.map +1 -1
  11. package/plugins/avoid.detection/index.d.ts +3 -4
  12. package/plugins/avoid.detection/index.d.ts.map +1 -1
  13. package/plugins/avoid.detection/index.js +4 -4
  14. package/plugins/avoid.detection/index.js.map +1 -1
  15. package/plugins/block.resources/index.d.ts +1 -1
  16. package/plugins/block.resources/index.d.ts.map +1 -1
  17. package/plugins/block.resources/index.js +2 -2
  18. package/plugins/block.resources/index.js.map +1 -1
  19. package/plugins/disable.dialogs/index.d.ts +1 -1
  20. package/plugins/disable.dialogs/index.d.ts.map +1 -1
  21. package/plugins/disable.dialogs/index.js +2 -2
  22. package/plugins/disable.dialogs/index.js.map +1 -1
  23. package/plugins/manage.cookies/index.d.ts +1 -1
  24. package/plugins/manage.cookies/index.d.ts.map +1 -1
  25. package/plugins/manage.cookies/index.js +10 -7
  26. package/plugins/manage.cookies/index.js.map +1 -1
  27. package/plugins/manage.localstorage/index.d.ts +1 -1
  28. package/plugins/manage.localstorage/index.d.ts.map +1 -1
  29. package/plugins/manage.localstorage/index.js +2 -2
  30. package/plugins/manage.localstorage/index.js.map +1 -1
  31. package/plugins/solve.recaptchas/index.d.ts +12 -0
  32. package/plugins/solve.recaptchas/index.d.ts.map +1 -0
  33. package/plugins/{solve.recaptcha → solve.recaptchas}/index.js +6 -6
  34. package/plugins/solve.recaptchas/index.js.map +1 -0
  35. package/plugins/{solve.recaptcha → solve.recaptchas}/injections/utils.js +144 -144
  36. package/plugins/solve.recaptcha/index.d.ts +0 -12
  37. package/plugins/solve.recaptcha/index.d.ts.map +0 -1
  38. 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
- // Enable the 'avoidDetection' plugin to prevent headless detection
22
- PuppeteerPro.avoidDetection();
23
-
24
- // Enable the 'solveRecaptchas' plugin to solve Google's recaptchas (remember to provide a wit.api API access token)
25
- const solver = PuppeteerPro.solveRecaptchas('WIT_AI_ACCESS_TOKEN');
26
-
27
- (async () => {
28
- const browser = await PuppeteerPro.launch();
29
- const page = await browser.newPage();
30
-
31
- console.log('Testing the 🐱‍👤 avoidDetection 🐱‍👤 plugin..')
32
- await page.goto('https://arh.antoinevastel.com/bots/areyouheadless');
33
- await page.screenshot({ path: 'are-you-headless.png' });
34
-
35
- console.log('Testing the recaptcha solver..')
36
- await page.goto('https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php');
37
- await solver.waitForCaptcha(page); // Captcha script is deferred, so will load after page.goto completes
38
- await solver.solveRecaptcha(page);
39
- await page.screenshot({ path: 'is-recaptcha-solved.png' });
40
-
41
- await browser.close();
42
- })();
43
- ```
44
-
45
- ## Passive Improvements
46
-
47
- - 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:
48
- - 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.
49
- - 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.
50
- - If amongst 5 handlers, all handlers call continue, the result will be `continue`. This will occur after all handlers are finished.
51
-
52
- ## Optional Built-in Plugins
53
-
54
- ### Anonymize User Agent
55
-
56
- - Anonymize the user-agent across all pages
57
-
58
- ### Avoid Detection
59
-
60
- - Multiple techniques to combat headless browser detection
61
-
62
- ### Block Resources
63
-
64
- - Block any [resource type](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#httprequestresourcetype) from loading
65
- - Can be used to speed up loading websites by blocking style sheets and images
66
-
67
- ### Disable Dialogs
68
-
69
- - Block dialogs from popping up and stopping execution
70
-
71
- ### Manage Cookies
72
-
73
- - Save and load cookies across sessions
74
- - Supports multiple profiles and switching between profiles
75
-
76
- ### Manage Local Storage
77
-
78
- - Save and load local storage across sessions
79
- - Supports multiple profiles and switching between profiles
80
-
81
- ### Solve Recaptcha
82
-
83
- - Solve Google's reCAPTCHA v2
84
- - Requires a FREE [wit.ai](https://wit.ai/apps) access token
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<Puppeteer.Browser>;
3
- /** The method launches a browser instance with given arguments. The browser will be closed when the parent node.js process is closed. */
4
- export declare function launch(options?: Puppeteer.LaunchOptions & Puppeteer.ConnectOptions): Promise<Puppeteer.Browser>;
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: Puppeteer.Browser | null;
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: Puppeteer.Browser): Promise<void>;
15
- protected afterLaunch(_browser: Puppeteer.Browser): Promise<void>;
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: Puppeteer.Page): Promise<void>;
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
- export declare function addPlugin(plugin: Plugin): void;
32
- export declare function clearPlugins(): Promise<void>;
33
- import { AnonymizeUserAgentPlugin } from './plugins/anonymize.user.agent/index';
34
- export declare function anonymizeUserAgent(): AnonymizeUserAgentPlugin;
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
- export declare function manageLocalStorage(opts: ManageLocalStorageOption): ManageLocalStoragePlugin;
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":"AAIA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AAIvC,wBAAsB,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAc5F;AAED,yIAAyI;AACzI,wBAAsB,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAiBrH;AAID,qBAAa,MAAM;IACjB,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAQ;IACnD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAK;IACzB,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,CAAM;IACtC,SAAS,CAAC,oBAAoB,UAAS;IAEvC,IAAI,aAAa,YAA+B;IAChD,IAAI,SAAS,YAAsC;IAE7C,aAAa,CAAC,MAAM,EAAE,MAAM;IAI5B,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO;cA6BrB,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO;cACvC,OAAO;cAEP,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM;cAqExC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI;cAEnC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,WAAW;cAQxC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW;cAE9C,QAAQ,CAAC,MAAM,EAAE,MAAM;cAavB,aAAa,CAAC,OAAO,EAAE,MAAM;cAE7B,aAAa;IACvB,OAAO;cAWG,YAAY;cAEZ,UAAU;IACpB,IAAI;cAmBM,SAAS;cAET,YAAY;CAS7B;AAGD,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,QAA2B;AACnE,wBAAsB,YAAY,kBAMjC;AAED,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,wBAAgB,kBAAkB,IAAI,wBAAwB,CAI7D;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,wBAAgB,cAAc,IAAI,oBAAoB,CAIrD;AAED,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC3E,wBAAgB,cAAc,CAAC,GAAG,SAAS,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAI7E;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,wBAAgB,cAAc,CAAC,WAAW,UAAQ,GAAG,oBAAoB,CAIxE;AAED,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpF,wBAAgB,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG,mBAAmB,CAI5E;AAED,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACnG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,wBAAwB,GAAG,wBAAwB,CAI3F;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAIzE;AAED,UAAU,MAAO,SAAQ,SAAS,CAAC,MAAM;IACvC,OAAO,EAAE,OAAO,CAAC;CAClB"}
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
- for (const plugin of plugins) {
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
- for (const plugin of plugins) {
39
- await plugin.init(browser);
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
- // PuppeteerPro
49
- let interceptions = 0;
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 (interceptions === 0 && this.browser) {
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
- let plugins = [];
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
- function manageLocalStorage(opts) {
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.9.11",
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.29",
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 * as Puppeteer from 'puppeteer';
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: Puppeteer.Browser): Promise<void>;
6
+ protected afterLaunch(browser: Browser | BrowserContext): Promise<void>;
8
7
  protected onClose(): Promise<void>;
9
- protected onPageCreated(page: Puppeteer.Page): Promise<void>;
8
+ protected onPageCreated(page: Page): Promise<void>;
10
9
  protected beforeRestart(): Promise<void>;
11
10
  protected afterStop(): Promise<void>;
12
11
  }