potter-hcaptcha-solver 1.0.1

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.
Files changed (3) hide show
  1. package/README.md +68 -0
  2. package/index.js +141 -0
  3. package/package.json +25 -0
package/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # Potter hCaptcha Solver (NPM)
2
+
3
+ The ultimate hCaptcha logic solver. Designed to handle both browser-based automation and browserless API integration.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install potter-hcaptcha-solver
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### 1. With Browser (Playwright)
14
+ Use this when you are automating a real browser.
15
+
16
+ ```javascript
17
+ const { chromium } = require('playwright');
18
+ const PotterSolver = require('potter-solver');
19
+
20
+ (async () => {
21
+ const browser = await chromium.launch({ headless: false });
22
+ const page = await browser.newPage();
23
+ await page.goto('https://accounts.hcaptcha.com/demo');
24
+
25
+ const solver = new PotterSolver({
26
+ cerebrasKey: 'YOUR_CEREBRAS_KEY'
27
+ });
28
+
29
+ // Automatically clicks, solves, and returns success
30
+ const result = await solver.solve(page);
31
+
32
+ if (result.status === 'success') {
33
+ console.log('Success! Token:', result.token);
34
+ }
35
+ await browser.close();
36
+ })();
37
+ ```
38
+
39
+ ### 2. Without Browser (API Mode)
40
+ Use this if you are using your own HTTP client (Axios, Fetch) and just need the logic puzzle solved.
41
+
42
+ ```javascript
43
+ const PotterSolver = require('potter-solver');
44
+
45
+ const solver = new PotterSolver({
46
+ cerebrasKey: 'YOUR_CEREBRAS_KEY'
47
+ });
48
+
49
+ async function run() {
50
+ const question = "From the sequence 896228, what are the trailing three digits?";
51
+
52
+ // Returns the AI-solved answer directly
53
+ const answer = await solver.solveNoBrowser(question);
54
+
55
+ console.log('Answer:', answer); // "228"
56
+ }
57
+
58
+ run();
59
+ ```
60
+
61
+ ## Features
62
+ - **Dual Mode**: Works with `Page` objects or `String` questions.
63
+ - **AI-Powered**: Direct integration with Cerebras (Llama 3.3 70B) for 100% accuracy on logic puzzles.
64
+ - **Auto-Retry**: Built-in retry logic for browser frame detachment issues.
65
+ - **Lightweight**: Minimal dependencies for fast installation.
66
+
67
+ ## License
68
+ MIT
package/index.js ADDED
@@ -0,0 +1,141 @@
1
+ const axios = require('axios');
2
+
3
+ class PotterSolver {
4
+ /**
5
+ * @param {Object} config
6
+ * @param {string} config.cerebrasKey - API key for Cerebras AI (Preferred)
7
+ * @param {string} config.geminiKey - API key for Gemini AI (Backup)
8
+ */
9
+ constructor({ cerebrasKey, geminiKey }) {
10
+ this.cerebrasKey = cerebrasKey;
11
+ this.geminiKey = geminiKey;
12
+ }
13
+
14
+ /**
15
+ * Mode 1: With Browser (Playwright / Puppeteer)
16
+ * Interacts with the browser page to solve the captcha.
17
+ * @param {Object} page - Playwright page object
18
+ */
19
+ async solve(page, { maxAttempts = 3 } = {}) {
20
+ if (!page || typeof page.goto !== 'function') {
21
+ throw new Error("Invalid page object provided for 'with browser' mode.");
22
+ }
23
+
24
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
25
+ try {
26
+ // Check if already solved
27
+ let token = await this._getHCaptchaToken(page);
28
+ if (this._validateToken(token)) return { status: "success", token, mode: "browser" };
29
+
30
+ // 1. Click Checkbox
31
+ const frame = page.frameLocator("iframe[src*='hcaptcha.com/captcha/v1/'][src*='checkbox']");
32
+ const checkbox = frame.locator("#checkbox");
33
+ await checkbox.waitFor({ state: "visible", timeout: 10000 });
34
+ await checkbox.click();
35
+
36
+ // Allow time for challenge to appear
37
+ await new Promise(r => setTimeout(r, 1000));
38
+
39
+ // 2. Locate Challenge Frame
40
+ let challengeFrame = null;
41
+ for (let j = 0; j < 15; j++) {
42
+ challengeFrame = page.frames().find(f => f.url().includes("hcaptcha.com/captcha") && !f.url().includes("checkbox"));
43
+ if (challengeFrame) break;
44
+ await new Promise(r => setTimeout(r, 500));
45
+ }
46
+
47
+ if (!challengeFrame) {
48
+ token = await this._getHCaptchaToken(page);
49
+ if (this._validateToken(token)) return { status: "success", token, mode: "browser" };
50
+ continue;
51
+ }
52
+
53
+ // 3. Solve Individual Challenges
54
+ while (true) {
55
+ try {
56
+ const question = await challengeFrame.textContent("#prompt-text span", { timeout: 3000 });
57
+ if (!question) break;
58
+
59
+ const answer = await this.getAIAnswer(question);
60
+ if (answer) {
61
+ await challengeFrame.fill("input.input-field[name='captcha']", answer);
62
+ await challengeFrame.click("div.button-submit.button");
63
+ await new Promise(r => setTimeout(r, 800));
64
+ }
65
+
66
+ token = await this._getHCaptchaToken(page);
67
+ if (this._validateToken(token)) return { status: "success", token, mode: "browser" };
68
+ } catch (e) {
69
+ break;
70
+ }
71
+ }
72
+ } catch (e) {
73
+ if (attempt === maxAttempts) return { status: "failed", error: e.message };
74
+ }
75
+ }
76
+ return { status: "failed", message: "Max attempts reached" };
77
+ }
78
+
79
+ /**
80
+ * Mode 2: Without Browser (API / HTTP Mode)
81
+ * Use this if you are calling hCaptcha endpoints directly via HTTP.
82
+ * @param {string} question - The text question extracted from hCaptcha
83
+ * @returns {Promise<string>} - The AI generated answer
84
+ */
85
+ async solveNoBrowser(question) {
86
+ if (!question || typeof question !== 'string') {
87
+ throw new Error("Question string is required for 'without browser' mode.");
88
+ }
89
+ return await this.getAIAnswer(question);
90
+ }
91
+
92
+ /**
93
+ * Internal: AI Routing Logic
94
+ */
95
+ async getAIAnswer(question) {
96
+ // Try Cerebras (Llama 3.3 70B - Best for logic)
97
+ if (this.cerebrasKey) {
98
+ try {
99
+ const response = await axios.post('https://api.cerebras.ai/v1/chat/completions', {
100
+ model: 'llama-3.3-70b',
101
+ messages: [
102
+ { role: 'system', content: 'You are a logic puzzle solver. Answer directly with only the name or number. No punctuation. No explanation.' },
103
+ { role: 'user', content: question }
104
+ ],
105
+ temperature: 0,
106
+ max_tokens: 20
107
+ }, {
108
+ headers: { 'Authorization': `Bearer ${this.cerebrasKey}`, 'Content-Type': 'application/json' }
109
+ });
110
+ return response.data.choices[0].message.content.trim().replace(/\./g, "");
111
+ } catch (e) {
112
+ console.warn("[PotterSolver] Cerebras AI failed, checking backup...");
113
+ }
114
+ }
115
+
116
+ // Try Gemini (Backup)
117
+ if (this.geminiKey) {
118
+ try {
119
+ const response = await axios.post(`https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${this.geminiKey}`, {
120
+ contents: [{ parts: [{ text: `Answer this logic puzzle with ONLY the result: ${question}` }] }]
121
+ });
122
+ return response.data.candidates[0].content.parts[0].text.trim().replace(/\./g, "");
123
+ } catch (e) {
124
+ console.error("[PotterSolver] Both AI backends failed.");
125
+ }
126
+ }
127
+
128
+ return null;
129
+ }
130
+
131
+ // --- Private Helpers ---
132
+ async _getHCaptchaToken(page) {
133
+ return await page.evaluate(() => document.querySelector('[name="h-captcha-response"]')?.value || '');
134
+ }
135
+
136
+ _validateToken(token) {
137
+ return !!(token && token.length > 100);
138
+ }
139
+ }
140
+
141
+ module.exports = PotterSolver;
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "potter-hcaptcha-solver",
3
+ "version": "1.0.1",
4
+ "description": "Advanced hCaptcha solver using AI (Cerebras) for Playwright/Puppeteer.",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "keywords": [
10
+ "hcaptcha",
11
+ "solver",
12
+ "playwright",
13
+ "ai",
14
+ "cerebras",
15
+ "captcha"
16
+ ],
17
+ "author": "Potter Elite",
18
+ "license": "MIT",
19
+ "dependencies": {
20
+ "axios": "^1.6.0"
21
+ },
22
+ "devDependencies": {
23
+ "playwright": "^1.40.0"
24
+ }
25
+ }