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 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 node v10 and higher
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":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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 tslib_1 = require("tslib");
6
- const events = tslib_1.__importStar(require("events"));
38
+ const events = __importStar(require("events"));
7
39
  // Puppeteer Defaults
8
- const Puppeteer = tslib_1.__importStar(require("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
- if (!options)
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, ...options });
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.apply(browser, options);
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.forEach(async (plugin) => {
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.4",
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": ">=10.0.0"
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.3",
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.7.17",
50
- "puppeteer": "^25.1.0",
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.9"
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 tslib_1 = require("tslib");
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":";;;;AAAA,sEAAoC;AAGpC,0BAA4B;AAE5B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,GAAG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAQnG,MAAa,wBAAyB,SAAQ,UAAM;IAIlD;QACE,KAAK,EAAE,CAAC;QAJF,UAAK,GAAoB,EAAE,CAAC;QAMlC,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,OAAiC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;QACjC,OAAO,CAAC,OAAO,GAAG,KAAK,IAAmB,EAAE;YAC1C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,mCAAmC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,OAAO;QACrB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,IAAU;QACtC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,+BAA+B,CAAC,CAAC;QAE/I,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAE3D,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;IACvD,CAAC;IAES,KAAK,CAAC,aAAa;QAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAAE,SAAS;YAErC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAES,KAAK,CAAC,SAAS;QACvB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAAE,SAAS;YAErC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;CACF;AAnDD,4DAmDC","sourcesContent":["import UserAgent from 'user-agents';\n\nimport type { Browser, BrowserContext, Page } from '../..';\nimport { Plugin } from '..';\n\nconst sleep = (time: number) => { return new Promise(resolve => { setTimeout(resolve, time); }); };\n\ninterface PageUserAgent {\n target: Page;\n userAgent: string;\n newUserAgent: string;\n}\n\nexport class AnonymizeUserAgentPlugin extends Plugin {\n private pages: PageUserAgent[] = [];\n private userAgent?: string;\n\n constructor() {\n super();\n\n try {\n this.userAgent = new UserAgent({ vendor: 'Google Inc.', platform: 'Win32' }).toString();\n } catch (_ex) {\n console.warn('Could not create a random user agent');\n }\n }\n\n protected async afterLaunch(browser: Browser | BrowserContext) {\n const _newPage = browser.newPage;\n browser.newPage = async (): Promise<Page> => {\n const page = await _newPage.apply(browser);\n await sleep(100); // Sleep to allow user agent to set\n return page;\n };\n }\n\n protected async onClose() {\n this.pages = [];\n }\n\n protected async onPageCreated(page: Page) {\n const userAgent = await page.browser().userAgent();\n const newUserAgent = this.userAgent || userAgent.replace('HeadlessChrome/', 'Chrome/').replace(/\\(([^)]+)\\)/, '(Windows NT 10.0; Win64; x64)');\n\n this.pages.push({ target: page, userAgent, newUserAgent });\n\n await page.setUserAgent({ userAgent: newUserAgent });\n }\n\n protected async beforeRestart() {\n for (const page of this.pages) {\n if (page.target.isClosed()) continue;\n\n await page.target.setUserAgent({ userAgent: page.newUserAgent });\n }\n }\n\n protected async afterStop() {\n for (const page of this.pages) {\n if (page.target.isClosed()) continue;\n\n await page.target.setUserAgent({ userAgent: page.userAgent });\n }\n }\n}\n"]}
1
+ {"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"]}
@@ -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>;
@@ -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;cA6B5B,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,cAAc;cAC9C,OAAO;cAEP,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM;cAqExC,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;cAWG,YAAY;cAEZ,UAAU;IACpB,IAAI;cAmBM,SAAS;cAET,YAAY;CAS7B"}
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 offOnClose = [];
24
- browser.browserEvents.once('close', async () => {
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 = this.onTargetCreated.bind(this);
34
+ const thisOnTargetCreated = (...args) => {
35
+ void Promise.resolve(this.onTargetCreated(...args)).catch(() => undefined);
36
+ };
33
37
  browser.on('targetcreated', thisOnTargetCreated);
34
- offOnClose.push(() => browser.off('targetcreated', thisOnTargetCreated));
38
+ this.teardowns.push(() => browser.off('targetcreated', thisOnTargetCreated));
35
39
  this.initialized = true;
36
- this.dependencies.forEach(x => x.init(browser));
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
- requestHandlers.forEach(handler => handler(request));
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.forEach(x => x.restart());
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 && this.browser.interceptions === 0) {
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.forEach(x => x.stop());
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 = pages.filter(x => x.url() !== 'about:blank');
191
+ const activePages = openPages.filter(x => x.url() !== 'about:blank');
155
192
  return activePages[0] || openPages[0];
156
193
  }
157
194
  }
@@ -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?: 'string';
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,QAAQ,CAAC;CACpB;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;gBAEtC,IAAI,EAAE,mBAAmB;cAgBrB,WAAW;cASX,YAAY;IAItB,eAAe,CAAC,OAAO,EAAE,MAAM;IAQ/B,IAAI;IAOJ,IAAI;IAOJ,KAAK;YAMG,YAAY;YAyBZ,kBAAkB;YAOlB,kBAAkB;YAkBlB,mBAAmB;YAqBnB,UAAU;CAYzB"}
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 tslib_1 = require("tslib");
6
- const crypto = tslib_1.__importStar(require("crypto"));
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 cookies = { [this.profile]: await this.getCookies() };
79
- const cookiesString = this.stringify(cookies);
80
- const newHash = hash(cookiesString);
81
- if (oldProfile !== this.profile) {
82
- oldProfile = this.profile;
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
- await this.saveProfileCookies();
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
- this.allCookies[this.profile] = await this.getCookies();
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
- var _a, _b;
100
- const page = await this.getFirstPage();
101
- if (!page)
148
+ if (!this.browser)
102
149
  return;
103
- const requiresRealPage = page.url() === 'about:blank';
104
- if (requiresRealPage) {
105
- await page.goto('http://www.google.com');
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
- const page = await this.getFirstPage();
116
- if (!page)
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
- const cookies = await ((_a = this.browser) === null || _a === void 0 ? void 0 : _a.cookies()) || [];
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":"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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\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\n this.profile = profile;\n\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 cookies = { [this.profile]: await this.getCookies() };\n const cookiesString = this.stringify(cookies);\n const newHash = hash(cookiesString);\n\n if (oldProfile !== this.profile) {\n oldProfile = this.profile;\n } else if (oldHash !== newHash) {\n oldHash = newHash;\n await this.saveProfileCookies();\n } else {\n await sleep(300);\n }\n }\n }\n\n private async saveProfileCookies() {\n this.allCookies[this.profile] = await this.getCookies();\n\n const cookiesString = this.stringify(this.allCookies);\n await fs.writeFile(this.saveLocation, cookiesString);\n }\n\n private async loadProfileCookies() {\n const page = await this.getFirstPage();\n if (!page) return;\n\n const requiresRealPage = page.url() === 'about:blank';\n\n if (requiresRealPage) {\n await page.goto('http://www.google.com');\n }\n\n await this.browser?.deleteCookie(...await this.getCookies());\n await this.browser?.setCookie(...this.allCookies[this.profile] || []);\n\n if (requiresRealPage) {\n await page.goBack();\n }\n }\n\n private async clearProfileCookies() {\n const page = await this.getFirstPage();\n if (!page) return;\n\n const requiresRealPage = page.url() === 'about:blank';\n\n if (requiresRealPage) {\n await page.goto('http://www.google.com');\n }\n\n await this.browser?.deleteCookie(...this.allCookies[this.profile] || []);\n delete this.allCookies[this.profile];\n\n const cookiesString = this.stringify(this.allCookies);\n await fs.writeFile(this.saveLocation, cookiesString);\n\n if (requiresRealPage) {\n await page.goBack();\n }\n }\n\n private async getCookies() {\n const page = await this.getFirstPage();\n if (!page) return [];\n\n try {\n const cookies = await this.browser?.cookies() || [];\n\n return cookies;\n } catch {\n return [];\n }\n }\n}\n"]}
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?: 'string';
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,QAAQ,CAAC;CACpB;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;gBAE/C,IAAI,EAAE,wBAAwB;cAgB1B,WAAW;cASX,YAAY;IAItB,eAAe,CAAC,OAAO,EAAE,MAAM;IAQ/B,IAAI;IAOJ,IAAI;IAOJ,KAAK;YAMG,iBAAiB;YAyBjB,uBAAuB;YAOvB,uBAAuB;YAIvB,wBAAwB;YAOxB,eAAe;YAoBf,eAAe;CAgB9B;AAED,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC"}
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 tslib_1 = require("tslib");
6
- const crypto = tslib_1.__importStar(require("crypto"));
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 localStorage = { [this.profile]: await this.getLocalStorage() };
79
- const localStorageString = this.stringify(localStorage);
80
- const newHash = hash(localStorageString);
81
- if (oldProfile !== this.profile) {
82
- oldProfile = this.profile;
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
- await this.saveProfileLocalStorage();
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
- this.allLocalStorage[this.profile] = await this.getLocalStorage();
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 (let i = 0; i < Object.keys(localStorage).length; i++) {
117
- localStorage.setItem(keys[i], originLocalStorage[keys[i]]);
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"]}
@@ -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,CAyBrD;AAED,MAAM,WAAW,MAAO,SAAQ,SAAS,CAAC,MAAM;IAC9C,OAAO,EAAE,OAAO,CAAC;CAClB"}
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 ret = await fn();
17
- await loadingVisible;
18
- await page.waitForSelector(loadingSelector, hiddenWaitOptions || { hidden: true });
19
- return ret;
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/plugins/shared.ts"],"names":[],"mappings":";;AAKA,0BAyBC;AAzBD,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;QAEjF,MAAM,GAAG,GAAG,MAAM,EAAE,EAAE,CAAC;QAEvB,MAAM,cAAc,CAAC;QACrB,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,iBAAiB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnF,OAAO,GAAG,CAAC;IACb,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\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\nexport interface Dialog extends Puppeteer.Dialog {\n handled: boolean;\n}\n"]}
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;CA8EhC"}
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 tslib_1 = require("tslib");
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
- let numTriesLeft = 5;
49
- const isFinished = async () => {
86
+ const isSolved = async () => {
50
87
  if (!(await this.hasCaptcha(page)))
51
88
  return true;
52
- if (--numTriesLeft === 0)
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
- while (!(await isFinished())) {
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":"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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 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 let numTriesLeft = 5;\n const isFinished = async () => {\n if (!(await this.hasCaptcha(page))) return true;\n if (--numTriesLeft === 0) return true;\n return 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 while (!(await isFinished())) {\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"]}
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: 1.5,
139
- end: _audioBuffer.duration - 1.5
139
+ start: pad,
140
+ end: _audioBuffer.duration - pad
140
141
  });
141
142
 
142
143
  const wav = audioBufferToWav(audioSlice);