grok-builder-cli 1.0.1 → 1.0.2
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 +1 -1
- package/src/index.js +5 -7
- package/src/signup.js +55 -4
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -10,7 +10,7 @@ import cliProgress from 'cli-progress';
|
|
|
10
10
|
import * as readline from 'node:readline/promises';
|
|
11
11
|
import { stdin as input, stdout as output } from 'node:process';
|
|
12
12
|
|
|
13
|
-
import { runOneSignup,
|
|
13
|
+
import { runOneSignup, applyTurnstileBypass } from './signup.js';
|
|
14
14
|
import { login as loginRouter9 } from './router9.js';
|
|
15
15
|
|
|
16
16
|
// ── ANSI helpers ──────────────────────────────────────────────
|
|
@@ -123,19 +123,15 @@ async function main() {
|
|
|
123
123
|
|
|
124
124
|
const progressBar = multibar.create(count, 0);
|
|
125
125
|
|
|
126
|
-
// ── Launch
|
|
127
|
-
|
|
128
|
-
console.log(` ${dim('Turnstile patch:')} ${extPath}\n`);
|
|
126
|
+
// ── Launch browser ─────────────────────────────────────────
|
|
127
|
+
console.log(` ${dim('Turnstile patch: addInitScript')}\n`);
|
|
129
128
|
|
|
130
|
-
// We'll use one shared browser for all contexts
|
|
131
129
|
const browser = await chromium.launch({
|
|
132
130
|
headless: false,
|
|
133
131
|
args: [
|
|
134
132
|
'--no-sandbox',
|
|
135
133
|
'--disable-dev-shm-usage',
|
|
136
134
|
'--disable-blink-features=AutomationControlled',
|
|
137
|
-
`--disable-extensions-except=${extPath}`,
|
|
138
|
-
`--load-extension=${extPath}`,
|
|
139
135
|
],
|
|
140
136
|
});
|
|
141
137
|
|
|
@@ -145,6 +141,8 @@ async function main() {
|
|
|
145
141
|
viewport: { width: 1280, height: 1024 },
|
|
146
142
|
ignoreHTTPSErrors: true,
|
|
147
143
|
});
|
|
144
|
+
// Inject turnstile bypass into every page
|
|
145
|
+
applyTurnstileBypass(context);
|
|
148
146
|
try {
|
|
149
147
|
const account = await runOneSignup({
|
|
150
148
|
context,
|
package/src/signup.js
CHANGED
|
@@ -1,15 +1,31 @@
|
|
|
1
1
|
// x.ai signup flow — Playwright automation
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
|
+
import fs from 'fs';
|
|
4
5
|
import { createTempEmail, waitForOTP } from './mail.js';
|
|
5
6
|
import * as r9 from './router9.js';
|
|
6
7
|
|
|
7
8
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
-
const TS_EXT = path.resolve(__dirname, '..', 'turnstilePatch');
|
|
9
9
|
const SIGNUP_URL = 'https://accounts.x.ai/sign-up?redirect=grok-com';
|
|
10
10
|
|
|
11
11
|
const PASSWORD = process.env.PASSWORD || 'MySecurePass123!@';
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Get turnstile bypass script as string
|
|
15
|
+
*/
|
|
16
|
+
export function getTurnstileScript() {
|
|
17
|
+
const scriptPath = path.resolve(__dirname, '..', 'turnstilePatch', 'script.js');
|
|
18
|
+
return fs.readFileSync(scriptPath, 'utf8');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Apply turnstile bypass to a browser context via addInitScript
|
|
23
|
+
*/
|
|
24
|
+
export function applyTurnstileBypass(context) {
|
|
25
|
+
const script = getTurnstileScript();
|
|
26
|
+
context.addInitScript(script);
|
|
27
|
+
}
|
|
28
|
+
|
|
13
29
|
/**
|
|
14
30
|
* Run one signup flow + optional 9router addition
|
|
15
31
|
* @param {object} opts
|
|
@@ -79,12 +95,47 @@ export async function runOneSignup({ context, addToRouter = false }) {
|
|
|
79
95
|
// Step 7: Solve turnstile & submit
|
|
80
96
|
let tok = '';
|
|
81
97
|
for (let i = 0; i < 40; i++) {
|
|
82
|
-
tok = await page.evaluate(
|
|
83
|
-
|
|
84
|
-
|
|
98
|
+
tok = await page.evaluate(() => {
|
|
99
|
+
// Try direct input first
|
|
100
|
+
const el = document.querySelector('input[name=cf-turnstile-response]');
|
|
101
|
+
if (el?.value) return el.value;
|
|
102
|
+
// Try inside shadow DOM / iframes
|
|
103
|
+
const els = document.querySelectorAll('iframe');
|
|
104
|
+
for (const f of els) {
|
|
105
|
+
try {
|
|
106
|
+
const doc = f.contentDocument || f.contentWindow?.document;
|
|
107
|
+
if (doc) {
|
|
108
|
+
const inp = doc.querySelector('input[name=cf-turnstile-response]');
|
|
109
|
+
if (inp?.value) return inp.value;
|
|
110
|
+
}
|
|
111
|
+
} catch {}
|
|
112
|
+
}
|
|
113
|
+
return '';
|
|
114
|
+
});
|
|
85
115
|
if (tok) break;
|
|
116
|
+
// Try clicking the Turnstile widget itself
|
|
117
|
+
try {
|
|
118
|
+
const widget = await page.locator('.cf-turnstile, iframe[src*="turnstile"], iframe[src*="challenges"]').first();
|
|
119
|
+
if (await widget.isVisible()) {
|
|
120
|
+
await widget.click({ timeout: 2000 });
|
|
121
|
+
}
|
|
122
|
+
} catch {}
|
|
86
123
|
await sleep(1000);
|
|
87
124
|
}
|
|
125
|
+
// Fallback: try to inject token directly
|
|
126
|
+
if (!tok) {
|
|
127
|
+
try {
|
|
128
|
+
await page.evaluate(() => {
|
|
129
|
+
const el = document.querySelector('input[name=cf-turnstile-response]');
|
|
130
|
+
if (el) {
|
|
131
|
+
el.value = 'DUMMY_TOKEN_FOR_TEST';
|
|
132
|
+
el.dispatchEvent(new Event('input', { bubbles: true }));
|
|
133
|
+
el.dispatchEvent(new Event('change', { bubbles: true }));
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
tok = 'injected';
|
|
137
|
+
} catch {}
|
|
138
|
+
}
|
|
88
139
|
if (!tok) throw new Error('Turnstile timeout 40s');
|
|
89
140
|
|
|
90
141
|
await page.getByRole('button', { name: /Complete sign up/i }).click();
|