@minded-ai/mindedjs 2.0.39-beta.3 → 2.0.39-beta.5
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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/toolsLibrary/resolveCaptcha.d.ts +6 -15
- package/dist/toolsLibrary/resolveCaptcha.d.ts.map +1 -1
- package/dist/toolsLibrary/resolveCaptcha.js +69 -113
- package/dist/toolsLibrary/resolveCaptcha.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -0
- package/src/toolsLibrary/resolveCaptcha.ts +78 -123
package/dist/index.d.ts
CHANGED
|
@@ -38,4 +38,5 @@ export { createBrowserSession, destroyBrowserSession } from './browserTask/execu
|
|
|
38
38
|
export { withBrowserSession } from './toolsLibrary/withBrowserSession';
|
|
39
39
|
export { BrowserTaskMode } from './browserTask/types';
|
|
40
40
|
export { LLMDebugCallbackHandler } from './debugging';
|
|
41
|
+
export { resolveCaptcha } from './toolsLibrary/resolveCaptcha';
|
|
41
42
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/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/dist/index.js
CHANGED
|
@@ -36,7 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.LLMDebugCallbackHandler = exports.BrowserTaskMode = exports.withBrowserSession = exports.destroyBrowserSession = exports.createBrowserSession = exports.AnalyticsEventName = exports.AgentEvents = exports.createExtractor = exports.extract = exports.multiClassify = exports.createClassifier = exports.classify = exports.toolsLibrary = exports.zendesk = exports.Environment = exports.SessionType = exports.extractFromDocument = exports.DocumentProcessor = exports.ToolType = exports.RpaActionType = exports.KnownTriggerNames = exports.AppNodeMetadataType = exports.EdgeType = exports.TriggerType = exports.NodeType = exports.createParallelWrapper = exports.MindedChatOpenAI = exports.trackAnalyticsEvent = exports.mindedConnectionSocketMessageType = exports.escalateVoiceCall = exports.retellGetCall = exports.retellCall = exports.onTimer = exports.cancelTimer = exports.resetTimer = exports.sendPlaceholderMessage = exports.logger = exports.events = exports.Agent = void 0;
|
|
39
|
+
exports.resolveCaptcha = exports.LLMDebugCallbackHandler = exports.BrowserTaskMode = exports.withBrowserSession = exports.destroyBrowserSession = exports.createBrowserSession = exports.AnalyticsEventName = exports.AgentEvents = exports.createExtractor = exports.extract = exports.multiClassify = exports.createClassifier = exports.classify = exports.toolsLibrary = exports.zendesk = exports.Environment = exports.SessionType = exports.extractFromDocument = exports.DocumentProcessor = exports.ToolType = exports.RpaActionType = exports.KnownTriggerNames = exports.AppNodeMetadataType = exports.EdgeType = exports.TriggerType = exports.NodeType = exports.createParallelWrapper = exports.MindedChatOpenAI = exports.trackAnalyticsEvent = exports.mindedConnectionSocketMessageType = exports.escalateVoiceCall = exports.retellGetCall = exports.retellCall = exports.onTimer = exports.cancelTimer = exports.resetTimer = exports.sendPlaceholderMessage = exports.logger = exports.events = exports.Agent = void 0;
|
|
40
40
|
const agent_1 = require("./agent");
|
|
41
41
|
Object.defineProperty(exports, "Agent", { enumerable: true, get: function () { return agent_1.Agent; } });
|
|
42
42
|
const events_1 = __importDefault(require("./events"));
|
|
@@ -108,4 +108,6 @@ var types_1 = require("./browserTask/types");
|
|
|
108
108
|
Object.defineProperty(exports, "BrowserTaskMode", { enumerable: true, get: function () { return types_1.BrowserTaskMode; } });
|
|
109
109
|
var debugging_1 = require("./debugging");
|
|
110
110
|
Object.defineProperty(exports, "LLMDebugCallbackHandler", { enumerable: true, get: function () { return debugging_1.LLMDebugCallbackHandler; } });
|
|
111
|
+
var resolveCaptcha_1 = require("./toolsLibrary/resolveCaptcha");
|
|
112
|
+
Object.defineProperty(exports, "resolveCaptcha", { enumerable: true, get: function () { return resolveCaptcha_1.resolveCaptcha; } });
|
|
111
113
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAgC;AAY9B,sFAZO,aAAK,OAYP;AAXP,sDAA8B;AAY5B,iBAZK,gBAAM,CAYL;AAXR,2CAAwC;AAYtC,uFAZO,eAAM,OAYP;AAXR,yFAAsF;AAYpF,uGAZO,+CAAsB,OAYP;AAXxB,iDAAyE;AAYvE,2FAZO,kBAAU,OAYP;AACV,4FAbmB,mBAAW,OAanB;AACX,wFAdgC,eAAO,OAchC;AAbT,yDAAyE;AAcvE,2FAdO,mBAAU,OAcP;AACV,8FAfmB,sBAAa,OAenB;AAdf,+EAA4E;AAe1E,kGAfO,qCAAiB,OAeP;AAdnB,4EAAqF;AAenF,kHAfO,yDAAiC,OAeP;AAdnC,yDAAgE;AAe9D,oGAfO,+BAAmB,OAeP;AAGrB,6BAA6B;AAC7B,uEAAsE;AAA7D,oHAAA,gBAAgB,OAAA;AACzB,qEAA0E;AAAjE,wHAAA,qBAAqB,OAAA;AA4B9B,mDAS6B;AAR3B,uGAAA,QAAQ,OAAA;AACR,0GAAA,WAAW,OAAA;AACX,uGAAA,QAAQ,OAAA;AAER,kHAAA,mBAAmB,OAAA;AAEnB,gHAAA,iBAAiB,OAAA;AACjB,4GAAA,aAAa,OAAA;AAGf,mDAA+C;AAAtC,uGAAA,QAAQ,OAAA;AAEjB,gCAAgC;AAChC,4FAA+G;AAAtG,uHAAA,iBAAiB,OAAA;AAAE,yHAAA,mBAAmB,OAAA;AAO/C,mDAQ6B;AAF3B,0GAAA,WAAW,OAAA;AAIb,yDAAqD;AAA5C,6GAAA,WAAW,OAAA;AAEpB,gDAA+C;AAAtC,kGAAA,OAAO,OAAA;AAEhB,uBAAuB;AACvB,+DAA+C;AAE/C,8BAA8B;AAC9B,wDAAsF;AAA7E,sGAAA,QAAQ,OAAA;AAAE,8GAAA,gBAAgB,OAAA;AAAE,2GAAA,aAAa,OAAA;AAGlD,8BAA8B;AAC9B,wDAAqE;AAA5D,qGAAA,OAAO,OAAA;AAAE,6GAAA,eAAe,OAAA;AAGjC,qBAAqB;AACrB,oDAAmD;AAA1C,0GAAA,WAAW,OAAA;AAGpB,yBAAyB;AACzB,2DAA6D;AAApD,qHAAA,kBAAkB,OAAA;AAG3B,uEAA+F;AAAtF,0HAAA,oBAAoB,OAAA;AAAE,2HAAA,qBAAqB,OAAA;AACpD,wEAAuE;AAA9D,wHAAA,kBAAkB,OAAA;AAC3B,6CAAsD;AAA7C,wGAAA,eAAe,OAAA;AACxB,yCAAsD;AAA7C,oHAAA,uBAAuB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAgC;AAY9B,sFAZO,aAAK,OAYP;AAXP,sDAA8B;AAY5B,iBAZK,gBAAM,CAYL;AAXR,2CAAwC;AAYtC,uFAZO,eAAM,OAYP;AAXR,yFAAsF;AAYpF,uGAZO,+CAAsB,OAYP;AAXxB,iDAAyE;AAYvE,2FAZO,kBAAU,OAYP;AACV,4FAbmB,mBAAW,OAanB;AACX,wFAdgC,eAAO,OAchC;AAbT,yDAAyE;AAcvE,2FAdO,mBAAU,OAcP;AACV,8FAfmB,sBAAa,OAenB;AAdf,+EAA4E;AAe1E,kGAfO,qCAAiB,OAeP;AAdnB,4EAAqF;AAenF,kHAfO,yDAAiC,OAeP;AAdnC,yDAAgE;AAe9D,oGAfO,+BAAmB,OAeP;AAGrB,6BAA6B;AAC7B,uEAAsE;AAA7D,oHAAA,gBAAgB,OAAA;AACzB,qEAA0E;AAAjE,wHAAA,qBAAqB,OAAA;AA4B9B,mDAS6B;AAR3B,uGAAA,QAAQ,OAAA;AACR,0GAAA,WAAW,OAAA;AACX,uGAAA,QAAQ,OAAA;AAER,kHAAA,mBAAmB,OAAA;AAEnB,gHAAA,iBAAiB,OAAA;AACjB,4GAAA,aAAa,OAAA;AAGf,mDAA+C;AAAtC,uGAAA,QAAQ,OAAA;AAEjB,gCAAgC;AAChC,4FAA+G;AAAtG,uHAAA,iBAAiB,OAAA;AAAE,yHAAA,mBAAmB,OAAA;AAO/C,mDAQ6B;AAF3B,0GAAA,WAAW,OAAA;AAIb,yDAAqD;AAA5C,6GAAA,WAAW,OAAA;AAEpB,gDAA+C;AAAtC,kGAAA,OAAO,OAAA;AAEhB,uBAAuB;AACvB,+DAA+C;AAE/C,8BAA8B;AAC9B,wDAAsF;AAA7E,sGAAA,QAAQ,OAAA;AAAE,8GAAA,gBAAgB,OAAA;AAAE,2GAAA,aAAa,OAAA;AAGlD,8BAA8B;AAC9B,wDAAqE;AAA5D,qGAAA,OAAO,OAAA;AAAE,6GAAA,eAAe,OAAA;AAGjC,qBAAqB;AACrB,oDAAmD;AAA1C,0GAAA,WAAW,OAAA;AAGpB,yBAAyB;AACzB,2DAA6D;AAApD,qHAAA,kBAAkB,OAAA;AAG3B,uEAA+F;AAAtF,0HAAA,oBAAoB,OAAA;AAAE,2HAAA,qBAAqB,OAAA;AACpD,wEAAuE;AAA9D,wHAAA,kBAAkB,OAAA;AAC3B,6CAAsD;AAA7C,wGAAA,eAAe,OAAA;AACxB,yCAAsD;AAA7C,oHAAA,uBAAuB,OAAA;AAChC,gEAA+D;AAAtD,gHAAA,cAAc,OAAA"}
|
|
@@ -2,29 +2,20 @@ import { z } from 'zod';
|
|
|
2
2
|
import { Tool } from '../types/Tools.types';
|
|
3
3
|
import { Page } from 'playwright';
|
|
4
4
|
import { BaseLanguageModel } from '@langchain/core/language_models/base';
|
|
5
|
-
|
|
6
|
-
solution
|
|
7
|
-
isSuccess: z.ZodBoolean;
|
|
8
|
-
errorMessage: z.ZodOptional<z.ZodString>;
|
|
9
|
-
}, "strip", z.ZodTypeAny, {
|
|
10
|
-
isSuccess: boolean;
|
|
11
|
-
solution?: string | undefined;
|
|
12
|
-
errorMessage?: string | undefined;
|
|
13
|
-
}, {
|
|
5
|
+
export type ResolveCaptchaResult = {
|
|
6
|
+
solution?: string;
|
|
14
7
|
isSuccess: boolean;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}>;
|
|
18
|
-
export type ResolveCaptchaResult = z.infer<typeof captchaResolutionSchema>;
|
|
8
|
+
errorMessage?: string;
|
|
9
|
+
};
|
|
19
10
|
/**
|
|
20
11
|
* Utility function to resolve a CAPTCHA by taking a screenshot and analyzing it with an LLM
|
|
12
|
+
* Sends 5 parallel requests and returns the majority result
|
|
21
13
|
* @param page The Playwright page instance
|
|
22
14
|
* @param captchaSelector CSS selector, ID, or class name for the CAPTCHA element
|
|
23
15
|
* @param llm The language model to use for CAPTCHA solving (must be vision-capable)
|
|
24
|
-
* @param maxRetries Maximum number of retry attempts (default: 5)
|
|
25
16
|
* @returns The CAPTCHA resolution result with solution, isSuccess, and optional errorMessage
|
|
26
17
|
*/
|
|
27
|
-
export declare function resolveCaptcha(page: Page, captchaSelector: string, llm: BaseLanguageModel
|
|
18
|
+
export declare function resolveCaptcha(page: Page, captchaSelector: string, llm: BaseLanguageModel): Promise<ResolveCaptchaResult>;
|
|
28
19
|
export declare const schema: z.ZodObject<{
|
|
29
20
|
captchaSelector: z.ZodString;
|
|
30
21
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveCaptcha.d.ts","sourceRoot":"","sources":["../../src/toolsLibrary/resolveCaptcha.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAG5C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"resolveCaptcha.d.ts","sourceRoot":"","sources":["../../src/toolsLibrary/resolveCaptcha.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAG5C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAGzE,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,oBAAoB,CAAC,CA0H/B;AAGD,eAAO,MAAM,MAAM;;;;;;EAMjB,CAAC;AAEH,QAAA,MAAM,kBAAkB,EAAE,IAAI,CAAC,OAAO,MAAM,EAAE,GAAG,CA2ChD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -5,29 +5,20 @@ exports.resolveCaptcha = resolveCaptcha;
|
|
|
5
5
|
const zod_1 = require("zod");
|
|
6
6
|
const logger_1 = require("../utils/logger");
|
|
7
7
|
const messages_1 = require("@langchain/core/messages");
|
|
8
|
-
function supportsStructuredOutput(llm) {
|
|
9
|
-
return 'withStructuredOutput' in llm && typeof llm.withStructuredOutput === 'function';
|
|
10
|
-
}
|
|
11
|
-
// Schema for CAPTCHA resolution result
|
|
12
|
-
const captchaResolutionSchema = zod_1.z.object({
|
|
13
|
-
solution: zod_1.z.string().optional().describe('The CAPTCHA solution text (only present if successfully resolved)'),
|
|
14
|
-
isSuccess: zod_1.z.boolean().describe('Whether the CAPTCHA was successfully resolved'),
|
|
15
|
-
errorMessage: zod_1.z.string().optional().describe('Error message if the CAPTCHA could not be resolved'),
|
|
16
|
-
});
|
|
17
8
|
/**
|
|
18
9
|
* Utility function to resolve a CAPTCHA by taking a screenshot and analyzing it with an LLM
|
|
10
|
+
* Sends 5 parallel requests and returns the majority result
|
|
19
11
|
* @param page The Playwright page instance
|
|
20
12
|
* @param captchaSelector CSS selector, ID, or class name for the CAPTCHA element
|
|
21
13
|
* @param llm The language model to use for CAPTCHA solving (must be vision-capable)
|
|
22
|
-
* @param maxRetries Maximum number of retry attempts (default: 5)
|
|
23
14
|
* @returns The CAPTCHA resolution result with solution, isSuccess, and optional errorMessage
|
|
24
15
|
*/
|
|
25
|
-
async function resolveCaptcha(page, captchaSelector, llm
|
|
26
|
-
|
|
16
|
+
async function resolveCaptcha(page, captchaSelector, llm) {
|
|
17
|
+
const parallelRequests = 5;
|
|
27
18
|
logger_1.logger.info({
|
|
28
19
|
message: 'Attempting to resolve CAPTCHA',
|
|
29
20
|
selector: captchaSelector,
|
|
30
|
-
|
|
21
|
+
parallelRequests,
|
|
31
22
|
});
|
|
32
23
|
// Wait for the captcha element to be visible
|
|
33
24
|
await page.waitForSelector(captchaSelector, { timeout: 10000, state: 'visible' });
|
|
@@ -39,12 +30,8 @@ async function resolveCaptcha(page, captchaSelector, llm, maxRetries = 5) {
|
|
|
39
30
|
message: 'Captured CAPTCHA screenshot',
|
|
40
31
|
screenshotSize: screenshotBuffer.length,
|
|
41
32
|
});
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
45
|
-
try {
|
|
46
|
-
// Create the prompt with the image (matching Python version)
|
|
47
|
-
const prompt = `This image contains a CAPTCHA challenge. Please analyze it and provide the solution.
|
|
33
|
+
// Create the prompt with the image
|
|
34
|
+
const prompt = `This image contains a CAPTCHA challenge. Please analyze it and provide the solution.
|
|
48
35
|
|
|
49
36
|
Common CAPTCHA types:
|
|
50
37
|
1. **Text CAPTCHA**: Distorted letters/numbers - read the exact text
|
|
@@ -63,107 +50,76 @@ Respond with ONLY the solution text/answer. Examples:
|
|
|
63
50
|
- "HELLO" (for distorted text showing these letters)
|
|
64
51
|
|
|
65
52
|
If the image is unclear or you cannot determine the answer, respond with: "UNCLEAR"`;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
// Remove any quotation marks that might have been included
|
|
92
|
-
solution = solution.replace(/^["']|["']$/g, '');
|
|
93
|
-
logger_1.logger.info({
|
|
94
|
-
message: 'CAPTCHA resolution attempt',
|
|
95
|
-
attempt,
|
|
96
|
-
maxRetries,
|
|
97
|
-
solutionLength: solution.length,
|
|
98
|
-
});
|
|
99
|
-
// Check if the solution is "UNCLEAR"
|
|
100
|
-
if (solution.toUpperCase() === 'UNCLEAR') {
|
|
101
|
-
if (attempt < maxRetries) {
|
|
102
|
-
logger_1.logger.warn({
|
|
103
|
-
message: 'CAPTCHA image unclear, retrying',
|
|
104
|
-
attempt,
|
|
105
|
-
maxRetries,
|
|
106
|
-
});
|
|
107
|
-
// Wait a bit before retrying
|
|
108
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
return {
|
|
113
|
-
isSuccess: false,
|
|
114
|
-
errorMessage: 'Could not determine CAPTCHA solution from image after all retry attempts',
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
// Success - return the solution
|
|
119
|
-
result = {
|
|
120
|
-
solution,
|
|
121
|
-
isSuccess: true,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
// If using structured output, check if resolution failed
|
|
125
|
-
if (!result.isSuccess) {
|
|
126
|
-
if (attempt < maxRetries) {
|
|
127
|
-
logger_1.logger.warn({
|
|
128
|
-
message: 'CAPTCHA resolution failed, retrying',
|
|
129
|
-
attempt,
|
|
130
|
-
maxRetries,
|
|
131
|
-
errorMessage: result.errorMessage,
|
|
132
|
-
});
|
|
133
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
return result;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
// Success
|
|
141
|
-
logger_1.logger.info({
|
|
142
|
-
message: 'CAPTCHA solved successfully',
|
|
143
|
-
solutionLength: ((_a = result.solution) === null || _a === void 0 ? void 0 : _a.length) || 0,
|
|
144
|
-
attempts: attempt,
|
|
145
|
-
});
|
|
146
|
-
return result;
|
|
53
|
+
const dataUrl = `data:image/jpeg;base64,${imageBase64}`;
|
|
54
|
+
const message = new messages_1.HumanMessage({
|
|
55
|
+
content: [
|
|
56
|
+
{
|
|
57
|
+
type: 'text',
|
|
58
|
+
text: prompt,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
type: 'image_url',
|
|
62
|
+
image_url: {
|
|
63
|
+
url: dataUrl,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
});
|
|
68
|
+
// Send 5 parallel requests
|
|
69
|
+
const requests = Array.from({ length: parallelRequests }, async () => {
|
|
70
|
+
try {
|
|
71
|
+
const response = await llm.invoke([message]);
|
|
72
|
+
let solution = typeof response.content === 'string'
|
|
73
|
+
? response.content.trim()
|
|
74
|
+
: response.content.toString().trim();
|
|
75
|
+
// Remove any quotation marks that might have been included
|
|
76
|
+
solution = solution.replace(/^["']|["']$/g, '');
|
|
77
|
+
return solution;
|
|
147
78
|
}
|
|
148
79
|
catch (error) {
|
|
149
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
150
80
|
logger_1.logger.warn({
|
|
151
|
-
message: 'CAPTCHA resolution
|
|
152
|
-
|
|
153
|
-
maxRetries,
|
|
154
|
-
error: lastError.message,
|
|
81
|
+
message: 'CAPTCHA resolution request failed',
|
|
82
|
+
error: error instanceof Error ? error.message : String(error),
|
|
155
83
|
});
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
const results = await Promise.all(requests);
|
|
88
|
+
const validSolutions = results.filter((sol) => sol !== null && sol.toUpperCase() !== 'UNCLEAR');
|
|
89
|
+
if (validSolutions.length === 0) {
|
|
90
|
+
logger_1.logger.warn({
|
|
91
|
+
message: 'All CAPTCHA resolution requests failed or returned UNCLEAR',
|
|
92
|
+
totalRequests: parallelRequests,
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
isSuccess: false,
|
|
96
|
+
errorMessage: 'Could not determine CAPTCHA solution from image',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Count occurrences of each solution
|
|
100
|
+
const solutionCounts = new Map();
|
|
101
|
+
for (const solution of validSolutions) {
|
|
102
|
+
solutionCounts.set(solution, (solutionCounts.get(solution) || 0) + 1);
|
|
103
|
+
}
|
|
104
|
+
// Find the solution with the majority (most occurrences)
|
|
105
|
+
let majoritySolution = '';
|
|
106
|
+
let maxCount = 0;
|
|
107
|
+
for (const [solution, count] of solutionCounts.entries()) {
|
|
108
|
+
if (count > maxCount) {
|
|
109
|
+
maxCount = count;
|
|
110
|
+
majoritySolution = solution;
|
|
161
111
|
}
|
|
162
112
|
}
|
|
163
|
-
|
|
113
|
+
logger_1.logger.info({
|
|
114
|
+
message: 'CAPTCHA solved successfully using majority vote',
|
|
115
|
+
solutionLength: majoritySolution.length,
|
|
116
|
+
majorityCount: maxCount,
|
|
117
|
+
totalValidResponses: validSolutions.length,
|
|
118
|
+
totalRequests: parallelRequests,
|
|
119
|
+
});
|
|
164
120
|
return {
|
|
165
|
-
|
|
166
|
-
|
|
121
|
+
solution: majoritySolution,
|
|
122
|
+
isSuccess: true,
|
|
167
123
|
};
|
|
168
124
|
}
|
|
169
125
|
// Schema for the resolve captcha tool
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveCaptcha.js","sourceRoot":"","sources":["../../src/toolsLibrary/resolveCaptcha.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"resolveCaptcha.js","sourceRoot":"","sources":["../../src/toolsLibrary/resolveCaptcha.ts"],"names":[],"mappings":";;;AAsBA,wCA8HC;AApJD,6BAAwB;AAExB,4CAAyC;AACzC,uDAAwD;AAWxD;;;;;;;GAOG;AACI,KAAK,UAAU,cAAc,CAClC,IAAU,EACV,eAAuB,EACvB,GAAsB;IAEtB,MAAM,gBAAgB,GAAG,CAAC,CAAC;IAE3B,eAAM,CAAC,IAAI,CAAC;QACV,OAAO,EAAE,+BAA+B;QACxC,QAAQ,EAAE,eAAe;QACzB,gBAAgB;KACjB,CAAC,CAAC;IAEH,6CAA6C;IAC7C,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAElF,yCAAyC;IACzC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,MAAM,gBAAgB,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACzF,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAExD,eAAM,CAAC,IAAI,CAAC;QACV,OAAO,EAAE,6BAA6B;QACtC,cAAc,EAAE,gBAAgB,CAAC,MAAM;KACxC,CAAC,CAAC;IAEH,mCAAmC;IACnC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;oFAkBmE,CAAC;IAEnF,MAAM,OAAO,GAAG,0BAA0B,WAAW,EAAE,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,uBAAY,CAAC;QAC/B,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,MAAM;aACb;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE;oBACT,GAAG,EAAE,OAAO;iBACb;aACF;SACF;KACF,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,KAAK,IAAI,EAAE;QACnE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7C,IAAI,QAAQ,GAAG,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;gBACjD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE;gBACzB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YAEvC,2DAA2D;YAC3D,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAEhD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,IAAI,CAAC;gBACV,OAAO,EAAE,mCAAmC;gBAC5C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,CAAC;IAE/G,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,eAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,4DAA4D;YACrE,aAAa,EAAE,gBAAgB;SAChC,CAAC,CAAC;QACH,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,iDAAiD;SAChE,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjD,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,yDAAyD;IACzD,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;QACzD,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACrB,QAAQ,GAAG,KAAK,CAAC;YACjB,gBAAgB,GAAG,QAAQ,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,eAAM,CAAC,IAAI,CAAC;QACV,OAAO,EAAE,iDAAiD;QAC1D,cAAc,EAAE,gBAAgB,CAAC,MAAM;QACvC,aAAa,EAAE,QAAQ;QACvB,mBAAmB,EAAE,cAAc,CAAC,MAAM;QAC1C,aAAa,EAAE,gBAAgB;KAChC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,gBAAgB;QAC1B,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,sCAAsC;AACzB,QAAA,MAAM,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7B,eAAe,EAAE,OAAC;SACf,MAAM,EAAE;SACR,QAAQ,CACP,kJAAkJ,CACnJ;CACJ,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAA6B;IACnD,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EACT,mMAAmM;IACrM,KAAK,EAAE,cAAM;IACb,QAAQ,EAAE,KAAK;IACf,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QAC/C,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;YAEtE,oFAAoF;YACpF,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACtB,eAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,2BAA2B;oBACpC,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,QAAQ,EAAE,eAAe;oBACzB,YAAY,EAAE,MAAM,CAAC,YAAY;iBAClC,CAAC,CAAC;YACL,CAAC;YAED,OAAO;gBACL,MAAM;aACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC;gBACX,OAAO,EAAE,yBAAyB;gBAClC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,eAAe;gBACzB,KAAK;aACN,CAAC,CAAC;YAEH,0CAA0C;YAC1C,OAAO;gBACL,MAAM,EAAE;oBACN,SAAS,EAAE,KAAK;oBAChB,YAAY,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBACrE;aACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC;AAEF,kBAAe,kBAAkB,CAAC"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -112,3 +112,4 @@ export { createBrowserSession, destroyBrowserSession } from './browserTask/execu
|
|
|
112
112
|
export { withBrowserSession } from './toolsLibrary/withBrowserSession';
|
|
113
113
|
export { BrowserTaskMode } from './browserTask/types';
|
|
114
114
|
export { LLMDebugCallbackHandler } from './debugging';
|
|
115
|
+
export { resolveCaptcha } from './toolsLibrary/resolveCaptcha';
|
|
@@ -5,42 +5,32 @@ import { HumanMessage } from '@langchain/core/messages';
|
|
|
5
5
|
import { Page } from 'playwright';
|
|
6
6
|
import { BaseLanguageModel } from '@langchain/core/language_models/base';
|
|
7
7
|
|
|
8
|
-
// Type guard for checking if LLM supports structured output
|
|
9
|
-
interface StructuredOutputLLM extends BaseLanguageModel {
|
|
10
|
-
withStructuredOutput<T extends z.ZodType>(schema: T): BaseLanguageModel;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function supportsStructuredOutput(llm: BaseLanguageModel): llm is StructuredOutputLLM {
|
|
14
|
-
return 'withStructuredOutput' in llm && typeof (llm as any).withStructuredOutput === 'function';
|
|
15
|
-
}
|
|
16
|
-
|
|
17
8
|
// Schema for CAPTCHA resolution result
|
|
18
|
-
|
|
19
|
-
solution
|
|
20
|
-
isSuccess:
|
|
21
|
-
errorMessage
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export type ResolveCaptchaResult = z.infer<typeof captchaResolutionSchema>;
|
|
9
|
+
export type ResolveCaptchaResult = {
|
|
10
|
+
solution?: string;
|
|
11
|
+
isSuccess: boolean;
|
|
12
|
+
errorMessage?: string;
|
|
13
|
+
};
|
|
25
14
|
|
|
26
15
|
/**
|
|
27
16
|
* Utility function to resolve a CAPTCHA by taking a screenshot and analyzing it with an LLM
|
|
17
|
+
* Sends 5 parallel requests and returns the majority result
|
|
28
18
|
* @param page The Playwright page instance
|
|
29
19
|
* @param captchaSelector CSS selector, ID, or class name for the CAPTCHA element
|
|
30
20
|
* @param llm The language model to use for CAPTCHA solving (must be vision-capable)
|
|
31
|
-
* @param maxRetries Maximum number of retry attempts (default: 5)
|
|
32
21
|
* @returns The CAPTCHA resolution result with solution, isSuccess, and optional errorMessage
|
|
33
22
|
*/
|
|
34
23
|
export async function resolveCaptcha(
|
|
35
24
|
page: Page,
|
|
36
25
|
captchaSelector: string,
|
|
37
26
|
llm: BaseLanguageModel,
|
|
38
|
-
maxRetries: number = 5,
|
|
39
27
|
): Promise<ResolveCaptchaResult> {
|
|
28
|
+
const parallelRequests = 5;
|
|
29
|
+
|
|
40
30
|
logger.info({
|
|
41
31
|
message: 'Attempting to resolve CAPTCHA',
|
|
42
32
|
selector: captchaSelector,
|
|
43
|
-
|
|
33
|
+
parallelRequests,
|
|
44
34
|
});
|
|
45
35
|
|
|
46
36
|
// Wait for the captcha element to be visible
|
|
@@ -56,13 +46,8 @@ export async function resolveCaptcha(
|
|
|
56
46
|
screenshotSize: screenshotBuffer.length,
|
|
57
47
|
});
|
|
58
48
|
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
63
|
-
try {
|
|
64
|
-
// Create the prompt with the image (matching Python version)
|
|
65
|
-
const prompt = `This image contains a CAPTCHA challenge. Please analyze it and provide the solution.
|
|
49
|
+
// Create the prompt with the image
|
|
50
|
+
const prompt = `This image contains a CAPTCHA challenge. Please analyze it and provide the solution.
|
|
66
51
|
|
|
67
52
|
Common CAPTCHA types:
|
|
68
53
|
1. **Text CAPTCHA**: Distorted letters/numbers - read the exact text
|
|
@@ -82,114 +67,84 @@ Respond with ONLY the solution text/answer. Examples:
|
|
|
82
67
|
|
|
83
68
|
If the image is unclear or you cannot determine the answer, respond with: "UNCLEAR"`;
|
|
84
69
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
let result: ResolveCaptchaResult;
|
|
102
|
-
|
|
103
|
-
// Use structured output if the LLM supports it
|
|
104
|
-
if (supportsStructuredOutput(llm)) {
|
|
105
|
-
const structuredLLM = llm.withStructuredOutput(captchaResolutionSchema);
|
|
106
|
-
result = (await structuredLLM.invoke([message])) as ResolveCaptchaResult;
|
|
107
|
-
} else {
|
|
108
|
-
// Fallback: parse plain text response
|
|
109
|
-
const response = await llm.invoke([message]);
|
|
110
|
-
let solution = typeof response.content === 'string' ? response.content.trim() : response.content.toString().trim();
|
|
111
|
-
|
|
112
|
-
// Remove any quotation marks that might have been included
|
|
113
|
-
solution = solution.replace(/^["']|["']$/g, '');
|
|
114
|
-
|
|
115
|
-
logger.info({
|
|
116
|
-
message: 'CAPTCHA resolution attempt',
|
|
117
|
-
attempt,
|
|
118
|
-
maxRetries,
|
|
119
|
-
solutionLength: solution.length,
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
// Check if the solution is "UNCLEAR"
|
|
123
|
-
if (solution.toUpperCase() === 'UNCLEAR') {
|
|
124
|
-
if (attempt < maxRetries) {
|
|
125
|
-
logger.warn({
|
|
126
|
-
message: 'CAPTCHA image unclear, retrying',
|
|
127
|
-
attempt,
|
|
128
|
-
maxRetries,
|
|
129
|
-
});
|
|
130
|
-
// Wait a bit before retrying
|
|
131
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
132
|
-
continue;
|
|
133
|
-
} else {
|
|
134
|
-
return {
|
|
135
|
-
isSuccess: false,
|
|
136
|
-
errorMessage: 'Could not determine CAPTCHA solution from image after all retry attempts',
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Success - return the solution
|
|
142
|
-
result = {
|
|
143
|
-
solution,
|
|
144
|
-
isSuccess: true,
|
|
145
|
-
};
|
|
146
|
-
}
|
|
70
|
+
const dataUrl = `data:image/jpeg;base64,${imageBase64}`;
|
|
71
|
+
const message = new HumanMessage({
|
|
72
|
+
content: [
|
|
73
|
+
{
|
|
74
|
+
type: 'text',
|
|
75
|
+
text: prompt,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
type: 'image_url',
|
|
79
|
+
image_url: {
|
|
80
|
+
url: dataUrl,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
});
|
|
147
85
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
errorMessage: result.errorMessage,
|
|
156
|
-
});
|
|
157
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
158
|
-
continue;
|
|
159
|
-
} else {
|
|
160
|
-
return result;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
86
|
+
// Send 5 parallel requests
|
|
87
|
+
const requests = Array.from({ length: parallelRequests }, async () => {
|
|
88
|
+
try {
|
|
89
|
+
const response = await llm.invoke([message]);
|
|
90
|
+
let solution = typeof response.content === 'string'
|
|
91
|
+
? response.content.trim()
|
|
92
|
+
: response.content.toString().trim();
|
|
163
93
|
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
message: 'CAPTCHA solved successfully',
|
|
167
|
-
solutionLength: result.solution?.length || 0,
|
|
168
|
-
attempts: attempt,
|
|
169
|
-
});
|
|
94
|
+
// Remove any quotation marks that might have been included
|
|
95
|
+
solution = solution.replace(/^["']|["']$/g, '');
|
|
170
96
|
|
|
171
|
-
return
|
|
97
|
+
return solution;
|
|
172
98
|
} catch (error) {
|
|
173
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
174
99
|
logger.warn({
|
|
175
|
-
message: 'CAPTCHA resolution
|
|
176
|
-
|
|
177
|
-
maxRetries,
|
|
178
|
-
error: lastError.message,
|
|
100
|
+
message: 'CAPTCHA resolution request failed',
|
|
101
|
+
error: error instanceof Error ? error.message : String(error),
|
|
179
102
|
});
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
180
106
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
107
|
+
const results = await Promise.all(requests);
|
|
108
|
+
const validSolutions = results.filter((sol): sol is string => sol !== null && sol.toUpperCase() !== 'UNCLEAR');
|
|
109
|
+
|
|
110
|
+
if (validSolutions.length === 0) {
|
|
111
|
+
logger.warn({
|
|
112
|
+
message: 'All CAPTCHA resolution requests failed or returned UNCLEAR',
|
|
113
|
+
totalRequests: parallelRequests,
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
isSuccess: false,
|
|
117
|
+
errorMessage: 'Could not determine CAPTCHA solution from image',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Count occurrences of each solution
|
|
122
|
+
const solutionCounts = new Map<string, number>();
|
|
123
|
+
for (const solution of validSolutions) {
|
|
124
|
+
solutionCounts.set(solution, (solutionCounts.get(solution) || 0) + 1);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Find the solution with the majority (most occurrences)
|
|
128
|
+
let majoritySolution = '';
|
|
129
|
+
let maxCount = 0;
|
|
130
|
+
for (const [solution, count] of solutionCounts.entries()) {
|
|
131
|
+
if (count > maxCount) {
|
|
132
|
+
maxCount = count;
|
|
133
|
+
majoritySolution = solution;
|
|
186
134
|
}
|
|
187
135
|
}
|
|
188
136
|
|
|
189
|
-
|
|
137
|
+
logger.info({
|
|
138
|
+
message: 'CAPTCHA solved successfully using majority vote',
|
|
139
|
+
solutionLength: majoritySolution.length,
|
|
140
|
+
majorityCount: maxCount,
|
|
141
|
+
totalValidResponses: validSolutions.length,
|
|
142
|
+
totalRequests: parallelRequests,
|
|
143
|
+
});
|
|
144
|
+
|
|
190
145
|
return {
|
|
191
|
-
|
|
192
|
-
|
|
146
|
+
solution: majoritySolution,
|
|
147
|
+
isSuccess: true,
|
|
193
148
|
};
|
|
194
149
|
}
|
|
195
150
|
|