puppeteer-pro 2.4.8 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "puppeteer-pro",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "A simple puppeteer wrapper to enable useful plugins with ease",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -37,10 +37,9 @@
|
|
|
37
37
|
"node": ">=10.0.0"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"
|
|
41
|
-
"fingerprint-injector": "^2.1.81",
|
|
40
|
+
"fingerprint-injector": "^2.1.82",
|
|
42
41
|
"ghost-cursor": "^1.4.2",
|
|
43
|
-
"user-agents": "^
|
|
42
|
+
"user-agents": "^2.1.16"
|
|
44
43
|
},
|
|
45
44
|
"devDependencies": {
|
|
46
45
|
"@types/jest": "^30.0.0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/solve.recaptchas/index.ts"],"names":[],"mappings":"
|
|
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,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACrC,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,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SolveRecaptchasPlugin = void 0;
|
|
4
|
-
const axios_1 = require("axios");
|
|
5
4
|
const path = require("path");
|
|
6
5
|
const ghost_cursor_1 = require("ghost-cursor");
|
|
7
6
|
const __1 = require("../..");
|
|
@@ -67,13 +66,19 @@ class SolveRecaptchasPlugin extends __1.Plugin {
|
|
|
67
66
|
if (!audioArray)
|
|
68
67
|
return;
|
|
69
68
|
const audioBuffer = Buffer.from(new Int8Array(audioArray));
|
|
70
|
-
const response = await
|
|
69
|
+
const response = await fetch('https://api.wit.ai/speech?v=20220527', {
|
|
70
|
+
method: 'POST',
|
|
71
71
|
headers: {
|
|
72
72
|
Authorization: `Bearer ${this.witAiAccessToken}`,
|
|
73
73
|
'Content-Type': 'audio/wav',
|
|
74
74
|
},
|
|
75
|
+
body: audioBuffer,
|
|
75
76
|
});
|
|
76
|
-
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
throw new Error(`Wit.ai API error: ${response.status} ${response.statusText}`);
|
|
79
|
+
}
|
|
80
|
+
const text = await response.text();
|
|
81
|
+
const data = JSON.parse(text.split('\r\n').filter(line => line.trim()).slice(-1)[0] || '{}');
|
|
77
82
|
if (data === null || data === void 0 ? void 0 : data.text) {
|
|
78
83
|
const responseInput = await bframeFrame.$('#audio-response');
|
|
79
84
|
await (responseInput === null || responseInput === void 0 ? void 0 : responseInput.type(data.text));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/solve.recaptchas/index.ts"],"names":[],"mappings":";;;AAAA,
|
|
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';\r\nimport * as Puppeteer from 'puppeteer';\r\nimport { GhostCursor } from 'ghost-cursor';\r\n\r\nimport { Page, Plugin } from '../..';\r\nimport { AvoidDetectionPlugin } from './../avoid.detection';\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-require-imports\r\nconst injection = require(path.resolve(`${__dirname}/injections`) + '/utils.js');\r\nconst randomBetween = (min: number, max: number) => Math.floor(Math.random() * (max - min)) + min;\r\n\r\nexport class SolveRecaptchasPlugin extends Plugin {\r\n dependencies = [new AvoidDetectionPlugin()];\r\n witAiAccessToken?: string;\r\n\r\n constructor(witAiAccessToken: string) {\r\n super();\r\n this.witAiAccessToken = witAiAccessToken;\r\n }\r\n\r\n async waitForCaptcha(page: Page, timeout?: number) {\r\n return page.waitForFunction(() => !!document.querySelector<HTMLIFrameElement>('iframe[src*=\"api2/anchor\"]') &&\r\n !!document.querySelector<HTMLIFrameElement>('iframe[src*=\"api2/bframe\"]'), { timeout });\r\n }\r\n\r\n async hasCaptcha(page: Page) {\r\n return page.evaluate(() => !!document.querySelector<HTMLIFrameElement>('iframe[src*=\"api2/anchor\"]') &&\r\n !!document.querySelector<HTMLIFrameElement>('iframe[src*=\"api2/bframe\"]'));\r\n }\r\n\r\n async solveRecaptcha(page: Page) {\r\n if (this.isStopped) return;\r\n if (!this.witAiAccessToken) return;\r\n if (!(await this.hasCaptcha(page))) return;\r\n\r\n const anchorFrame = page.frames().find(x => x.url().includes('api2/anchor'));\r\n if (!anchorFrame) return;\r\n\r\n const cursor = new GhostCursor(page);\r\n\r\n async function waitForSelector(iframe: Puppeteer.Frame, selector: string) {\r\n await iframe.waitForFunction((_selector: string) => document.querySelector(_selector), {}, selector);\r\n }\r\n\r\n async function findAndClick(iframe: Puppeteer.Frame, selector: string) {\r\n await waitForSelector(iframe, selector);\r\n\r\n const element = await iframe.$(selector);\r\n if (!element) return;\r\n\r\n await sleep(randomBetween(1 * 1000, 3 * 1000));\r\n await cursor.click(element);\r\n }\r\n\r\n let numTriesLeft = 5;\r\n const isFinished = async () => {\r\n if (!(await this.hasCaptcha(page))) return true;\r\n if (--numTriesLeft === 0) return true;\r\n return anchorFrame?.evaluate(() => !!document.querySelector('.recaptcha-checkbox-checked'));\r\n };\r\n\r\n await findAndClick(anchorFrame, '#recaptcha-anchor');\r\n\r\n const bframeFrame = page.frames().find(x => x.url().includes('api2/bframe'));\r\n if (!bframeFrame) return;\r\n\r\n await findAndClick(bframeFrame, '.rc-button-audio');\r\n\r\n while (!(await isFinished())) {\r\n await waitForSelector(bframeFrame, '.rc-audiochallenge-tdownload-link');\r\n\r\n const audioUrl = await bframeFrame.evaluate(async () => document.querySelector<HTMLLinkElement>('.rc-audiochallenge-tdownload-link')?.href);\r\n if (!audioUrl) return;\r\n\r\n const audioArray = await bframeFrame.evaluate(injection, audioUrl);\r\n if (!audioArray) return;\r\n\r\n const audioBuffer = Buffer.from(new Int8Array(audioArray));\r\n\r\n const response = await fetch('https://api.wit.ai/speech?v=20220527', {\r\n method: 'POST',\r\n headers: {\r\n Authorization: `Bearer ${this.witAiAccessToken}`,\r\n 'Content-Type': 'audio/wav',\r\n },\r\n body: audioBuffer,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Wit.ai API error: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const text = await response.text();\r\n\r\n const data = JSON.parse(text.split('\\r\\n').filter(line => line.trim()).slice(-1)[0] || '{}');\r\n\r\n if (data?.text) {\r\n const responseInput = await bframeFrame.$('#audio-response');\r\n await responseInput?.type(data.text);\r\n\r\n await findAndClick(bframeFrame, '#recaptcha-verify-button');\r\n\r\n await sleep(1000);\r\n } else {\r\n await findAndClick(bframeFrame, '#recaptcha-reload-button');\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction sleep(timeout: number) {\r\n return new Promise(resolve => setTimeout(resolve, timeout));\r\n}\r\n"]}
|