puppeteer-pro 2.5.4 → 2.5.6
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 +2 -2
- package/index.d.ts +1 -1
- package/index.d.ts.map +1 -1
- package/index.js +45 -32
- package/index.js.map +1 -1
- package/package.json +8 -9
- package/plugins/anonymize.user.agent/index.js +4 -2
- package/plugins/anonymize.user.agent/index.js.map +1 -1
- package/plugins/index.d.ts +3 -0
- package/plugins/index.d.ts.map +1 -1
- package/plugins/index.js +49 -12
- package/plugins/index.js.map +1 -1
- package/plugins/manage.cookies/index.d.ts +2 -1
- package/plugins/manage.cookies/index.d.ts.map +1 -1
- package/plugins/manage.cookies/index.js +66 -38
- package/plugins/manage.cookies/index.js.map +1 -1
- package/plugins/manage.localstorage/index.d.ts +3 -1
- package/plugins/manage.localstorage/index.d.ts.map +1 -1
- package/plugins/manage.localstorage/index.js +72 -15
- package/plugins/manage.localstorage/index.js.map +1 -1
- package/plugins/shared.d.ts.map +1 -1
- package/plugins/shared.js +10 -4
- package/plugins/shared.js.map +1 -1
- package/plugins/solve.recaptchas/index.d.ts +1 -0
- package/plugins/solve.recaptchas/index.d.ts.map +1 -1
- package/plugins/solve.recaptchas/index.js +47 -8
- package/plugins/solve.recaptchas/index.js.map +1 -1
- package/plugins/solve.recaptchas/injections/utils.js +3 -2
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ A simple [`puppeteer`](https://github.com/puppeteer/puppeteer) wrapper to enable
|
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
|
-
Requires
|
|
7
|
+
Requires Node.js 22 and higher
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
npm install puppeteer-pro
|
|
@@ -22,7 +22,7 @@ const PuppeteerPro = require('puppeteer-pro');
|
|
|
22
22
|
const browser = await PuppeteerPro.launch();
|
|
23
23
|
|
|
24
24
|
// Enable the 'avoidDetection' plugin to prevent headless detection
|
|
25
|
-
browser.avoidDetection();
|
|
25
|
+
await browser.avoidDetection();
|
|
26
26
|
|
|
27
27
|
// Enable the 'solveRecaptchas' plugin to solve Google's recaptchas (remember to provide a wit.api API access token)
|
|
28
28
|
const solver = await browser.solveRecaptchas('WIT_AI_ACCESS_TOKEN');
|
package/index.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ interface Pluginable {
|
|
|
20
20
|
browserEvents: events.EventEmitter;
|
|
21
21
|
interceptions: number;
|
|
22
22
|
addPlugin: (plugin: Plugin) => Promise<void>;
|
|
23
|
-
clearPlugins: () => void
|
|
23
|
+
clearPlugins: () => Promise<void>;
|
|
24
24
|
anonymizeUserAgent: () => Promise<AnonymizeUserAgentPlugin>;
|
|
25
25
|
avoidDetection: (options?: FingerprintGeneratorOptions) => Promise<AvoidDetectionPlugin>;
|
|
26
26
|
blockResources: (...resources: Resource[]) => Promise<BlockResourcesPlugin>;
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AAEvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AAEvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,wBAAsB,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAIlF;AAED,wBAAsB,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3G;AA+GD,MAAM,WAAW,OAAQ,SAAQ,SAAS,CAAC,OAAO,EAAE,UAAU;IAC5D,oBAAoB,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACzF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,cAAe,SAAQ,SAAS,CAAC,cAAc,EAAE,UAAU;IAC1E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,IAAK,SAAQ,SAAS,CAAC,IAAI;IAC1C,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,sBAAsB,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/I,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,sBAAsB,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClK,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,SAAS,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,EAAE,SAAS,CAAC,sBAAsB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACvL;AACD,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC,YAAY,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IAEtB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,kBAAkB,EAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC5D,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE,2BAA2B,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzF,cAAc,EAAE,CAAC,GAAG,SAAS,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC5E,cAAc,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzE,aAAa,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC3E,kBAAkB,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC1F,eAAe,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAC1E;AAED,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACnG,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,KAAK,2BAA2B,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
package/index.js
CHANGED
|
@@ -1,20 +1,52 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.connect = connect;
|
|
4
37
|
exports.launch = launch;
|
|
5
|
-
const
|
|
6
|
-
const events = tslib_1.__importStar(require("events"));
|
|
38
|
+
const events = __importStar(require("events"));
|
|
7
39
|
// Puppeteer Defaults
|
|
8
|
-
const Puppeteer =
|
|
40
|
+
const Puppeteer = __importStar(require("puppeteer"));
|
|
41
|
+
const shared_1 = require("./plugins/shared");
|
|
9
42
|
async function connect(options) {
|
|
10
43
|
const browser = await Puppeteer.connect(options || {});
|
|
11
44
|
return createBrowser(browser);
|
|
12
45
|
}
|
|
13
46
|
async function launch(options) {
|
|
14
|
-
|
|
15
|
-
options = {};
|
|
47
|
+
const opts = { ...(options !== null && options !== void 0 ? options : {}) };
|
|
16
48
|
process.env.PUPPETEER_DISABLE_HEADLESS_WARNING = 'true';
|
|
17
|
-
const browser = await Puppeteer.launch({ defaultViewport: undefined, ...
|
|
49
|
+
const browser = await Puppeteer.launch({ defaultViewport: undefined, ...opts });
|
|
18
50
|
return createBrowser(browser);
|
|
19
51
|
}
|
|
20
52
|
async function createBrowser(puppeteerBrowser) {
|
|
@@ -26,13 +58,13 @@ async function createBrowser(puppeteerBrowser) {
|
|
|
26
58
|
};
|
|
27
59
|
const _createBrowserContext = browser.createBrowserContext;
|
|
28
60
|
browser.createBrowserContext = async (options) => {
|
|
29
|
-
const context = await _createBrowserContext.
|
|
61
|
+
const context = await _createBrowserContext.call(browser, options);
|
|
30
62
|
return createBrowserContext(context);
|
|
31
63
|
};
|
|
32
64
|
const _newPage = browser.newPage;
|
|
33
65
|
browser.newPage = async () => {
|
|
34
66
|
const page = await _newPage.apply(browser);
|
|
35
|
-
return newPage(page);
|
|
67
|
+
return (0, shared_1.newPage)(page);
|
|
36
68
|
};
|
|
37
69
|
addPluginSupport(browser);
|
|
38
70
|
return browser;
|
|
@@ -47,42 +79,23 @@ async function createBrowserContext(puppeteerBrowserContext) {
|
|
|
47
79
|
const _newPage = browser.newPage;
|
|
48
80
|
browser.newPage = async () => {
|
|
49
81
|
const page = await _newPage.apply(browser);
|
|
50
|
-
return newPage(page);
|
|
82
|
+
return (0, shared_1.newPage)(page);
|
|
51
83
|
};
|
|
52
84
|
addPluginSupport(browser);
|
|
53
85
|
return browser;
|
|
54
86
|
}
|
|
55
|
-
function newPage(oldPage) {
|
|
56
|
-
const page = oldPage;
|
|
57
|
-
page.waitAndClick = async (selector, waitOptions, clickOptions) => {
|
|
58
|
-
await page.waitForSelector(selector, waitOptions);
|
|
59
|
-
await page.click(selector, clickOptions);
|
|
60
|
-
};
|
|
61
|
-
page.waitAndType = async (selector, text, waitOptions, typeOptions) => {
|
|
62
|
-
await page.waitForSelector(selector, waitOptions);
|
|
63
|
-
await page.type(selector, text, typeOptions);
|
|
64
|
-
};
|
|
65
|
-
page.withLoader = async (fn, loadingSelector, visibleWaitOptions, hiddenWaitOptions) => {
|
|
66
|
-
const loadingVisible = page.waitForSelector(loadingSelector, visibleWaitOptions);
|
|
67
|
-
const ret = await fn();
|
|
68
|
-
await loadingVisible;
|
|
69
|
-
await page.waitForSelector(loadingSelector, hiddenWaitOptions || { hidden: true });
|
|
70
|
-
return ret;
|
|
71
|
-
};
|
|
72
|
-
return page;
|
|
73
|
-
}
|
|
74
87
|
function addPluginSupport(browser) {
|
|
75
88
|
browser.plugins = [];
|
|
76
89
|
browser.browserEvents = new events.EventEmitter();
|
|
77
90
|
browser.interceptions = 0;
|
|
78
91
|
browser.addPlugin = async (plugin) => {
|
|
92
|
+
if (browser.plugins.includes(plugin))
|
|
93
|
+
return;
|
|
79
94
|
browser.plugins.push(plugin);
|
|
80
95
|
await plugin.init(browser);
|
|
81
96
|
};
|
|
82
|
-
browser.clearPlugins = () => {
|
|
83
|
-
browser.plugins.
|
|
84
|
-
await plugin.stop();
|
|
85
|
-
});
|
|
97
|
+
browser.clearPlugins = async () => {
|
|
98
|
+
await Promise.all(browser.plugins.map(p => p.remove()));
|
|
86
99
|
browser.plugins = [];
|
|
87
100
|
};
|
|
88
101
|
browser.anonymizeUserAgent = async () => {
|
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":["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"]}
|
|
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';\nimport { newPage } from './plugins/shared';\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 const opts = { ...(options ?? {}) };\n\n process.env.PUPPETEER_DISABLE_HEADLESS_WARNING = 'true';\n const browser = await Puppeteer.launch({ defaultViewport: undefined, ...opts });\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.call(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 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 if (browser.plugins.includes(plugin)) return;\n browser.plugins.push(plugin);\n await plugin.init(browser);\n };\n\n browser.clearPlugins = async () => {\n await Promise.all(browser.plugins.map(p => p.remove()));\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: () => Promise<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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "puppeteer-pro",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.6",
|
|
4
4
|
"description": "A simple puppeteer wrapper to enable useful plugins with ease",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -11,8 +11,8 @@
|
|
|
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": "vitest run",
|
|
15
|
-
"test-watch": "vitest --watch"
|
|
14
|
+
"test": "vitest run --reporter=tree",
|
|
15
|
+
"test-watch": "vitest --reporter=tree --watch"
|
|
16
16
|
},
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"stealth"
|
|
35
35
|
],
|
|
36
36
|
"engines": {
|
|
37
|
-
"node": ">=
|
|
37
|
+
"node": ">=22"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"fingerprint-injector": "^2.1.82",
|
|
@@ -42,14 +42,13 @@
|
|
|
42
42
|
"user-agents": "^2.1.94"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@types/node": "^25.9.
|
|
45
|
+
"@types/node": "^25.9.5",
|
|
46
46
|
"@types/user-agents": "^1.0.4",
|
|
47
47
|
"copyfiles": "^2.4.1",
|
|
48
48
|
"dotenv-safe": "^9.1.0",
|
|
49
|
-
"eslint-config-final": "^1.
|
|
50
|
-
"puppeteer": "^25.
|
|
51
|
-
"ts-node": "^10.9.2",
|
|
49
|
+
"eslint-config-final": "^1.8.1",
|
|
50
|
+
"puppeteer": "^25.3.0",
|
|
52
51
|
"typescript": "^6.0.3",
|
|
53
|
-
"vitest": "^4.1.
|
|
52
|
+
"vitest": "^4.1.10"
|
|
54
53
|
}
|
|
55
54
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.AnonymizeUserAgentPlugin = void 0;
|
|
4
|
-
const
|
|
5
|
-
const user_agents_1 = tslib_1.__importDefault(require("user-agents"));
|
|
7
|
+
const user_agents_1 = __importDefault(require("user-agents"));
|
|
6
8
|
const __1 = require("..");
|
|
7
9
|
const sleep = (time) => { return new Promise(resolve => { setTimeout(resolve, time); }); };
|
|
8
10
|
class AnonymizeUserAgentPlugin extends __1.Plugin {
|
|
@@ -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,8DAAoC;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"]}
|
package/plugins/index.d.ts
CHANGED
|
@@ -5,12 +5,15 @@ export declare class Plugin {
|
|
|
5
5
|
protected browser: Browser | BrowserContext | null;
|
|
6
6
|
private initialized;
|
|
7
7
|
private startCounter;
|
|
8
|
+
private teardowns;
|
|
8
9
|
protected dependencies: Plugin[];
|
|
9
10
|
protected requiresInterception: boolean;
|
|
10
11
|
get isInitialized(): boolean;
|
|
11
12
|
get isStopped(): boolean;
|
|
12
13
|
addDependency(plugin: Plugin): Promise<void>;
|
|
13
14
|
init(browser: Browser | BrowserContext): Promise<void>;
|
|
15
|
+
remove(): Promise<void>;
|
|
16
|
+
private unbind;
|
|
14
17
|
protected afterLaunch(_browser: Browser | BrowserContext): Promise<void>;
|
|
15
18
|
protected onClose(): Promise<void>;
|
|
16
19
|
protected onTargetCreated(target: Puppeteer.Target): Promise<void>;
|
package/plugins/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AACxD,OAAO,EAAE,MAAM,EAAW,MAAM,UAAU,CAAC;AAE3C,qBAAa,MAAM;IACjB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAAQ;IAC1D,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,OAAO,GAAG,cAAc;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AACxD,OAAO,EAAE,MAAM,EAAW,MAAM,UAAU,CAAC;AAE3C,qBAAa,MAAM;IACjB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAAQ;IAC1D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAsB;IACvC,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,OAAO,GAAG,cAAc;IA8BtC,MAAM;IASZ,OAAO,CAAC,MAAM;cAKE,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,cAAc;cAC9C,OAAO;cAEP,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM;cAiFxC,aAAa,CAAC,KAAK,EAAE,IAAI;cAEzB,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;cAcG,YAAY;cAEZ,UAAU;IACpB,IAAI;cAqBM,SAAS;cAET,YAAY;CAS7B"}
|
package/plugins/index.js
CHANGED
|
@@ -8,6 +8,7 @@ class Plugin {
|
|
|
8
8
|
this.browser = null;
|
|
9
9
|
this.initialized = false;
|
|
10
10
|
this.startCounter = 0;
|
|
11
|
+
this.teardowns = [];
|
|
11
12
|
this.dependencies = [];
|
|
12
13
|
this.requiresInterception = false;
|
|
13
14
|
}
|
|
@@ -20,22 +21,38 @@ class Plugin {
|
|
|
20
21
|
if (this.initialized)
|
|
21
22
|
return;
|
|
22
23
|
this.browser = browser;
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
offOnClose.forEach(fn => fn());
|
|
24
|
+
const onBrowserClose = async () => {
|
|
25
|
+
this.unbind();
|
|
26
26
|
this.browser = null;
|
|
27
27
|
this.initialized = false;
|
|
28
28
|
this.startCounter = 0;
|
|
29
29
|
await this.onClose();
|
|
30
|
-
}
|
|
30
|
+
};
|
|
31
|
+
browser.browserEvents.once('close', onBrowserClose);
|
|
32
|
+
this.teardowns.push(() => browser.browserEvents.off('close', onBrowserClose));
|
|
31
33
|
this.startCounter++;
|
|
32
|
-
const thisOnTargetCreated =
|
|
34
|
+
const thisOnTargetCreated = (...args) => {
|
|
35
|
+
void Promise.resolve(this.onTargetCreated(...args)).catch(() => undefined);
|
|
36
|
+
};
|
|
33
37
|
browser.on('targetcreated', thisOnTargetCreated);
|
|
34
|
-
|
|
38
|
+
this.teardowns.push(() => browser.off('targetcreated', thisOnTargetCreated));
|
|
35
39
|
this.initialized = true;
|
|
36
|
-
this.dependencies.
|
|
40
|
+
await Promise.all(this.dependencies.map(x => x.init(browser)));
|
|
37
41
|
return this.afterLaunch(browser);
|
|
38
42
|
}
|
|
43
|
+
async remove() {
|
|
44
|
+
await this.stop();
|
|
45
|
+
await Promise.all(this.dependencies.map(x => x.remove()));
|
|
46
|
+
this.unbind();
|
|
47
|
+
this.browser = null;
|
|
48
|
+
this.initialized = false;
|
|
49
|
+
this.startCounter = 0;
|
|
50
|
+
}
|
|
51
|
+
unbind() {
|
|
52
|
+
for (const teardown of this.teardowns)
|
|
53
|
+
teardown();
|
|
54
|
+
this.teardowns = [];
|
|
55
|
+
}
|
|
39
56
|
async afterLaunch(_browser) { null; }
|
|
40
57
|
async onClose() { null; }
|
|
41
58
|
async onTargetCreated(target) {
|
|
@@ -75,7 +92,20 @@ class Plugin {
|
|
|
75
92
|
request.respond = async function () { responded++; respondArgs = respondArgs || arguments; await handleRequest(); };
|
|
76
93
|
request.abort = async function () { aborted++; abortArgs = abortArgs || arguments; await handleRequest(); };
|
|
77
94
|
request.continue = async function () { continued++; continueArgs = continueArgs || arguments; await handleRequest(); };
|
|
78
|
-
|
|
95
|
+
for (const handler of requestHandlers) {
|
|
96
|
+
void (async () => {
|
|
97
|
+
const before = responded + aborted + continued;
|
|
98
|
+
try {
|
|
99
|
+
await handler(request);
|
|
100
|
+
}
|
|
101
|
+
catch (_a) {
|
|
102
|
+
null;
|
|
103
|
+
}
|
|
104
|
+
if (responded + aborted + continued === before) {
|
|
105
|
+
await request.continue();
|
|
106
|
+
}
|
|
107
|
+
})();
|
|
108
|
+
}
|
|
79
109
|
});
|
|
80
110
|
const _pageOn = page.on;
|
|
81
111
|
page.on = function async(eventName, handler) {
|
|
@@ -122,27 +152,34 @@ class Plugin {
|
|
|
122
152
|
async processDialog(_dialog) { null; }
|
|
123
153
|
async beforeRestart() { null; }
|
|
124
154
|
async restart() {
|
|
155
|
+
if (!this.isStopped)
|
|
156
|
+
return;
|
|
157
|
+
if (!this.initialized || !this.browser)
|
|
158
|
+
return;
|
|
125
159
|
await this.beforeRestart();
|
|
126
160
|
this.startCounter++;
|
|
127
161
|
if (this.requiresInterception && this.browser)
|
|
128
162
|
this.browser.interceptions++;
|
|
129
|
-
this.dependencies.
|
|
163
|
+
await Promise.all(this.dependencies.map(x => x.restart()));
|
|
130
164
|
await this.afterRestart();
|
|
131
165
|
}
|
|
132
166
|
async afterRestart() { null; }
|
|
133
167
|
async beforeStop() { null; }
|
|
134
168
|
async stop() {
|
|
169
|
+
var _a;
|
|
170
|
+
if (this.isStopped)
|
|
171
|
+
return;
|
|
135
172
|
await this.beforeStop();
|
|
136
173
|
this.startCounter--;
|
|
137
174
|
if (this.requiresInterception && this.browser)
|
|
138
175
|
this.browser.interceptions--;
|
|
139
|
-
if (this.browser
|
|
176
|
+
if (((_a = this.browser) === null || _a === void 0 ? void 0 : _a.interceptions) === 0) {
|
|
140
177
|
const pages = await this.browser.pages();
|
|
141
178
|
pages.filter(x => !x.isClosed()).forEach(async (page) => {
|
|
142
179
|
await page.setRequestInterception(false);
|
|
143
180
|
});
|
|
144
181
|
}
|
|
145
|
-
this.dependencies.
|
|
182
|
+
await Promise.all(this.dependencies.map(x => x.stop()));
|
|
146
183
|
await this.afterStop();
|
|
147
184
|
}
|
|
148
185
|
async afterStop() { null; }
|
|
@@ -151,7 +188,7 @@ class Plugin {
|
|
|
151
188
|
return null;
|
|
152
189
|
const pages = await this.browser.pages();
|
|
153
190
|
const openPages = pages.filter(x => !x.isClosed());
|
|
154
|
-
const activePages =
|
|
191
|
+
const activePages = openPages.filter(x => x.url() !== 'about:blank');
|
|
155
192
|
return activePages[0] || openPages[0];
|
|
156
193
|
}
|
|
157
194
|
}
|
package/plugins/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-rest-params */\n\n// Puppeteer Defaults\nimport * as Puppeteer from 'puppeteer';\n\nimport type { Browser, BrowserContext, Page } from '..';\nimport { Dialog, newPage } from './shared';\n\nexport class Plugin {\n protected browser: Browser | BrowserContext | 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: Browser | BrowserContext) {\n if (this.initialized) return;\n\n this.browser = browser;\n\n const offOnClose: (() => void)[] = [];\n browser.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: Browser | BrowserContext) { 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 = newPage(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: 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 && this.browser) this.browser.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 && this.browser) this.browser.interceptions--;\n\n if (this.browser && this.browser.interceptions === 0) {\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"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-rest-params */\n\n// Puppeteer Defaults\nimport * as Puppeteer from 'puppeteer';\n\nimport type { Browser, BrowserContext, Page } from '..';\nimport { Dialog, newPage } from './shared';\n\nexport class Plugin {\n protected browser: Browser | BrowserContext | null = null;\n private initialized = false;\n private startCounter = 0;\n private teardowns: (() => void)[] = [];\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: Browser | BrowserContext) {\n if (this.initialized) return;\n\n this.browser = browser;\n\n const onBrowserClose = async () => {\n this.unbind();\n this.browser = null;\n this.initialized = false;\n this.startCounter = 0;\n await this.onClose();\n };\n browser.browserEvents.once('close', onBrowserClose);\n this.teardowns.push(() => browser.browserEvents.off('close', onBrowserClose));\n\n this.startCounter++;\n\n const thisOnTargetCreated = (...args: Parameters<Plugin['onTargetCreated']>) => {\n void Promise.resolve(this.onTargetCreated(...args)).catch(() => undefined);\n };\n browser.on('targetcreated', thisOnTargetCreated);\n this.teardowns.push(() => browser.off('targetcreated', thisOnTargetCreated));\n\n this.initialized = true;\n\n await Promise.all(this.dependencies.map(x => x.init(browser)));\n\n return this.afterLaunch(browser);\n }\n\n async remove() {\n await this.stop();\n await Promise.all(this.dependencies.map(x => x.remove()));\n this.unbind();\n this.browser = null;\n this.initialized = false;\n this.startCounter = 0;\n }\n\n private unbind() {\n for (const teardown of this.teardowns) teardown();\n this.teardowns = [];\n }\n\n protected async afterLaunch(_browser: Browser | BrowserContext) { 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 = newPage(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 for (const handler of requestHandlers) {\n void (async () => {\n const before = responded + aborted + continued;\n try {\n await handler(request);\n } catch {\n null;\n }\n if (responded + aborted + continued === before) {\n await request.continue();\n }\n })();\n }\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: 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 if (!this.isStopped) return;\n if (!this.initialized || !this.browser) return;\n\n await this.beforeRestart();\n\n this.startCounter++;\n if (this.requiresInterception && this.browser) this.browser.interceptions++;\n\n await Promise.all(this.dependencies.map(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 if (this.isStopped) return;\n\n await this.beforeStop();\n\n this.startCounter--;\n if (this.requiresInterception && this.browser) this.browser.interceptions--;\n\n if (this.browser?.interceptions === 0) {\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 await Promise.all(this.dependencies.map(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 = openPages.filter(x => x.url() !== 'about:blank');\n\n return activePages[0] || openPages[0];\n }\n}\n"]}
|
|
@@ -6,7 +6,7 @@ export interface ManageCookiesOption {
|
|
|
6
6
|
stringify?: (cookies: Record<string, Cookie[]>) => string;
|
|
7
7
|
parse?: (cookies: string) => Record<string, Cookie[]>;
|
|
8
8
|
disableWarning?: boolean;
|
|
9
|
-
profile?:
|
|
9
|
+
profile?: string;
|
|
10
10
|
}
|
|
11
11
|
export declare class ManageCookiesPlugin extends Plugin {
|
|
12
12
|
private saveLocation;
|
|
@@ -16,6 +16,7 @@ export declare class ManageCookiesPlugin extends Plugin {
|
|
|
16
16
|
private disableWarning;
|
|
17
17
|
private profile;
|
|
18
18
|
private allCookies;
|
|
19
|
+
private cookiesEpoch;
|
|
19
20
|
constructor(opts: ManageCookiesOption);
|
|
20
21
|
protected afterLaunch(): Promise<void>;
|
|
21
22
|
protected afterRestart(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/manage.cookies/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAI5B,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC;IAC1D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/manage.cookies/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAI5B,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC;IAC1D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,mBAAoB,SAAQ,MAAM;IAC7C,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,SAAS,CAAkE;IACnF,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,OAAO,CAAa;IAE5B,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,YAAY,CAAK;gBAEb,IAAI,EAAE,mBAAmB;cAgBrB,WAAW;cASX,YAAY;IAItB,eAAe,CAAC,OAAO,EAAE,MAAM;IAY/B,IAAI;IAOJ,IAAI;IAOJ,KAAK;YAMG,YAAY;YAiCZ,kBAAkB;YAUlB,kBAAkB;YAOlB,mBAAmB;YASnB,UAAU;CAOzB"}
|
|
@@ -1,10 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// https://gist.github.com/jeroenvisser101/636030fe66ea929b63a33f5cb3a711ad
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
3
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
37
|
exports.ManageCookiesPlugin = void 0;
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const fs = tslib_1.__importStar(require("fs/promises"));
|
|
38
|
+
const crypto = __importStar(require("crypto"));
|
|
39
|
+
const fs = __importStar(require("fs/promises"));
|
|
8
40
|
const __1 = require("..");
|
|
9
41
|
const sleep = (time) => { return new Promise(resolve => { setTimeout(resolve, time); }); };
|
|
10
42
|
class ManageCookiesPlugin extends __1.Plugin {
|
|
@@ -17,6 +49,7 @@ class ManageCookiesPlugin extends __1.Plugin {
|
|
|
17
49
|
this.disableWarning = false;
|
|
18
50
|
this.profile = 'default';
|
|
19
51
|
this.allCookies = {};
|
|
52
|
+
this.cookiesEpoch = 0;
|
|
20
53
|
// Need to find a better typescript way of doing this
|
|
21
54
|
this.saveLocation = opts.saveLocation || this.saveLocation;
|
|
22
55
|
this.mode = opts.mode || this.mode;
|
|
@@ -44,6 +77,11 @@ class ManageCookiesPlugin extends __1.Plugin {
|
|
|
44
77
|
async switchToProfile(profile) {
|
|
45
78
|
if (this.isStopped)
|
|
46
79
|
return;
|
|
80
|
+
if (profile === this.profile)
|
|
81
|
+
return;
|
|
82
|
+
if (this.mode === 'monitor') {
|
|
83
|
+
await this.saveProfileCookies();
|
|
84
|
+
}
|
|
47
85
|
this.profile = profile;
|
|
48
86
|
await this.loadProfileCookies();
|
|
49
87
|
}
|
|
@@ -75,15 +113,22 @@ class ManageCookiesPlugin extends __1.Plugin {
|
|
|
75
113
|
let oldProfile = '';
|
|
76
114
|
let oldHash = '';
|
|
77
115
|
while (!this.isStopped) {
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
if (
|
|
82
|
-
|
|
116
|
+
const profile = this.profile;
|
|
117
|
+
const epoch = this.cookiesEpoch;
|
|
118
|
+
const data = await this.getCookies();
|
|
119
|
+
if (this.isStopped || profile !== this.profile || epoch !== this.cookiesEpoch) {
|
|
120
|
+
await sleep(300);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const newHash = hash(this.stringify({ [profile]: data }));
|
|
124
|
+
if (oldProfile !== profile) {
|
|
125
|
+
oldProfile = profile;
|
|
126
|
+
oldHash = newHash;
|
|
83
127
|
}
|
|
84
128
|
else if (oldHash !== newHash) {
|
|
85
129
|
oldHash = newHash;
|
|
86
|
-
|
|
130
|
+
this.allCookies[profile] = data;
|
|
131
|
+
await fs.writeFile(this.saveLocation, this.stringify(this.allCookies));
|
|
87
132
|
}
|
|
88
133
|
else {
|
|
89
134
|
await sleep(300);
|
|
@@ -91,50 +136,33 @@ class ManageCookiesPlugin extends __1.Plugin {
|
|
|
91
136
|
}
|
|
92
137
|
}
|
|
93
138
|
async saveProfileCookies() {
|
|
94
|
-
|
|
139
|
+
const epoch = this.cookiesEpoch;
|
|
140
|
+
const data = await this.getCookies();
|
|
141
|
+
if (epoch !== this.cookiesEpoch)
|
|
142
|
+
return;
|
|
143
|
+
this.allCookies[this.profile] = data;
|
|
95
144
|
const cookiesString = this.stringify(this.allCookies);
|
|
96
145
|
await fs.writeFile(this.saveLocation, cookiesString);
|
|
97
146
|
}
|
|
98
147
|
async loadProfileCookies() {
|
|
99
|
-
|
|
100
|
-
const page = await this.getFirstPage();
|
|
101
|
-
if (!page)
|
|
148
|
+
if (!this.browser)
|
|
102
149
|
return;
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
await ((_a = this.browser) === null || _a === void 0 ? void 0 : _a.deleteCookie(...await this.getCookies()));
|
|
108
|
-
await ((_b = this.browser) === null || _b === void 0 ? void 0 : _b.setCookie(...this.allCookies[this.profile] || []));
|
|
109
|
-
if (requiresRealPage) {
|
|
110
|
-
await page.goBack();
|
|
111
|
-
}
|
|
150
|
+
this.cookiesEpoch++;
|
|
151
|
+
await this.browser.deleteCookie(...await this.getCookies());
|
|
152
|
+
await this.browser.setCookie(...this.allCookies[this.profile] || []);
|
|
112
153
|
}
|
|
113
154
|
async clearProfileCookies() {
|
|
114
155
|
var _a;
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
return;
|
|
118
|
-
const requiresRealPage = page.url() === 'about:blank';
|
|
119
|
-
if (requiresRealPage) {
|
|
120
|
-
await page.goto('http://www.google.com');
|
|
121
|
-
}
|
|
122
|
-
await ((_a = this.browser) === null || _a === void 0 ? void 0 : _a.deleteCookie(...this.allCookies[this.profile] || []));
|
|
156
|
+
this.cookiesEpoch++;
|
|
157
|
+
await ((_a = this.browser) === null || _a === void 0 ? void 0 : _a.deleteCookie(...await this.getCookies()));
|
|
123
158
|
delete this.allCookies[this.profile];
|
|
124
159
|
const cookiesString = this.stringify(this.allCookies);
|
|
125
160
|
await fs.writeFile(this.saveLocation, cookiesString);
|
|
126
|
-
if (requiresRealPage) {
|
|
127
|
-
await page.goBack();
|
|
128
|
-
}
|
|
129
161
|
}
|
|
130
162
|
async getCookies() {
|
|
131
163
|
var _a;
|
|
132
|
-
const page = await this.getFirstPage();
|
|
133
|
-
if (!page)
|
|
134
|
-
return [];
|
|
135
164
|
try {
|
|
136
|
-
|
|
137
|
-
return cookies;
|
|
165
|
+
return await ((_a = this.browser) === null || _a === void 0 ? void 0 : _a.cookies()) || [];
|
|
138
166
|
}
|
|
139
167
|
catch (_b) {
|
|
140
168
|
return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/manage.cookies/index.ts"],"names":[],"mappings":";AAAA,2EAA2E
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/manage.cookies/index.ts"],"names":[],"mappings":"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","sourcesContent":["// https://gist.github.com/jeroenvisser101/636030fe66ea929b63a33f5cb3a711ad\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs/promises';\nimport type { Cookie } from 'puppeteer';\n\nimport { Plugin } from '..';\n\nconst sleep = (time: number) => { return new Promise(resolve => { setTimeout(resolve, time); }); };\n\nexport interface ManageCookiesOption {\n saveLocation: string;\n mode: 'manual' | 'monitor';\n stringify?: (cookies: Record<string, Cookie[]>) => string;\n parse?: (cookies: string) => Record<string, Cookie[]>;\n disableWarning?: boolean;\n profile?: string;\n}\n\nexport class ManageCookiesPlugin extends Plugin {\n private saveLocation = '';\n private mode = '';\n private stringify = (cookies: Record<string, Cookie[]>) => JSON.stringify(cookies);\n private parse = (cookies: string) => JSON.parse(cookies);\n private disableWarning = false;\n private profile = 'default';\n\n private allCookies: Record<string, Cookie[]> = {};\n private cookiesEpoch = 0;\n\n constructor(opts: ManageCookiesOption) {\n super();\n\n // Need to find a better typescript way of doing this\n this.saveLocation = opts.saveLocation || this.saveLocation;\n this.mode = opts.mode || this.mode;\n this.stringify = opts.stringify || this.stringify;\n this.parse = opts.parse || this.parse;\n this.disableWarning = opts.disableWarning || this.disableWarning;\n this.profile = opts.profile || this.profile;\n\n if (this.disableWarning !== true) {\n console.warn('Warning: Exposing cookies in an unprotected manner can compromise your security. Add the `disableWarning` flag to remove this message.');\n }\n }\n\n protected async afterLaunch() {\n try {\n await fs.access(this.saveLocation);\n this.allCookies = this.parse((await fs.readFile(this.saveLocation)).toString() || '{}');\n } catch { null; }\n\n void this.watchCookies();\n }\n\n protected async afterRestart() {\n void this.watchCookies();\n }\n\n async switchToProfile(profile: string) {\n if (this.isStopped) return;\n if (profile === this.profile) return;\n\n if (this.mode === 'monitor') {\n await this.saveProfileCookies();\n }\n\n this.profile = profile;\n await this.loadProfileCookies();\n }\n\n async save() {\n if (this.isStopped) return;\n if (this.mode !== 'manual') return;\n\n await this.saveProfileCookies();\n }\n\n async load() {\n if (this.isStopped) return;\n if (this.mode !== 'manual') return;\n\n await this.loadProfileCookies();\n }\n\n async clear() {\n if (this.isStopped) return;\n\n await this.clearProfileCookies();\n }\n\n private async watchCookies() {\n if (this.isStopped) return;\n if (this.mode !== 'monitor') return;\n\n const hash = (x: string) => crypto.createHash('md5').update(x).digest('hex');\n\n let oldProfile = '';\n let oldHash = '';\n\n while (!this.isStopped) {\n const profile = this.profile;\n const epoch = this.cookiesEpoch;\n const data = await this.getCookies();\n if (this.isStopped || profile !== this.profile || epoch !== this.cookiesEpoch) {\n await sleep(300);\n continue;\n }\n\n const newHash = hash(this.stringify({ [profile]: data }));\n\n if (oldProfile !== profile) {\n oldProfile = profile;\n oldHash = newHash;\n } else if (oldHash !== newHash) {\n oldHash = newHash;\n this.allCookies[profile] = data;\n await fs.writeFile(this.saveLocation, this.stringify(this.allCookies));\n } else {\n await sleep(300);\n }\n }\n }\n\n private async saveProfileCookies() {\n const epoch = this.cookiesEpoch;\n const data = await this.getCookies();\n if (epoch !== this.cookiesEpoch) return;\n this.allCookies[this.profile] = data;\n\n const cookiesString = this.stringify(this.allCookies);\n await fs.writeFile(this.saveLocation, cookiesString);\n }\n\n private async loadProfileCookies() {\n if (!this.browser) return;\n this.cookiesEpoch++;\n await this.browser.deleteCookie(...await this.getCookies());\n await this.browser.setCookie(...this.allCookies[this.profile] || []);\n }\n\n private async clearProfileCookies() {\n this.cookiesEpoch++;\n await this.browser?.deleteCookie(...await this.getCookies());\n delete this.allCookies[this.profile];\n\n const cookiesString = this.stringify(this.allCookies);\n await fs.writeFile(this.saveLocation, cookiesString);\n }\n\n private async getCookies() {\n try {\n return await this.browser?.cookies() || [];\n } catch {\n return [];\n }\n }\n}\n"]}
|
|
@@ -5,7 +5,7 @@ export interface ManageLocalStorageOption {
|
|
|
5
5
|
stringify?: (localStorage: Record<string, LocalStorage>) => string;
|
|
6
6
|
parse?: (localStorage: string) => Record<string, LocalStorage>;
|
|
7
7
|
disableWarning?: boolean;
|
|
8
|
-
profile?:
|
|
8
|
+
profile?: string;
|
|
9
9
|
}
|
|
10
10
|
export declare class ManageLocalStoragePlugin extends Plugin {
|
|
11
11
|
private saveLocation;
|
|
@@ -15,6 +15,7 @@ export declare class ManageLocalStoragePlugin extends Plugin {
|
|
|
15
15
|
private disableWarning;
|
|
16
16
|
private profile;
|
|
17
17
|
private allLocalStorage;
|
|
18
|
+
private storageEpoch;
|
|
18
19
|
constructor(opts: ManageLocalStorageOption);
|
|
19
20
|
protected afterLaunch(): Promise<void>;
|
|
20
21
|
protected afterRestart(): Promise<void>;
|
|
@@ -23,6 +24,7 @@ export declare class ManageLocalStoragePlugin extends Plugin {
|
|
|
23
24
|
load(): Promise<void>;
|
|
24
25
|
clear(): Promise<void>;
|
|
25
26
|
private watchLocalStorage;
|
|
27
|
+
private mergeProfileLocalStorage;
|
|
26
28
|
private saveProfileLocalStorage;
|
|
27
29
|
private loadProfileLocalStorage;
|
|
28
30
|
private clearProfileLocalStorage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/manage.localstorage/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAI5B,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,MAAM,CAAC;IACnE,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/manage.localstorage/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAI5B,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,MAAM,CAAC;IACnE,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,wBAAyB,SAAQ,MAAM;IAClD,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,SAAS,CAAgF;IACjG,OAAO,CAAC,KAAK,CAAsD;IACnE,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,OAAO,CAAa;IAE5B,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,YAAY,CAAK;gBAEb,IAAI,EAAE,wBAAwB;cAgB1B,WAAW;cASX,YAAY;IAItB,eAAe,CAAC,OAAO,EAAE,MAAM;IAY/B,IAAI;IAOJ,IAAI;IAOJ,KAAK;YAMG,iBAAiB;IAiC/B,OAAO,CAAC,wBAAwB;YAOlB,uBAAuB;YAUvB,uBAAuB;YAKvB,wBAAwB;YASxB,eAAe;YAkBf,eAAe;CAgB9B;AAED,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC"}
|
|
@@ -1,10 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// https://gist.github.com/jeroenvisser101/636030fe66ea929b63a33f5cb3a711ad
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
3
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
37
|
exports.ManageLocalStoragePlugin = void 0;
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const fs = tslib_1.__importStar(require("fs/promises"));
|
|
38
|
+
const crypto = __importStar(require("crypto"));
|
|
39
|
+
const fs = __importStar(require("fs/promises"));
|
|
8
40
|
const __1 = require("..");
|
|
9
41
|
const sleep = (time) => { return new Promise(resolve => { setTimeout(resolve, time); }); };
|
|
10
42
|
class ManageLocalStoragePlugin extends __1.Plugin {
|
|
@@ -17,6 +49,7 @@ class ManageLocalStoragePlugin extends __1.Plugin {
|
|
|
17
49
|
this.disableWarning = false;
|
|
18
50
|
this.profile = 'default';
|
|
19
51
|
this.allLocalStorage = {};
|
|
52
|
+
this.storageEpoch = 0;
|
|
20
53
|
// Need to find a better typescript way of doing this
|
|
21
54
|
this.saveLocation = opts.saveLocation || this.saveLocation;
|
|
22
55
|
this.mode = opts.mode || this.mode;
|
|
@@ -44,6 +77,11 @@ class ManageLocalStoragePlugin extends __1.Plugin {
|
|
|
44
77
|
async switchToProfile(profile) {
|
|
45
78
|
if (this.isStopped)
|
|
46
79
|
return;
|
|
80
|
+
if (profile === this.profile)
|
|
81
|
+
return;
|
|
82
|
+
if (this.mode === 'monitor') {
|
|
83
|
+
await this.saveProfileLocalStorage();
|
|
84
|
+
}
|
|
47
85
|
this.profile = profile;
|
|
48
86
|
await this.loadProfileLocalStorage();
|
|
49
87
|
}
|
|
@@ -75,31 +113,51 @@ class ManageLocalStoragePlugin extends __1.Plugin {
|
|
|
75
113
|
let oldProfile = '';
|
|
76
114
|
let oldHash = '';
|
|
77
115
|
while (!this.isStopped) {
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
if (
|
|
82
|
-
|
|
116
|
+
const profile = this.profile;
|
|
117
|
+
const epoch = this.storageEpoch;
|
|
118
|
+
const data = await this.getLocalStorage();
|
|
119
|
+
if (this.isStopped || profile !== this.profile || epoch !== this.storageEpoch) {
|
|
120
|
+
await sleep(300);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const newHash = hash(this.stringify({ [profile]: data }));
|
|
124
|
+
if (oldProfile !== profile) {
|
|
125
|
+
oldProfile = profile;
|
|
126
|
+
oldHash = newHash;
|
|
83
127
|
}
|
|
84
128
|
else if (oldHash !== newHash) {
|
|
85
129
|
oldHash = newHash;
|
|
86
|
-
|
|
130
|
+
this.mergeProfileLocalStorage(profile, data);
|
|
131
|
+
await fs.writeFile(this.saveLocation, this.stringify(this.allLocalStorage));
|
|
87
132
|
}
|
|
88
133
|
else {
|
|
89
134
|
await sleep(300);
|
|
90
135
|
}
|
|
91
136
|
}
|
|
92
137
|
}
|
|
138
|
+
mergeProfileLocalStorage(profile, data) {
|
|
139
|
+
this.allLocalStorage[profile] = {
|
|
140
|
+
...(this.allLocalStorage[profile] || {}),
|
|
141
|
+
...data,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
93
144
|
async saveProfileLocalStorage() {
|
|
94
|
-
|
|
145
|
+
const epoch = this.storageEpoch;
|
|
146
|
+
const data = await this.getLocalStorage();
|
|
147
|
+
if (epoch !== this.storageEpoch)
|
|
148
|
+
return;
|
|
149
|
+
this.mergeProfileLocalStorage(this.profile, data);
|
|
95
150
|
const localStorageString = this.stringify(this.allLocalStorage);
|
|
96
151
|
await fs.writeFile(this.saveLocation, localStorageString);
|
|
97
152
|
}
|
|
98
153
|
async loadProfileLocalStorage() {
|
|
154
|
+
this.storageEpoch++;
|
|
99
155
|
await this.setLocalStorage(this.allLocalStorage[this.profile] || {});
|
|
100
156
|
}
|
|
101
157
|
async clearProfileLocalStorage() {
|
|
158
|
+
this.storageEpoch++;
|
|
102
159
|
delete this.allLocalStorage[this.profile];
|
|
160
|
+
await this.setLocalStorage({});
|
|
103
161
|
const localStorageString = this.stringify(this.allLocalStorage);
|
|
104
162
|
await fs.writeFile(this.saveLocation, localStorageString);
|
|
105
163
|
}
|
|
@@ -107,14 +165,13 @@ class ManageLocalStoragePlugin extends __1.Plugin {
|
|
|
107
165
|
if (!this.browser)
|
|
108
166
|
return;
|
|
109
167
|
const pages = await this.browser.pages();
|
|
110
|
-
const activePages = pages.filter(x => x.url() !== 'about:blank');
|
|
168
|
+
const activePages = pages.filter(x => !x.isClosed() && x.url() !== 'about:blank');
|
|
111
169
|
for (const page of activePages) {
|
|
112
170
|
const origin = await page.evaluate(() => window.origin);
|
|
113
171
|
await page.evaluate(originLocalStorage => {
|
|
114
|
-
const keys = Object.keys(originLocalStorage);
|
|
115
172
|
localStorage.clear();
|
|
116
|
-
for (
|
|
117
|
-
localStorage.setItem(
|
|
173
|
+
for (const key of Object.keys(originLocalStorage)) {
|
|
174
|
+
localStorage.setItem(key, originLocalStorage[key]);
|
|
118
175
|
}
|
|
119
176
|
}, allLocalStorage[origin] || {});
|
|
120
177
|
}
|
|
@@ -124,7 +181,7 @@ class ManageLocalStoragePlugin extends __1.Plugin {
|
|
|
124
181
|
return {};
|
|
125
182
|
const allLocalStorage = {};
|
|
126
183
|
const pages = await this.browser.pages();
|
|
127
|
-
const activePages = pages.filter(x => x.url() !== 'about:blank');
|
|
184
|
+
const activePages = pages.filter(x => !x.isClosed() && x.url() !== 'about:blank');
|
|
128
185
|
for (const page of activePages) {
|
|
129
186
|
const originLocalStorage = await page.evaluate(() => ({ [window.origin]: { ...localStorage } }));
|
|
130
187
|
Object.assign(allLocalStorage, originLocalStorage);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/manage.localstorage/index.ts"],"names":[],"mappings":"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","sourcesContent":["// https://gist.github.com/jeroenvisser101/636030fe66ea929b63a33f5cb3a711ad\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs/promises';\n\nimport { Plugin } from '..';\n\nconst sleep = (time: number) => { return new Promise(resolve => { setTimeout(resolve, time); }); };\n\nexport interface ManageLocalStorageOption {\n saveLocation: string;\n mode: 'manual' | 'monitor';\n stringify?: (localStorage: Record<string, LocalStorage>) => string;\n parse?: (localStorage: string) => Record<string, LocalStorage>;\n disableWarning?: boolean;\n profile?: 'string';\n}\n\nexport class ManageLocalStoragePlugin extends Plugin {\n private saveLocation = '';\n private mode = '';\n private stringify = (localStorage: Record<string, LocalStorage>) => JSON.stringify(localStorage);\n private parse = (localStorage: string) => JSON.parse(localStorage);\n private disableWarning = false;\n private profile = 'default';\n\n private allLocalStorage: Record<string, LocalStorage> = {};\n\n constructor(opts: ManageLocalStorageOption) {\n super();\n\n // Need to find a better typescript way of doing this\n this.saveLocation = opts.saveLocation || this.saveLocation;\n this.mode = opts.mode || this.mode;\n this.stringify = opts.stringify || this.stringify;\n this.parse = opts.parse || this.parse;\n this.disableWarning = opts.disableWarning || this.disableWarning;\n this.profile = opts.profile || this.profile;\n\n if (this.disableWarning !== true) {\n console.warn('Warning: Exposing local storage in an unprotected manner can compromise your security. Add the `disableWarning` flag to remove this message.');\n }\n }\n\n protected async afterLaunch() {\n try {\n await fs.access(this.saveLocation);\n this.allLocalStorage = this.parse((await fs.readFile(this.saveLocation)).toString() || '{}');\n } catch { null; }\n\n void this.watchLocalStorage();\n }\n\n protected async afterRestart() {\n void this.watchLocalStorage();\n }\n\n async switchToProfile(profile: string) {\n if (this.isStopped) return;\n\n this.profile = profile;\n\n await this.loadProfileLocalStorage();\n }\n\n async save() {\n if (this.isStopped) return;\n if (this.mode !== 'manual') return;\n\n await this.saveProfileLocalStorage();\n }\n\n async load() {\n if (this.isStopped) return;\n if (this.mode !== 'manual') return;\n\n await this.loadProfileLocalStorage();\n }\n\n async clear() {\n if (this.isStopped) return;\n\n await this.clearProfileLocalStorage();\n }\n\n private async watchLocalStorage() {\n if (this.isStopped) return;\n if (this.mode !== 'monitor') return;\n\n const hash = (x: string) => crypto.createHash('md5').update(x).digest('hex');\n\n let oldProfile = '';\n let oldHash = '';\n\n while (!this.isStopped) {\n const localStorage = { [this.profile]: await this.getLocalStorage() };\n const localStorageString = this.stringify(localStorage);\n const newHash = hash(localStorageString);\n\n if (oldProfile !== this.profile) {\n oldProfile = this.profile;\n } else if (oldHash !== newHash) {\n oldHash = newHash;\n await this.saveProfileLocalStorage();\n } else {\n await sleep(300);\n }\n }\n }\n\n private async saveProfileLocalStorage() {\n this.allLocalStorage[this.profile] = await this.getLocalStorage();\n\n const localStorageString = this.stringify(this.allLocalStorage);\n await fs.writeFile(this.saveLocation, localStorageString);\n }\n\n private async loadProfileLocalStorage() {\n await this.setLocalStorage(this.allLocalStorage[this.profile] || {});\n }\n\n private async clearProfileLocalStorage() {\n delete this.allLocalStorage[this.profile];\n\n const localStorageString = this.stringify(this.allLocalStorage);\n await fs.writeFile(this.saveLocation, localStorageString);\n }\n\n private async setLocalStorage(allLocalStorage: LocalStorage) {\n if (!this.browser) return;\n\n const pages = await this.browser.pages();\n const activePages = pages.filter(x => x.url() !== 'about:blank');\n\n for (const page of activePages) {\n const origin = await page.evaluate(() => window.origin);\n\n await page.evaluate(originLocalStorage => {\n const keys = Object.keys(originLocalStorage);\n localStorage.clear();\n\n for (let i = 0; i < Object.keys(localStorage).length; i++) {\n localStorage.setItem(keys[i], originLocalStorage[keys[i]]);\n }\n }, allLocalStorage[origin] || {});\n }\n }\n\n private async getLocalStorage() {\n if (!this.browser) return {};\n\n const allLocalStorage: LocalStorage = {};\n\n const pages = await this.browser.pages();\n const activePages = pages.filter(x => x.url() !== 'about:blank');\n\n for (const page of activePages) {\n const originLocalStorage = await page.evaluate(() => ({ [window.origin]: { ...localStorage } })) as LocalStorage;\n\n Object.assign(allLocalStorage, originLocalStorage);\n }\n\n return allLocalStorage;\n }\n}\n\ntype LocalStorage = Record<string, Record<string, string>>;\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/manage.localstorage/index.ts"],"names":[],"mappings":"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","sourcesContent":["// https://gist.github.com/jeroenvisser101/636030fe66ea929b63a33f5cb3a711ad\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs/promises';\n\nimport { Plugin } from '..';\n\nconst sleep = (time: number) => { return new Promise(resolve => { setTimeout(resolve, time); }); };\n\nexport interface ManageLocalStorageOption {\n saveLocation: string;\n mode: 'manual' | 'monitor';\n stringify?: (localStorage: Record<string, LocalStorage>) => string;\n parse?: (localStorage: string) => Record<string, LocalStorage>;\n disableWarning?: boolean;\n profile?: string;\n}\n\nexport class ManageLocalStoragePlugin extends Plugin {\n private saveLocation = '';\n private mode = '';\n private stringify = (localStorage: Record<string, LocalStorage>) => JSON.stringify(localStorage);\n private parse = (localStorage: string) => JSON.parse(localStorage);\n private disableWarning = false;\n private profile = 'default';\n\n private allLocalStorage: Record<string, LocalStorage> = {};\n private storageEpoch = 0;\n\n constructor(opts: ManageLocalStorageOption) {\n super();\n\n // Need to find a better typescript way of doing this\n this.saveLocation = opts.saveLocation || this.saveLocation;\n this.mode = opts.mode || this.mode;\n this.stringify = opts.stringify || this.stringify;\n this.parse = opts.parse || this.parse;\n this.disableWarning = opts.disableWarning || this.disableWarning;\n this.profile = opts.profile || this.profile;\n\n if (this.disableWarning !== true) {\n console.warn('Warning: Exposing local storage in an unprotected manner can compromise your security. Add the `disableWarning` flag to remove this message.');\n }\n }\n\n protected async afterLaunch() {\n try {\n await fs.access(this.saveLocation);\n this.allLocalStorage = this.parse((await fs.readFile(this.saveLocation)).toString() || '{}');\n } catch { null; }\n\n void this.watchLocalStorage();\n }\n\n protected async afterRestart() {\n void this.watchLocalStorage();\n }\n\n async switchToProfile(profile: string) {\n if (this.isStopped) return;\n if (profile === this.profile) return;\n\n if (this.mode === 'monitor') {\n await this.saveProfileLocalStorage();\n }\n\n this.profile = profile;\n await this.loadProfileLocalStorage();\n }\n\n async save() {\n if (this.isStopped) return;\n if (this.mode !== 'manual') return;\n\n await this.saveProfileLocalStorage();\n }\n\n async load() {\n if (this.isStopped) return;\n if (this.mode !== 'manual') return;\n\n await this.loadProfileLocalStorage();\n }\n\n async clear() {\n if (this.isStopped) return;\n\n await this.clearProfileLocalStorage();\n }\n\n private async watchLocalStorage() {\n if (this.isStopped) return;\n if (this.mode !== 'monitor') return;\n\n const hash = (x: string) => crypto.createHash('md5').update(x).digest('hex');\n\n let oldProfile = '';\n let oldHash = '';\n\n while (!this.isStopped) {\n const profile = this.profile;\n const epoch = this.storageEpoch;\n const data = await this.getLocalStorage();\n if (this.isStopped || profile !== this.profile || epoch !== this.storageEpoch) {\n await sleep(300);\n continue;\n }\n\n const newHash = hash(this.stringify({ [profile]: data }));\n\n if (oldProfile !== profile) {\n oldProfile = profile;\n oldHash = newHash;\n } else if (oldHash !== newHash) {\n oldHash = newHash;\n this.mergeProfileLocalStorage(profile, data);\n await fs.writeFile(this.saveLocation, this.stringify(this.allLocalStorage));\n } else {\n await sleep(300);\n }\n }\n }\n\n private mergeProfileLocalStorage(profile: string, data: LocalStorage) {\n this.allLocalStorage[profile] = {\n ...(this.allLocalStorage[profile] || {}),\n ...data,\n };\n }\n\n private async saveProfileLocalStorage() {\n const epoch = this.storageEpoch;\n const data = await this.getLocalStorage();\n if (epoch !== this.storageEpoch) return;\n this.mergeProfileLocalStorage(this.profile, data);\n\n const localStorageString = this.stringify(this.allLocalStorage);\n await fs.writeFile(this.saveLocation, localStorageString);\n }\n\n private async loadProfileLocalStorage() {\n this.storageEpoch++;\n await this.setLocalStorage(this.allLocalStorage[this.profile] || {});\n }\n\n private async clearProfileLocalStorage() {\n this.storageEpoch++;\n delete this.allLocalStorage[this.profile];\n await this.setLocalStorage({});\n\n const localStorageString = this.stringify(this.allLocalStorage);\n await fs.writeFile(this.saveLocation, localStorageString);\n }\n\n private async setLocalStorage(allLocalStorage: LocalStorage) {\n if (!this.browser) return;\n\n const pages = await this.browser.pages();\n const activePages = pages.filter(x => !x.isClosed() && x.url() !== 'about:blank');\n\n for (const page of activePages) {\n const origin = await page.evaluate(() => window.origin);\n\n await page.evaluate(originLocalStorage => {\n localStorage.clear();\n for (const key of Object.keys(originLocalStorage)) {\n localStorage.setItem(key, originLocalStorage[key]);\n }\n }, allLocalStorage[origin] || {});\n }\n }\n\n private async getLocalStorage() {\n if (!this.browser) return {};\n\n const allLocalStorage: LocalStorage = {};\n\n const pages = await this.browser.pages();\n const activePages = pages.filter(x => !x.isClosed() && x.url() !== 'about:blank');\n\n for (const page of activePages) {\n const originLocalStorage = await page.evaluate(() => ({ [window.origin]: { ...localStorage } })) as LocalStorage;\n\n Object.assign(allLocalStorage, originLocalStorage);\n }\n\n return allLocalStorage;\n }\n}\n\ntype LocalStorage = Record<string, Record<string, string>>;\n"]}
|
package/plugins/shared.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/plugins/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AAEvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE/B,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/plugins/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AAEvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE/B,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,GAAG,IAAI,CA4BrD;AAED,MAAM,WAAW,MAAO,SAAQ,SAAS,CAAC,MAAM;IAC9C,OAAO,EAAE,OAAO,CAAC;CAClB"}
|
package/plugins/shared.js
CHANGED
|
@@ -13,10 +13,16 @@ function newPage(oldPage) {
|
|
|
13
13
|
};
|
|
14
14
|
page.withLoader = async (fn, loadingSelector, visibleWaitOptions, hiddenWaitOptions) => {
|
|
15
15
|
const loadingVisible = page.waitForSelector(loadingSelector, visibleWaitOptions);
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
const retPromise = Promise.resolve().then(fn);
|
|
17
|
+
try {
|
|
18
|
+
const [, ret] = await Promise.all([loadingVisible, retPromise]);
|
|
19
|
+
await page.waitForSelector(loadingSelector, hiddenWaitOptions || { hidden: true });
|
|
20
|
+
return ret;
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
await retPromise.catch(() => undefined);
|
|
24
|
+
throw err;
|
|
25
|
+
}
|
|
20
26
|
};
|
|
21
27
|
return page;
|
|
22
28
|
}
|
package/plugins/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/plugins/shared.ts"],"names":[],"mappings":";;AAKA,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/plugins/shared.ts"],"names":[],"mappings":";;AAKA,0BA4BC;AA5BD,SAAgB,OAAO,CAAC,OAAuB;IAC7C,MAAM,IAAI,GAAG,OAAe,CAAC;IAE7B,IAAI,CAAC,YAAY,GAAG,KAAK,EAAE,QAAgB,EAAE,WAA8C,EAAE,YAA+C,EAAiB,EAAE;QAC7J,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,IAAI,CAAC,WAAW,GAAG,KAAK,EAAE,QAAgB,EAAE,IAAY,EAAE,WAA8C,EAAE,WAAqD,EAAiB,EAAE;QAChL,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,IAAI,CAAC,UAAU,GAAG,KAAK,EAAI,EAAoB,EAAE,eAAuB,EAAE,kBAAqD,EAAE,iBAAoD,EAAc,EAAE;QACnM,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;QACjF,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC;YAChE,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,iBAAiB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACnF,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["// Puppeteer Defaults\nimport * as Puppeteer from 'puppeteer';\n\nimport type { Page } from '..';\n\nexport function 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 const retPromise = Promise.resolve().then(fn);\n\n try {\n const [, ret] = await Promise.all([loadingVisible, retPromise]);\n await page.waitForSelector(loadingSelector, hiddenWaitOptions || { hidden: true });\n return ret;\n } catch (err) {\n await retPromise.catch(() => undefined);\n throw err;\n }\n };\n\n return page;\n}\n\nexport interface Dialog extends Puppeteer.Dialog {\n handled: boolean;\n}\n"]}
|
|
@@ -8,6 +8,7 @@ export declare class SolveRecaptchasPlugin extends Plugin {
|
|
|
8
8
|
constructor(witAiAccessToken: string);
|
|
9
9
|
waitForCaptcha(page: Page, timeout?: number): Promise<Puppeteer.JSHandle<false> | Puppeteer.JSHandle<true>>;
|
|
10
10
|
hasCaptcha(page: Page): Promise<boolean>;
|
|
11
|
+
isCaptchaSolved(page: Page): Promise<boolean>;
|
|
11
12
|
solveRecaptcha(page: Page): Promise<void>;
|
|
12
13
|
}
|
|
13
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/solve.recaptchas/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AAGvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAM5D,qBAAa,qBAAsB,SAAQ,MAAM;IAC/C,YAAY,yBAAgC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;gBAEd,gBAAgB,EAAE,MAAM;IAK9B,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM;IAK3C,UAAU,CAAC,IAAI,EAAE,IAAI;IAKrB,cAAc,CAAC,IAAI,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/solve.recaptchas/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AAGvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAM5D,qBAAa,qBAAsB,SAAQ,MAAM;IAC/C,YAAY,yBAAgC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;gBAEd,gBAAgB,EAAE,MAAM;IAK9B,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM;IAK3C,UAAU,CAAC,IAAI,EAAE,IAAI;IAKrB,eAAe,CAAC,IAAI,EAAE,IAAI;IAM1B,cAAc,CAAC,IAAI,EAAE,IAAI;CAiFhC"}
|
|
@@ -1,8 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.SolveRecaptchasPlugin = void 0;
|
|
4
|
-
const
|
|
5
|
-
const path = tslib_1.__importStar(require("path"));
|
|
37
|
+
const path = __importStar(require("path"));
|
|
6
38
|
const ghost_cursor_1 = require("ghost-cursor");
|
|
7
39
|
const __1 = require("..");
|
|
8
40
|
const avoid_detection_1 = require("./../avoid.detection");
|
|
@@ -23,6 +55,12 @@ class SolveRecaptchasPlugin extends __1.Plugin {
|
|
|
23
55
|
return page.evaluate(() => !!document.querySelector('iframe[src*="api2/anchor"]') &&
|
|
24
56
|
!!document.querySelector('iframe[src*="api2/bframe"]'));
|
|
25
57
|
}
|
|
58
|
+
async isCaptchaSolved(page) {
|
|
59
|
+
const anchorFrame = page.frames().find(x => x.url().includes('api2/anchor'));
|
|
60
|
+
if (!anchorFrame)
|
|
61
|
+
return false;
|
|
62
|
+
return anchorFrame.evaluate(() => !!document.querySelector('.recaptcha-checkbox-checked'));
|
|
63
|
+
}
|
|
26
64
|
async solveRecaptcha(page) {
|
|
27
65
|
if (this.isStopped)
|
|
28
66
|
return;
|
|
@@ -45,20 +83,21 @@ class SolveRecaptchasPlugin extends __1.Plugin {
|
|
|
45
83
|
await sleep(randomBetween(1 * 1000, 3 * 1000));
|
|
46
84
|
await cursor.click(element);
|
|
47
85
|
}
|
|
48
|
-
|
|
49
|
-
const isFinished = async () => {
|
|
86
|
+
const isSolved = async () => {
|
|
50
87
|
if (!(await this.hasCaptcha(page)))
|
|
51
88
|
return true;
|
|
52
|
-
|
|
53
|
-
return true;
|
|
54
|
-
return anchorFrame === null || anchorFrame === void 0 ? void 0 : anchorFrame.evaluate(() => !!document.querySelector('.recaptcha-checkbox-checked'));
|
|
89
|
+
return !!(await anchorFrame.evaluate(() => !!document.querySelector('.recaptcha-checkbox-checked')));
|
|
55
90
|
};
|
|
56
91
|
await findAndClick(anchorFrame, '#recaptcha-anchor');
|
|
57
92
|
const bframeFrame = page.frames().find(x => x.url().includes('api2/bframe'));
|
|
58
93
|
if (!bframeFrame)
|
|
59
94
|
return;
|
|
60
95
|
await findAndClick(bframeFrame, '.rc-button-audio');
|
|
61
|
-
|
|
96
|
+
const maxAttempts = 5;
|
|
97
|
+
for (let attempt = 0; !(await isSolved()); attempt++) {
|
|
98
|
+
if (attempt >= maxAttempts) {
|
|
99
|
+
throw new Error(`reCAPTCHA solve failed after ${maxAttempts} attempts`);
|
|
100
|
+
}
|
|
62
101
|
await waitForSelector(bframeFrame, '.rc-audiochallenge-tdownload-link');
|
|
63
102
|
const audioUrl = await bframeFrame.evaluate(async () => { var _a; return (_a = document.querySelector('.rc-audiochallenge-tdownload-link')) === null || _a === void 0 ? void 0 : _a.href; });
|
|
64
103
|
if (!audioUrl)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/solve.recaptchas/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/solve.recaptchas/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'path';\nimport * as Puppeteer from 'puppeteer';\nimport { GhostCursor } from 'ghost-cursor';\n\nimport type { Page } from '../..';\nimport { Plugin } from '..';\nimport { AvoidDetectionPlugin } from './../avoid.detection';\n\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst injection = require(path.resolve(`${__dirname}/injections`) + '/utils.js');\nconst randomBetween = (min: number, max: number) => Math.floor(Math.random() * (max - min)) + min;\n\nexport class SolveRecaptchasPlugin extends Plugin {\n dependencies = [new AvoidDetectionPlugin()];\n witAiAccessToken?: string;\n\n constructor(witAiAccessToken: string) {\n super();\n this.witAiAccessToken = witAiAccessToken;\n }\n\n async waitForCaptcha(page: Page, timeout?: number) {\n return page.waitForFunction(() => !!document.querySelector<HTMLIFrameElement>('iframe[src*=\"api2/anchor\"]') &&\n !!document.querySelector<HTMLIFrameElement>('iframe[src*=\"api2/bframe\"]'), { timeout });\n }\n\n async hasCaptcha(page: Page) {\n return page.evaluate(() => !!document.querySelector<HTMLIFrameElement>('iframe[src*=\"api2/anchor\"]') &&\n !!document.querySelector<HTMLIFrameElement>('iframe[src*=\"api2/bframe\"]'));\n }\n\n async isCaptchaSolved(page: Page) {\n const anchorFrame = page.frames().find(x => x.url().includes('api2/anchor'));\n if (!anchorFrame) return false;\n return anchorFrame.evaluate(() => !!document.querySelector('.recaptcha-checkbox-checked'));\n }\n\n async solveRecaptcha(page: Page) {\n if (this.isStopped) return;\n if (!this.witAiAccessToken) return;\n if (!(await this.hasCaptcha(page))) return;\n\n const anchorFrame = page.frames().find(x => x.url().includes('api2/anchor'));\n if (!anchorFrame) return;\n\n const cursor = new GhostCursor(page);\n\n async function waitForSelector(iframe: Puppeteer.Frame, selector: string) {\n await iframe.waitForFunction((_selector: string) => document.querySelector(_selector), {}, selector);\n }\n\n async function findAndClick(iframe: Puppeteer.Frame, selector: string) {\n await waitForSelector(iframe, selector);\n\n const element = await iframe.$(selector);\n if (!element) return;\n\n await sleep(randomBetween(1 * 1000, 3 * 1000));\n await cursor.click(element);\n }\n\n const isSolved = async () => {\n if (!(await this.hasCaptcha(page))) return true;\n return !!(await anchorFrame.evaluate(() => !!document.querySelector('.recaptcha-checkbox-checked')));\n };\n\n await findAndClick(anchorFrame, '#recaptcha-anchor');\n\n const bframeFrame = page.frames().find(x => x.url().includes('api2/bframe'));\n if (!bframeFrame) return;\n\n await findAndClick(bframeFrame, '.rc-button-audio');\n\n const maxAttempts = 5;\n for (let attempt = 0; !(await isSolved()); attempt++) {\n if (attempt >= maxAttempts) {\n throw new Error(`reCAPTCHA solve failed after ${maxAttempts} attempts`);\n }\n\n await waitForSelector(bframeFrame, '.rc-audiochallenge-tdownload-link');\n\n const audioUrl = await bframeFrame.evaluate(async () => document.querySelector<HTMLLinkElement>('.rc-audiochallenge-tdownload-link')?.href);\n if (!audioUrl) return;\n\n const audioArray = await bframeFrame.evaluate(injection, audioUrl);\n if (!audioArray) return;\n\n const audioBuffer = Buffer.from(new Int8Array(audioArray));\n\n const response = await fetch('https://api.wit.ai/speech?v=20220527', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.witAiAccessToken}`,\n 'Content-Type': 'audio/wav',\n },\n body: audioBuffer,\n });\n\n if (!response.ok) {\n throw new Error(`Wit.ai API error: ${response.status} ${response.statusText}`);\n }\n\n const text = await response.text();\n\n const data = JSON.parse(text.split('\\r\\n').filter(line => line.trim()).slice(-1)[0] || '{}');\n\n if (data?.text) {\n const responseInput = await bframeFrame.$('#audio-response');\n await responseInput?.type(data.text);\n\n await findAndClick(bframeFrame, '#recaptcha-verify-button');\n\n await sleep(1000);\n } else {\n await findAndClick(bframeFrame, '#recaptcha-reload-button');\n }\n }\n }\n}\n\nfunction sleep(timeout: number) {\n return new Promise(resolve => setTimeout(resolve, timeout));\n}\n"]}
|
|
@@ -133,10 +133,11 @@ module.exports = async (audioUrl) => {
|
|
|
133
133
|
|
|
134
134
|
const _audioBuffer = await normalizeAudio(audio);
|
|
135
135
|
|
|
136
|
+
const pad = _audioBuffer.duration > 3 ? 1.5 : 0;
|
|
136
137
|
const audioSlice = sliceAudio({
|
|
137
138
|
audioBuffer: _audioBuffer,
|
|
138
|
-
start:
|
|
139
|
-
end: _audioBuffer.duration -
|
|
139
|
+
start: pad,
|
|
140
|
+
end: _audioBuffer.duration - pad
|
|
140
141
|
});
|
|
141
142
|
|
|
142
143
|
const wav = audioBufferToWav(audioSlice);
|