puppeteer-pro 2.5.2 → 2.5.3
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 +88 -88
- package/index.d.ts +1 -29
- package/index.d.ts.map +1 -1
- package/index.js +3 -157
- package/index.js.map +1 -1
- package/package.json +10 -12
- package/plugins/anonymize.user.agent/index.d.ts +2 -1
- package/plugins/anonymize.user.agent/index.d.ts.map +1 -1
- package/plugins/anonymize.user.agent/index.js +4 -4
- package/plugins/anonymize.user.agent/index.js.map +1 -1
- package/plugins/avoid.detection/index.d.ts +2 -1
- package/plugins/avoid.detection/index.d.ts.map +1 -1
- package/plugins/avoid.detection/index.js +1 -1
- 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 +1 -1
- 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 +1 -1
- package/plugins/disable.dialogs/index.js.map +1 -1
- package/plugins/index.d.ts +30 -0
- package/plugins/index.d.ts.map +1 -0
- package/plugins/index.js +159 -0
- package/plugins/index.js.map +1 -0
- 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 +4 -3
- 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 +4 -3
- package/plugins/manage.localstorage/index.js.map +1 -1
- package/plugins/shared.d.ts +7 -0
- package/plugins/shared.d.ts.map +1 -0
- package/plugins/shared.js +23 -0
- package/plugins/shared.js.map +1 -0
- package/plugins/solve.recaptchas/index.d.ts +2 -1
- package/plugins/solve.recaptchas/index.d.ts.map +1 -1
- package/plugins/solve.recaptchas/index.js +3 -2
- package/plugins/solve.recaptchas/index.js.map +1 -1
- package/plugins/solve.recaptchas/injections/utils.js +144 -144
package/README.md
CHANGED
|
@@ -1,88 +1,88 @@
|
|
|
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
|
-
- `page.waitAndClick` function that sequentially runs `page.waitForSelector` and `page.click`.
|
|
53
|
-
- `page.waitAndType` function that sequentially runs `page.waitForSelector` and `page.type`.
|
|
54
|
-
- `page.withLoader` function that wraps any function with waiting for a selector to appear and then disappear.
|
|
55
|
-
|
|
56
|
-
## Optional Built-in Plugins
|
|
57
|
-
|
|
58
|
-
### Anonymize User Agent
|
|
59
|
-
|
|
60
|
-
- Anonymize the user-agent across all pages
|
|
61
|
-
|
|
62
|
-
### Avoid Detection
|
|
63
|
-
|
|
64
|
-
- Multiple techniques to combat headless browser detection
|
|
65
|
-
|
|
66
|
-
### Block Resources
|
|
67
|
-
|
|
68
|
-
- Block any [resource type](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#httprequestresourcetype) from loading
|
|
69
|
-
- Can be used to speed up loading websites by blocking style sheets and images
|
|
70
|
-
|
|
71
|
-
### Disable Dialogs
|
|
72
|
-
|
|
73
|
-
- Block dialogs from popping up and stopping execution
|
|
74
|
-
|
|
75
|
-
### Manage Cookies
|
|
76
|
-
|
|
77
|
-
- Save and load cookies across sessions
|
|
78
|
-
- Supports multiple profiles and switching between profiles
|
|
79
|
-
|
|
80
|
-
### Manage Local Storage
|
|
81
|
-
|
|
82
|
-
- Save and load local storage across sessions
|
|
83
|
-
- Supports multiple profiles and switching between profiles
|
|
84
|
-
|
|
85
|
-
### Solve Recaptcha
|
|
86
|
-
|
|
87
|
-
- Solve Google's reCAPTCHA v2
|
|
88
|
-
- 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
|
+
- `page.waitAndClick` function that sequentially runs `page.waitForSelector` and `page.click`.
|
|
53
|
+
- `page.waitAndType` function that sequentially runs `page.waitForSelector` and `page.type`.
|
|
54
|
+
- `page.withLoader` function that wraps any function with waiting for a selector to appear and then disappear.
|
|
55
|
+
|
|
56
|
+
## Optional Built-in Plugins
|
|
57
|
+
|
|
58
|
+
### Anonymize User Agent
|
|
59
|
+
|
|
60
|
+
- Anonymize the user-agent across all pages
|
|
61
|
+
|
|
62
|
+
### Avoid Detection
|
|
63
|
+
|
|
64
|
+
- Multiple techniques to combat headless browser detection
|
|
65
|
+
|
|
66
|
+
### Block Resources
|
|
67
|
+
|
|
68
|
+
- Block any [resource type](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#httprequestresourcetype) from loading
|
|
69
|
+
- Can be used to speed up loading websites by blocking style sheets and images
|
|
70
|
+
|
|
71
|
+
### Disable Dialogs
|
|
72
|
+
|
|
73
|
+
- Block dialogs from popping up and stopping execution
|
|
74
|
+
|
|
75
|
+
### Manage Cookies
|
|
76
|
+
|
|
77
|
+
- Save and load cookies across sessions
|
|
78
|
+
- Supports multiple profiles and switching between profiles
|
|
79
|
+
|
|
80
|
+
### Manage Local Storage
|
|
81
|
+
|
|
82
|
+
- Save and load local storage across sessions
|
|
83
|
+
- Supports multiple profiles and switching between profiles
|
|
84
|
+
|
|
85
|
+
### Solve Recaptcha
|
|
86
|
+
|
|
87
|
+
- Solve Google's reCAPTCHA v2
|
|
88
|
+
- Requires a FREE [wit.ai](https://wit.ai/apps) access token
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as events from 'events';
|
|
2
2
|
import * as Puppeteer from 'puppeteer';
|
|
3
|
+
import type { Plugin } from './plugins';
|
|
3
4
|
export declare function connect(options?: Puppeteer.ConnectOptions): Promise<Browser>;
|
|
4
5
|
export declare function launch(options?: Puppeteer.LaunchOptions & Puppeteer.ConnectOptions): Promise<Browser>;
|
|
5
6
|
export interface Browser extends Puppeteer.Browser, Pluginable {
|
|
@@ -14,32 +15,6 @@ export interface Page extends Puppeteer.Page {
|
|
|
14
15
|
waitAndType(selector: string, text: string, waitOptions?: Puppeteer.WaitForSelectorOptions, typeOptions?: Readonly<Puppeteer.KeyboardTypeOptions>): Promise<void>;
|
|
15
16
|
withLoader<T>(fn: () => Promise<T>, loadingSelector: string, visibleWaitOptions?: Puppeteer.WaitForSelectorOptions, hiddenWaitOptions?: Puppeteer.WaitForSelectorOptions): Promise<T>;
|
|
16
17
|
}
|
|
17
|
-
export declare class Plugin {
|
|
18
|
-
protected browser: Browser | BrowserContext | null;
|
|
19
|
-
private initialized;
|
|
20
|
-
private startCounter;
|
|
21
|
-
protected dependencies: Plugin[];
|
|
22
|
-
protected requiresInterception: boolean;
|
|
23
|
-
get isInitialized(): boolean;
|
|
24
|
-
get isStopped(): boolean;
|
|
25
|
-
addDependency(plugin: Plugin): Promise<void>;
|
|
26
|
-
init(browser: Browser | BrowserContext): Promise<void>;
|
|
27
|
-
protected afterLaunch(_browser: Browser | BrowserContext): Promise<void>;
|
|
28
|
-
protected onClose(): Promise<void>;
|
|
29
|
-
protected onTargetCreated(target: Puppeteer.Target): Promise<void>;
|
|
30
|
-
protected onPageCreated(_page: Page): Promise<void>;
|
|
31
|
-
protected onRequest(request: Puppeteer.HTTPRequest): Promise<void>;
|
|
32
|
-
protected processRequest(_request: Puppeteer.HTTPRequest): Promise<void>;
|
|
33
|
-
protected onDialog(dialog: Dialog): Promise<void>;
|
|
34
|
-
protected processDialog(_dialog: Dialog): Promise<void>;
|
|
35
|
-
protected beforeRestart(): Promise<void>;
|
|
36
|
-
restart(): Promise<void>;
|
|
37
|
-
protected afterRestart(): Promise<void>;
|
|
38
|
-
protected beforeStop(): Promise<void>;
|
|
39
|
-
stop(): Promise<void>;
|
|
40
|
-
protected afterStop(): Promise<void>;
|
|
41
|
-
protected getFirstPage(): Promise<Puppeteer.Page | null>;
|
|
42
|
-
}
|
|
43
18
|
interface Pluginable {
|
|
44
19
|
plugins: Plugin[];
|
|
45
20
|
browserEvents: events.EventEmitter;
|
|
@@ -54,9 +29,6 @@ interface Pluginable {
|
|
|
54
29
|
manageLocalStorage: (opts: ManageLocalStorageOption) => Promise<ManageLocalStoragePlugin>;
|
|
55
30
|
solveRecaptchas: (accessToken: string) => Promise<SolveRecaptchasPlugin>;
|
|
56
31
|
}
|
|
57
|
-
interface Dialog extends Puppeteer.Dialog {
|
|
58
|
-
handled: boolean;
|
|
59
|
-
}
|
|
60
32
|
import { AnonymizeUserAgentPlugin } from './plugins/anonymize.user.agent';
|
|
61
33
|
import { AvoidDetectionPlugin } from './plugins/avoid.detection';
|
|
62
34
|
import { BlockResourcesPlugin, Resource } from './plugins/block.resources';
|
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
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Plugin = void 0;
|
|
4
3
|
exports.connect = connect;
|
|
5
4
|
exports.launch = launch;
|
|
6
|
-
|
|
7
|
-
const events = require("events");
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const events = tslib_1.__importStar(require("events"));
|
|
8
7
|
// Puppeteer Defaults
|
|
9
|
-
const Puppeteer = require("puppeteer");
|
|
8
|
+
const Puppeteer = tslib_1.__importStar(require("puppeteer"));
|
|
10
9
|
async function connect(options) {
|
|
11
10
|
const browser = await Puppeteer.connect(options || {});
|
|
12
11
|
return createBrowser(browser);
|
|
@@ -122,159 +121,6 @@ function addPluginSupport(browser) {
|
|
|
122
121
|
return plugin;
|
|
123
122
|
};
|
|
124
123
|
}
|
|
125
|
-
class Plugin {
|
|
126
|
-
constructor() {
|
|
127
|
-
this.browser = null;
|
|
128
|
-
this.initialized = false;
|
|
129
|
-
this.startCounter = 0;
|
|
130
|
-
this.dependencies = [];
|
|
131
|
-
this.requiresInterception = false;
|
|
132
|
-
}
|
|
133
|
-
get isInitialized() { return this.initialized; }
|
|
134
|
-
get isStopped() { return this.startCounter === 0; }
|
|
135
|
-
async addDependency(plugin) {
|
|
136
|
-
this.dependencies.push(plugin);
|
|
137
|
-
}
|
|
138
|
-
async init(browser) {
|
|
139
|
-
if (this.initialized)
|
|
140
|
-
return;
|
|
141
|
-
this.browser = browser;
|
|
142
|
-
const offOnClose = [];
|
|
143
|
-
browser.browserEvents.once('close', async () => {
|
|
144
|
-
offOnClose.forEach(fn => fn());
|
|
145
|
-
this.browser = null;
|
|
146
|
-
this.initialized = false;
|
|
147
|
-
this.startCounter = 0;
|
|
148
|
-
await this.onClose();
|
|
149
|
-
});
|
|
150
|
-
this.startCounter++;
|
|
151
|
-
const thisOnTargetCreated = this.onTargetCreated.bind(this);
|
|
152
|
-
browser.on('targetcreated', thisOnTargetCreated);
|
|
153
|
-
offOnClose.push(() => browser.off('targetcreated', thisOnTargetCreated));
|
|
154
|
-
this.initialized = true;
|
|
155
|
-
this.dependencies.forEach(x => x.init(browser));
|
|
156
|
-
return this.afterLaunch(browser);
|
|
157
|
-
}
|
|
158
|
-
async afterLaunch(_browser) { null; }
|
|
159
|
-
async onClose() { null; }
|
|
160
|
-
async onTargetCreated(target) {
|
|
161
|
-
if (this.isStopped)
|
|
162
|
-
return;
|
|
163
|
-
if (target.type() !== 'page')
|
|
164
|
-
return;
|
|
165
|
-
const page = newPage(await target.page());
|
|
166
|
-
if (page.isClosed())
|
|
167
|
-
return;
|
|
168
|
-
const offOnClose = [];
|
|
169
|
-
page.once('close', async () => {
|
|
170
|
-
offOnClose.forEach(fn => fn());
|
|
171
|
-
});
|
|
172
|
-
const requestHandlers = [];
|
|
173
|
-
page.on('request', request => {
|
|
174
|
-
const _respond = request.respond;
|
|
175
|
-
let responded = 0;
|
|
176
|
-
let respondArgs;
|
|
177
|
-
const _abort = request.abort;
|
|
178
|
-
let aborted = 0;
|
|
179
|
-
let abortArgs;
|
|
180
|
-
const _continue = request.continue;
|
|
181
|
-
let continued = 0;
|
|
182
|
-
let continueArgs;
|
|
183
|
-
const handleRequest = async function () {
|
|
184
|
-
const total = responded + aborted + continued;
|
|
185
|
-
if (!request._interceptionHandled) {
|
|
186
|
-
if (responded === 1)
|
|
187
|
-
await _respond.apply(request, respondArgs);
|
|
188
|
-
else if (responded === 0 && aborted >= 1 && total === requestHandlers.length)
|
|
189
|
-
await _abort.apply(request, abortArgs);
|
|
190
|
-
else if (continued === requestHandlers.length)
|
|
191
|
-
await _continue.apply(request, continueArgs);
|
|
192
|
-
}
|
|
193
|
-
};
|
|
194
|
-
request.respond = async function () { responded++; respondArgs = respondArgs || arguments; await handleRequest(); };
|
|
195
|
-
request.abort = async function () { aborted++; abortArgs = abortArgs || arguments; await handleRequest(); };
|
|
196
|
-
request.continue = async function () { continued++; continueArgs = continueArgs || arguments; await handleRequest(); };
|
|
197
|
-
requestHandlers.forEach(handler => handler(request));
|
|
198
|
-
});
|
|
199
|
-
const _pageOn = page.on;
|
|
200
|
-
page.on = function async(eventName, handler) {
|
|
201
|
-
if (eventName === 'request') {
|
|
202
|
-
requestHandlers.push(handler);
|
|
203
|
-
return page;
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
return _pageOn.call(page, eventName, handler);
|
|
207
|
-
}
|
|
208
|
-
};
|
|
209
|
-
if (this.requiresInterception) {
|
|
210
|
-
await page.setRequestInterception(true);
|
|
211
|
-
const thisOnRequest = this.onRequest.bind(this);
|
|
212
|
-
page.on('request', thisOnRequest);
|
|
213
|
-
offOnClose.push(() => page.off('request', thisOnRequest));
|
|
214
|
-
}
|
|
215
|
-
const thisOnDialog = this.onDialog.bind(this);
|
|
216
|
-
page.on('dialog', thisOnDialog);
|
|
217
|
-
offOnClose.push(() => page.off('dialog', thisOnDialog));
|
|
218
|
-
await this.onPageCreated(page);
|
|
219
|
-
}
|
|
220
|
-
async onPageCreated(_page) { null; }
|
|
221
|
-
async onRequest(request) {
|
|
222
|
-
const interceptionHandled = request._interceptionHandled;
|
|
223
|
-
if (interceptionHandled)
|
|
224
|
-
return;
|
|
225
|
-
if (this.isStopped)
|
|
226
|
-
return request.continue();
|
|
227
|
-
await this.processRequest(request);
|
|
228
|
-
}
|
|
229
|
-
async processRequest(_request) { null; }
|
|
230
|
-
async onDialog(dialog) {
|
|
231
|
-
if (this.isStopped)
|
|
232
|
-
return;
|
|
233
|
-
const _dismiss = dialog.dismiss;
|
|
234
|
-
dialog.dismiss = async () => {
|
|
235
|
-
if (dialog.handled)
|
|
236
|
-
return;
|
|
237
|
-
await _dismiss.apply(dialog);
|
|
238
|
-
};
|
|
239
|
-
await this.processDialog(dialog);
|
|
240
|
-
}
|
|
241
|
-
async processDialog(_dialog) { null; }
|
|
242
|
-
async beforeRestart() { null; }
|
|
243
|
-
async restart() {
|
|
244
|
-
await this.beforeRestart();
|
|
245
|
-
this.startCounter++;
|
|
246
|
-
if (this.requiresInterception && this.browser)
|
|
247
|
-
this.browser.interceptions++;
|
|
248
|
-
this.dependencies.forEach(x => x.restart());
|
|
249
|
-
await this.afterRestart();
|
|
250
|
-
}
|
|
251
|
-
async afterRestart() { null; }
|
|
252
|
-
async beforeStop() { null; }
|
|
253
|
-
async stop() {
|
|
254
|
-
await this.beforeStop();
|
|
255
|
-
this.startCounter--;
|
|
256
|
-
if (this.requiresInterception && this.browser)
|
|
257
|
-
this.browser.interceptions--;
|
|
258
|
-
if (this.browser && this.browser.interceptions === 0) {
|
|
259
|
-
const pages = await this.browser.pages();
|
|
260
|
-
pages.filter(x => !x.isClosed()).forEach(async (page) => {
|
|
261
|
-
await page.setRequestInterception(false);
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
this.dependencies.forEach(x => x.stop());
|
|
265
|
-
await this.afterStop();
|
|
266
|
-
}
|
|
267
|
-
async afterStop() { null; }
|
|
268
|
-
async getFirstPage() {
|
|
269
|
-
if (!this.browser)
|
|
270
|
-
return null;
|
|
271
|
-
const pages = await this.browser.pages();
|
|
272
|
-
const openPages = pages.filter(x => !x.isClosed());
|
|
273
|
-
const activePages = pages.filter(x => x.url() !== 'about:blank');
|
|
274
|
-
return activePages[0] || openPages[0];
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
exports.Plugin = Plugin;
|
|
278
124
|
const anonymize_user_agent_1 = require("./plugins/anonymize.user.agent");
|
|
279
125
|
const avoid_detection_1 = require("./plugins/avoid.detection");
|
|
280
126
|
const block_resources_1 = require("./plugins/block.resources");
|
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 */\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, waitOptions?: Puppeteer.WaitForSelectorOptions, clickOptions?: Readonly<Puppeteer.ClickOptions>): Promise<void> => {\r\n await page.waitForSelector(selector, waitOptions);\r\n await page.click(selector, clickOptions);\r\n };\r\n\r\n page.waitAndType = async (selector: string, text: string, waitOptions?: Puppeteer.WaitForSelectorOptions, typeOptions?: Readonly<Puppeteer.KeyboardTypeOptions>): Promise<void> => {\r\n await page.waitForSelector(selector, waitOptions);\r\n await page.type(selector, text, typeOptions);\r\n };\r\n\r\n page.withLoader = async<T>(fn: () => Promise<T>, loadingSelector: string, visibleWaitOptions?: Puppeteer.WaitForSelectorOptions, hiddenWaitOptions?: Puppeteer.WaitForSelectorOptions): Promise<T> => {\r\n const loadingVisible = page.waitForSelector(loadingSelector, visibleWaitOptions);\r\n\r\n const ret = await fn();\r\n\r\n await loadingVisible;\r\n await page.waitForSelector(loadingSelector, hiddenWaitOptions || { hidden: true });\r\n\r\n return ret;\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 (options?: FingerprintGeneratorOptions): Promise<AvoidDetectionPlugin> => {\r\n const plugin = new AvoidDetectionPlugin(options);\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, waitOptions?: Puppeteer.WaitForSelectorOptions, clickOptions?: Readonly<Puppeteer.ClickOptions>): Promise<void>;\r\n waitAndType(selector: string, text: string, waitOptions?: Puppeteer.WaitForSelectorOptions, typeOptions?: Readonly<Puppeteer.KeyboardTypeOptions>): Promise<void>;\r\n withLoader<T>(fn: () => Promise<T>, loadingSelector: string, visibleWaitOptions?: Puppeteer.WaitForSelectorOptions, hiddenWaitOptions?: Puppeteer.WaitForSelectorOptions): Promise<T>;\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: (options?: FingerprintGeneratorOptions) => 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\r\nimport type { newInjectedPage } from 'fingerprint-injector';\r\ntype FingerprintGeneratorOptions = Parameters<typeof newInjectedPage>[1];\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as events from 'events';\n\n// Puppeteer Defaults\nimport * as Puppeteer from 'puppeteer';\n\nimport type { Plugin } from './plugins';\n\nexport async function connect(options?: Puppeteer.ConnectOptions): Promise<Browser> {\n const browser = await Puppeteer.connect(options || {});\n\n return createBrowser(browser);\n}\n\nexport async function launch(options?: Puppeteer.LaunchOptions & Puppeteer.ConnectOptions): Promise<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 return createBrowser(browser);\n}\n\nasync function createBrowser(puppeteerBrowser: Puppeteer.Browser): Promise<Browser> {\n const browser = puppeteerBrowser as Browser;\n\n const _close = browser.close;\n browser.close = async () => {\n await _close.apply(browser);\n browser.browserEvents.emit('close');\n };\n\n const _createBrowserContext = browser.createBrowserContext;\n browser.createBrowserContext = async (options?: Puppeteer.BrowserContextOptions) => {\n const context: Puppeteer.BrowserContext = await _createBrowserContext.apply(browser, options);\n\n return createBrowserContext(context);\n };\n\n const _newPage = browser.newPage;\n browser.newPage = async () => {\n const page: Puppeteer.Page = await _newPage.apply(browser);\n\n return newPage(page);\n };\n\n addPluginSupport(browser);\n\n return browser;\n}\n\nasync function createBrowserContext(puppeteerBrowserContext: Puppeteer.BrowserContext): Promise<BrowserContext> {\n const browser = puppeteerBrowserContext as BrowserContext;\n\n const _close = browser.close;\n browser.close = async () => {\n await _close.apply(browser);\n browser.browserEvents.emit('close');\n };\n\n const _newPage = browser.newPage;\n browser.newPage = async () => {\n const page: Puppeteer.Page = await _newPage.apply(browser);\n\n return newPage(page);\n };\n\n addPluginSupport(browser);\n\n return browser;\n}\n\nfunction newPage(oldPage: Puppeteer.Page): Page {\n const page = oldPage as Page;\n\n page.waitAndClick = async (selector: string, waitOptions?: Puppeteer.WaitForSelectorOptions, clickOptions?: Readonly<Puppeteer.ClickOptions>): Promise<void> => {\n await page.waitForSelector(selector, waitOptions);\n await page.click(selector, clickOptions);\n };\n\n page.waitAndType = async (selector: string, text: string, waitOptions?: Puppeteer.WaitForSelectorOptions, typeOptions?: Readonly<Puppeteer.KeyboardTypeOptions>): Promise<void> => {\n await page.waitForSelector(selector, waitOptions);\n await page.type(selector, text, typeOptions);\n };\n\n page.withLoader = async<T>(fn: () => Promise<T>, loadingSelector: string, visibleWaitOptions?: Puppeteer.WaitForSelectorOptions, hiddenWaitOptions?: Puppeteer.WaitForSelectorOptions): Promise<T> => {\n const loadingVisible = page.waitForSelector(loadingSelector, visibleWaitOptions);\n\n const ret = await fn();\n\n await loadingVisible;\n await page.waitForSelector(loadingSelector, hiddenWaitOptions || { hidden: true });\n\n return ret;\n };\n\n return page;\n}\n\nfunction addPluginSupport(browser: Browser | BrowserContext) {\n browser.plugins = [];\n browser.browserEvents = new events.EventEmitter();\n browser.interceptions = 0;\n\n browser.addPlugin = async (plugin: Plugin) => {\n browser.plugins.push(plugin);\n await plugin.init(browser);\n };\n\n browser.clearPlugins = () => {\n browser.plugins.forEach(async plugin => {\n await plugin.stop();\n });\n\n browser.plugins = [];\n };\n\n browser.anonymizeUserAgent = async (): Promise<AnonymizeUserAgentPlugin> => {\n const plugin = new AnonymizeUserAgentPlugin();\n await browser.addPlugin(plugin);\n return plugin;\n };\n\n browser.avoidDetection = async (options?: FingerprintGeneratorOptions): Promise<AvoidDetectionPlugin> => {\n const plugin = new AvoidDetectionPlugin(options);\n await browser.addPlugin(plugin);\n return plugin;\n };\n\n browser.blockResources = async (...resources: Resource[]): Promise<BlockResourcesPlugin> => {\n const plugin = new BlockResourcesPlugin(resources);\n await browser.addPlugin(plugin);\n return plugin;\n };\n\n browser.disableDialogs = async (logMessages = false): Promise<DisableDialogsPlugin> => {\n const plugin = new DisableDialogsPlugin(logMessages);\n await browser.addPlugin(plugin);\n return plugin;\n };\n\n browser.manageCookies = async (opts: ManageCookiesOption): Promise<ManageCookiesPlugin> => {\n const plugin = new ManageCookiesPlugin(opts);\n await browser.addPlugin(plugin);\n return plugin;\n };\n\n browser.manageLocalStorage = async (opts: ManageLocalStorageOption): Promise<ManageLocalStoragePlugin> => {\n const plugin = new ManageLocalStoragePlugin(opts);\n await browser.addPlugin(plugin);\n return plugin;\n };\n\n browser.solveRecaptchas = async (accessToken: string): Promise<SolveRecaptchasPlugin> => {\n const plugin = new SolveRecaptchasPlugin(accessToken);\n await browser.addPlugin(plugin);\n return plugin;\n };\n}\n\n// PuppeteerPro\nexport interface Browser extends Puppeteer.Browser, Pluginable {\n createBrowserContext(options?: Puppeteer.BrowserContextOptions): Promise<BrowserContext>;\n newPage(): Promise<Page>;\n}\n\nexport interface BrowserContext extends Puppeteer.BrowserContext, Pluginable {\n newPage(): Promise<Page>;\n}\n\nexport interface Page extends Puppeteer.Page {\n waitAndClick(selector: string, waitOptions?: Puppeteer.WaitForSelectorOptions, clickOptions?: Readonly<Puppeteer.ClickOptions>): Promise<void>;\n waitAndType(selector: string, text: string, waitOptions?: Puppeteer.WaitForSelectorOptions, typeOptions?: Readonly<Puppeteer.KeyboardTypeOptions>): Promise<void>;\n withLoader<T>(fn: () => Promise<T>, loadingSelector: string, visibleWaitOptions?: Puppeteer.WaitForSelectorOptions, hiddenWaitOptions?: Puppeteer.WaitForSelectorOptions): Promise<T>;\n}\ninterface Pluginable {\n plugins: Plugin[];\n browserEvents: events.EventEmitter;\n interceptions: number;\n\n addPlugin: (plugin: Plugin) => Promise<void>;\n clearPlugins: () => void;\n anonymizeUserAgent: () => Promise<AnonymizeUserAgentPlugin>;\n avoidDetection: (options?: FingerprintGeneratorOptions) => Promise<AvoidDetectionPlugin>;\n blockResources: (...resources: Resource[]) => Promise<BlockResourcesPlugin>;\n disableDialogs: (logMessages?: boolean) => Promise<DisableDialogsPlugin>;\n manageCookies: (opts: ManageCookiesOption) => Promise<ManageCookiesPlugin>;\n manageLocalStorage: (opts: ManageLocalStorageOption) => Promise<ManageLocalStoragePlugin>;\n solveRecaptchas: (accessToken: string) => Promise<SolveRecaptchasPlugin>;\n}\n\nimport { AnonymizeUserAgentPlugin } from './plugins/anonymize.user.agent';\nimport { AvoidDetectionPlugin } from './plugins/avoid.detection';\nimport { BlockResourcesPlugin, Resource } from './plugins/block.resources';\nimport { DisableDialogsPlugin } from './plugins/disable.dialogs';\nimport { ManageCookiesOption, ManageCookiesPlugin } from './plugins/manage.cookies';\nimport { ManageLocalStorageOption, ManageLocalStoragePlugin } from './plugins/manage.localstorage';\nimport { SolveRecaptchasPlugin } from './plugins/solve.recaptchas';\n\nimport type { newInjectedPage } from 'fingerprint-injector';\ntype FingerprintGeneratorOptions = Parameters<typeof newInjectedPage>[1];\n"]}
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "puppeteer-pro",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.3",
|
|
4
4
|
"description": "A simple puppeteer wrapper to enable useful plugins with ease",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"clean": "rm -rf dist",
|
|
8
8
|
"lint": "eslint --fix",
|
|
9
9
|
"prebuild": "npm run clean",
|
|
10
|
-
"build": "tsc",
|
|
10
|
+
"build": "tsc -p tsconfig.app.json",
|
|
11
11
|
"postbuild": "npm run copy:injections && npm run copy:files",
|
|
12
12
|
"copy:injections": "copyfiles -u 1 src/plugins/*/injections/* dist",
|
|
13
13
|
"copy:files": "copyfiles package.json README.md LICENSE dist",
|
|
14
|
-
"test": "
|
|
15
|
-
"test-watch": "
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test-watch": "vitest --watch"
|
|
16
16
|
},
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|
|
@@ -39,19 +39,17 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"fingerprint-injector": "^2.1.82",
|
|
41
41
|
"ghost-cursor": "^1.4.2",
|
|
42
|
-
"user-agents": "^2.1.
|
|
42
|
+
"user-agents": "^2.1.64"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@types/
|
|
46
|
-
"@types/node": "^25.6.0",
|
|
45
|
+
"@types/node": "^25.9.1",
|
|
47
46
|
"@types/user-agents": "^1.0.4",
|
|
48
47
|
"copyfiles": "^2.4.1",
|
|
49
48
|
"dotenv-safe": "^9.1.0",
|
|
50
|
-
"eslint-config-final": "^1.
|
|
51
|
-
"
|
|
52
|
-
"puppeteer": "^24.40.0",
|
|
53
|
-
"ts-jest": "^29.4.9",
|
|
49
|
+
"eslint-config-final": "^1.7.9",
|
|
50
|
+
"puppeteer": "^25.1.0",
|
|
54
51
|
"ts-node": "^10.9.2",
|
|
55
|
-
"typescript": "^
|
|
52
|
+
"typescript": "^6.0.3",
|
|
53
|
+
"vitest": "^4.1.8"
|
|
56
54
|
}
|
|
57
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/anonymize.user.agent/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/anonymize.user.agent/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAU5B,qBAAa,wBAAyB,SAAQ,MAAM;IAClD,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,SAAS,CAAC,CAAS;;cAYX,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc;cAS7C,OAAO;cAIP,aAAa,CAAC,IAAI,EAAE,IAAI;cASxB,aAAa;cAQb,SAAS;CAO1B"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AnonymizeUserAgentPlugin = void 0;
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const __1 = require("
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const user_agents_1 = tslib_1.__importDefault(require("user-agents"));
|
|
6
|
+
const __1 = require("..");
|
|
7
7
|
const sleep = (time) => { return new Promise(resolve => { setTimeout(resolve, time); }); };
|
|
8
8
|
class AnonymizeUserAgentPlugin extends __1.Plugin {
|
|
9
9
|
constructor() {
|
|
10
10
|
super();
|
|
11
11
|
this.pages = [];
|
|
12
12
|
try {
|
|
13
|
-
this.userAgent = new
|
|
13
|
+
this.userAgent = new user_agents_1.default({ vendor: 'Google Inc.', platform: 'Win32' }).toString();
|
|
14
14
|
}
|
|
15
15
|
catch (_ex) {
|
|
16
16
|
console.warn('Could not create a random user agent');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/anonymize.user.agent/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/anonymize.user.agent/index.ts"],"names":[],"mappings":";;;;AAAA,sEAAoC;AAGpC,0BAA4B;AAE5B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,GAAG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAQnG,MAAa,wBAAyB,SAAQ,UAAM;IAIlD;QACE,KAAK,EAAE,CAAC;QAJF,UAAK,GAAoB,EAAE,CAAC;QAMlC,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAiC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;QACjC,OAAO,CAAC,OAAO,GAAG,KAAK,IAAmB,EAAE;YAC1C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,mCAAmC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,OAAO;QACrB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,IAAU;QACtC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,+BAA+B,CAAC,CAAC;QAE/I,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAE3D,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;IACvD,CAAC;IAES,KAAK,CAAC,aAAa;QAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAAE,SAAS;YAErC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAES,KAAK,CAAC,SAAS;QACvB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAAE,SAAS;YAErC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;CACF;AAnDD,4DAmDC","sourcesContent":["import UserAgent from 'user-agents';\n\nimport type { Browser, BrowserContext, Page } from '../..';\nimport { Plugin } from '..';\n\nconst sleep = (time: number) => { return new Promise(resolve => { setTimeout(resolve, time); }); };\n\ninterface PageUserAgent {\n target: Page;\n userAgent: string;\n newUserAgent: string;\n}\n\nexport class AnonymizeUserAgentPlugin extends Plugin {\n private pages: PageUserAgent[] = [];\n private userAgent?: string;\n\n constructor() {\n super();\n\n try {\n this.userAgent = new UserAgent({ vendor: 'Google Inc.', platform: 'Win32' }).toString();\n } catch (_ex) {\n console.warn('Could not create a random user agent');\n }\n }\n\n protected async afterLaunch(browser: Browser | BrowserContext) {\n const _newPage = browser.newPage;\n browser.newPage = async (): Promise<Page> => {\n const page = await _newPage.apply(browser);\n await sleep(100); // Sleep to allow user agent to set\n return page;\n };\n }\n\n protected async onClose() {\n this.pages = [];\n }\n\n protected async onPageCreated(page: Page) {\n const userAgent = await page.browser().userAgent();\n const newUserAgent = this.userAgent || userAgent.replace('HeadlessChrome/', 'Chrome/').replace(/\\(([^)]+)\\)/, '(Windows NT 10.0; Win64; x64)');\n\n this.pages.push({ target: page, userAgent, newUserAgent });\n\n await page.setUserAgent({ userAgent: newUserAgent });\n }\n\n protected async beforeRestart() {\n for (const page of this.pages) {\n if (page.target.isClosed()) continue;\n\n await page.target.setUserAgent({ userAgent: page.newUserAgent });\n }\n }\n\n protected async afterStop() {\n for (const page of this.pages) {\n if (page.target.isClosed()) continue;\n\n await page.target.setUserAgent({ userAgent: page.userAgent });\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { newInjectedPage } from 'fingerprint-injector';
|
|
2
|
-
import { Browser, BrowserContext
|
|
2
|
+
import type { Browser, BrowserContext } from '../..';
|
|
3
|
+
import { Plugin } from '..';
|
|
3
4
|
type FingerprintGeneratorOptions = Parameters<typeof newInjectedPage>[1];
|
|
4
5
|
export declare class AvoidDetectionPlugin extends Plugin {
|
|
5
6
|
fingerprintOptions?: FingerprintGeneratorOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/avoid.detection/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAQ,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/avoid.detection/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAQ,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAE5B,KAAK,2BAA2B,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzE,qBAAa,oBAAqB,SAAQ,MAAM;IAC9C,kBAAkB,CAAC,EAAE,2BAA2B,CAAC;gBAErC,kBAAkB,CAAC,EAAE,2BAA2B;cAK5C,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc;CAc9D"}
|