browserclaw-agent 0.3.1 → 0.4.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/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +47 -48
- package/dist/agent-loop.js.map +1 -1
- package/dist/llm.d.ts +1 -1
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +59 -20
- package/dist/llm.js.map +1 -1
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +63 -27
- package/dist/session-manager.js.map +1 -1
- package/dist/skill-generator.d.ts.map +1 -1
- package/dist/skill-generator.js +3 -1
- package/dist/skill-generator.js.map +1 -1
- package/dist/skills/page-state.js +1 -1
- package/dist/skills/page-state.js.map +1 -1
- package/dist/skills/press-and-hold.d.ts +1 -0
- package/dist/skills/press-and-hold.d.ts.map +1 -1
- package/dist/skills/press-and-hold.js +115 -30
- package/dist/skills/press-and-hold.js.map +1 -1
- package/package.json +2 -2
|
@@ -2,6 +2,7 @@ import type { CrawlPage } from 'browserclaw';
|
|
|
2
2
|
export type AntiBotType = 'press_and_hold' | 'cloudflare_checkbox' | null;
|
|
3
3
|
export declare function getPageText(page: CrawlPage): Promise<string>;
|
|
4
4
|
export declare function isStillBlocked(page: CrawlPage, type: AntiBotType): Promise<boolean>;
|
|
5
|
+
export declare function isIntermittentError(page: CrawlPage): Promise<boolean>;
|
|
5
6
|
export declare function detectAntiBot(domText: string): AntiBotType;
|
|
6
7
|
export declare function enrichSnapshot(snapshot: string, domText: string, type: AntiBotType): string;
|
|
7
8
|
export declare function pressAndHold(page: CrawlPage, opts?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"press-and-hold.d.ts","sourceRoot":"","sources":["../../src/skills/press-and-hold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"press-and-hold.d.ts","sourceRoot":"","sources":["../../src/skills/press-and-hold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,qBAAqB,GAAG,IAAI,CAAC;AAoH1E,wBAAsB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAelE;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAOzF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAG3E;AA8CD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAkB1D;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAc3F;AAmED,wBAAsB,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBhG"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
1
3
|
import { logger } from '../logger.js';
|
|
4
|
+
import { llmVision } from '../llm.js';
|
|
2
5
|
const PRESS_HOLD_PATTERN = /press.*hold|hold.*to.*confirm/i;
|
|
3
6
|
const CLOUDFLARE_PATTERN = /performing security verification|cloudflare|verify you are human|just a moment/i;
|
|
4
7
|
const ANTI_BOT_PATTERN = /press.*hold|verify.*human|not a bot|captcha/i;
|
|
@@ -7,7 +10,7 @@ const BLOCKED_PATTERNS = {
|
|
|
7
10
|
cloudflare_checkbox: /performing security verification|verify you are human|just a moment/i,
|
|
8
11
|
};
|
|
9
12
|
function humanHoldMs() {
|
|
10
|
-
return 4000 + Math.floor(Math.random() *
|
|
13
|
+
return 4000 + Math.floor(Math.random() * 6000); // 4-10 seconds
|
|
11
14
|
}
|
|
12
15
|
async function findButtonCoordinates(page) {
|
|
13
16
|
const result = await page.evaluate(`
|
|
@@ -114,21 +117,62 @@ export async function isStillBlocked(page, type) {
|
|
|
114
117
|
const result = await page.evaluate(`!!(document.body && document.body.innerText && document.body.innerText.match(${String(pattern)}))`);
|
|
115
118
|
return result === true;
|
|
116
119
|
}
|
|
120
|
+
export async function isIntermittentError(page) {
|
|
121
|
+
const text = await getPageText(page);
|
|
122
|
+
return /please try again/i.test(text);
|
|
123
|
+
}
|
|
124
|
+
const CHALLENGE_CLEAR_MAX_MS = 10_000;
|
|
125
|
+
const CHALLENGE_CLEAR_POLL_MS = 500;
|
|
126
|
+
async function waitForChallengeCleared(page, type) {
|
|
127
|
+
const deadline = Date.now() + CHALLENGE_CLEAR_MAX_MS;
|
|
128
|
+
while (Date.now() < deadline) {
|
|
129
|
+
if (!(await isStillBlocked(page, type)))
|
|
130
|
+
return true;
|
|
131
|
+
await page.waitFor({ timeMs: CHALLENGE_CLEAR_POLL_MS });
|
|
132
|
+
}
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
const SCREENSHOT_DIR = '/tmp/bca-screenshots';
|
|
136
|
+
async function classifyPaHVisualState(page) {
|
|
137
|
+
try {
|
|
138
|
+
if (!fs.existsSync(SCREENSHOT_DIR))
|
|
139
|
+
fs.mkdirSync(SCREENSHOT_DIR, { recursive: true });
|
|
140
|
+
const buf = await page.screenshot();
|
|
141
|
+
const filename = `paH-state-${String(Date.now())}.png`;
|
|
142
|
+
const filepath = path.join(SCREENSHOT_DIR, filename);
|
|
143
|
+
fs.writeFileSync(filepath, buf);
|
|
144
|
+
const answer = await llmVision('You see a page showing a press-and-hold bot-verification challenge. Reply with exactly one word: "ready" (the press button is blue/fully visible/clickable), "loading" (the button is gray/empty/still initializing), "error" (the page shows an error, denial, or retry message), or "unknown".', 'What state is the press-and-hold button in?', buf.toString('base64'));
|
|
145
|
+
const label = answer.trim().toLowerCase();
|
|
146
|
+
const state = label.startsWith('ready')
|
|
147
|
+
? 'ready'
|
|
148
|
+
: label.startsWith('loading')
|
|
149
|
+
? 'loading'
|
|
150
|
+
: label.startsWith('error')
|
|
151
|
+
? 'error'
|
|
152
|
+
: 'unknown';
|
|
153
|
+
logger.info({ screenshot: filepath, state, raw: label.slice(0, 40) }, 'press-and-hold: visual state');
|
|
154
|
+
return state;
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
logger.warn({ err: err instanceof Error ? err.message : err }, 'press-and-hold: visual state failed');
|
|
158
|
+
return 'unknown';
|
|
159
|
+
}
|
|
160
|
+
}
|
|
117
161
|
export function detectAntiBot(domText) {
|
|
118
162
|
// Check press-and-hold first — if DOM mentions press/hold, it's a press-and-hold challenge
|
|
119
163
|
// regardless of what the snapshot says
|
|
120
164
|
if (PRESS_HOLD_PATTERN.test(domText)) {
|
|
121
|
-
logger.info({ domTextPreview: domText.substring(0,
|
|
165
|
+
logger.info({ domTextPreview: domText.substring(0, 600) }, 'Anti-bot detected: press-and-hold');
|
|
122
166
|
return 'press_and_hold';
|
|
123
167
|
}
|
|
124
168
|
// Cloudflare-specific patterns (no press-and-hold in DOM text, already checked above)
|
|
125
169
|
if (CLOUDFLARE_PATTERN.test(domText)) {
|
|
126
|
-
logger.info({ domTextPreview: domText.substring(0,
|
|
170
|
+
logger.info({ domTextPreview: domText.substring(0, 600) }, 'Anti-bot detected: cloudflare checkbox');
|
|
127
171
|
return 'cloudflare_checkbox';
|
|
128
172
|
}
|
|
129
173
|
// Generic anti-bot (verify human, captcha, not a bot) — treat as cloudflare-style checkbox
|
|
130
174
|
if (ANTI_BOT_PATTERN.test(domText)) {
|
|
131
|
-
logger.info({ domTextPreview: domText.substring(0,
|
|
175
|
+
logger.info({ domTextPreview: domText.substring(0, 600) }, 'Anti-bot detected: generic');
|
|
132
176
|
return 'cloudflare_checkbox';
|
|
133
177
|
}
|
|
134
178
|
return null;
|
|
@@ -144,36 +188,77 @@ export function enrichSnapshot(snapshot, domText, type) {
|
|
|
144
188
|
}
|
|
145
189
|
return snapshot;
|
|
146
190
|
}
|
|
191
|
+
async function buttonIsInteractive(page, x, y) {
|
|
192
|
+
const result = await page.evaluate(`(function() {
|
|
193
|
+
var el = document.elementFromPoint(${String(x)}, ${String(y)});
|
|
194
|
+
if (!el) return false;
|
|
195
|
+
if (el.tagName === 'HTML' || el.tagName === 'BODY') return false;
|
|
196
|
+
var style = window.getComputedStyle(el);
|
|
197
|
+
if (style.pointerEvents === 'none') return false;
|
|
198
|
+
if (el.disabled === true) return false;
|
|
199
|
+
var text = (el.innerText || '').trim().toLowerCase();
|
|
200
|
+
if (/press|hold/.test(text)) return true;
|
|
201
|
+
var bg = style.backgroundColor || '';
|
|
202
|
+
var m = bg.match(/rgba?\\\((\\\d+),\\\s*(\\\d+),\\\s*(\\\d+)/);
|
|
203
|
+
if (m) {
|
|
204
|
+
var r = parseInt(m[1], 10), g = parseInt(m[2], 10), b = parseInt(m[3], 10);
|
|
205
|
+
var isNeutralGray = Math.abs(r - g) < 15 && Math.abs(g - b) < 15 && r > 180 && r < 245;
|
|
206
|
+
if (isNeutralGray) return false;
|
|
207
|
+
}
|
|
208
|
+
return true;
|
|
209
|
+
})()`);
|
|
210
|
+
return result === true;
|
|
211
|
+
}
|
|
212
|
+
const BUTTON_READY_MAX_MS = 5_000;
|
|
213
|
+
const BUTTON_READY_POLL_MS = 500;
|
|
214
|
+
async function waitForButtonReady(page, x, y) {
|
|
215
|
+
const deadline = Date.now() + BUTTON_READY_MAX_MS;
|
|
216
|
+
while (Date.now() < deadline) {
|
|
217
|
+
if (await buttonIsInteractive(page, x, y))
|
|
218
|
+
return true;
|
|
219
|
+
await page.waitFor({ timeMs: BUTTON_READY_POLL_MS });
|
|
220
|
+
}
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
const NETWORK_IDLE_TIMEOUT_MS = 6_000;
|
|
224
|
+
async function waitForNetworkIdle(page) {
|
|
225
|
+
try {
|
|
226
|
+
await page.waitFor({ loadState: 'networkidle', timeoutMs: NETWORK_IDLE_TIMEOUT_MS });
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async function ensureNetworkIdle(page) {
|
|
234
|
+
if (await waitForNetworkIdle(page))
|
|
235
|
+
return;
|
|
236
|
+
logger.info('press-and-hold: network did not idle — reloading');
|
|
237
|
+
await page.reload();
|
|
238
|
+
if (!(await waitForNetworkIdle(page))) {
|
|
239
|
+
logger.info('press-and-hold: still not idle after reload — proceeding');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async function issuePress(page, x, y, holdMs) {
|
|
243
|
+
const jitterX = x + Math.floor(Math.random() * 20) - 10;
|
|
244
|
+
const jitterY = y + Math.floor(Math.random() * 10) - 5;
|
|
245
|
+
const delay = 100 + Math.floor(Math.random() * 200);
|
|
246
|
+
logger.info({ x: jitterX, y: jitterY, holdMs, delay }, 'press-and-hold: pressing');
|
|
247
|
+
await page.pressAndHold(jitterX, jitterY, { delay, holdMs });
|
|
248
|
+
logger.info({ holdMs }, 'press-and-hold: released');
|
|
249
|
+
}
|
|
147
250
|
export async function pressAndHold(page, opts) {
|
|
148
251
|
try {
|
|
149
|
-
|
|
252
|
+
await ensureNetworkIdle(page);
|
|
150
253
|
const coords = await findButtonCoordinates(page);
|
|
151
|
-
if (!coords)
|
|
152
|
-
logger.info('press-and-hold: no suitable button found');
|
|
254
|
+
if (!coords)
|
|
153
255
|
return false;
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
const holdMs = opts?.holdMs ?? humanHoldMs();
|
|
161
|
-
const delay = 100 + Math.floor(Math.random() * 200);
|
|
162
|
-
logger.info({ x: jitterX, y: jitterY, holdMs, delay }, 'press-and-hold: pressing');
|
|
163
|
-
await page.pressAndHold(jitterX, jitterY, { delay, holdMs });
|
|
164
|
-
logger.info({ holdMs }, 'press-and-hold: released');
|
|
165
|
-
await page.waitFor({ timeMs: 2000 });
|
|
166
|
-
const stillBlocked = await isStillBlocked(page, 'press_and_hold');
|
|
167
|
-
if (stillBlocked) {
|
|
168
|
-
logger.info('press-and-hold: still blocked, refreshing page');
|
|
169
|
-
await page.goto(urlBefore);
|
|
170
|
-
await page.waitFor({ timeMs: 3000 });
|
|
171
|
-
const blockedAfterRefresh = await isStillBlocked(page, 'press_and_hold');
|
|
172
|
-
logger.info({ blockedAfterRefresh }, 'press-and-hold: result after refresh');
|
|
173
|
-
return !blockedAfterRefresh;
|
|
174
|
-
}
|
|
175
|
-
logger.info('press-and-hold: resolved');
|
|
176
|
-
return true;
|
|
256
|
+
await waitForButtonReady(page, coords.x, coords.y);
|
|
257
|
+
await issuePress(page, coords.x, coords.y, opts?.holdMs ?? humanHoldMs());
|
|
258
|
+
const cleared = await waitForChallengeCleared(page, 'press_and_hold');
|
|
259
|
+
if (!cleared)
|
|
260
|
+
await classifyPaHVisualState(page);
|
|
261
|
+
return cleared;
|
|
177
262
|
}
|
|
178
263
|
catch (err) {
|
|
179
264
|
logger.error({ err: err instanceof Error ? err.message : err }, 'press-and-hold: failed');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"press-and-hold.js","sourceRoot":"","sources":["../../src/skills/press-and-hold.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,MAAM,kBAAkB,GAAG,gCAAgC,CAAC;AAC5D,MAAM,kBAAkB,GAAG,iFAAiF,CAAC;AAC7G,MAAM,gBAAgB,GAAG,8CAA8C,CAAC;AAExE,MAAM,gBAAgB,GAA6D;IACjF,cAAc,EAAE,qDAAqD;IACrE,mBAAmB,EAAE,sEAAsE;CAC5F,CAAC;AAEF,SAAS,WAAW;IAClB,OAAO,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"press-and-hold.js","sourceRoot":"","sources":["../../src/skills/press-and-hold.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "browserclaw-agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Browser automation agent loop powered by browserclaw",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"prepublishOnly": "npm run build && npm run test:pack"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"browserclaw": "^0.
|
|
31
|
+
"browserclaw": "^0.15.3",
|
|
32
32
|
"openai": "^4.80.0",
|
|
33
33
|
"pino": "^10.3.1"
|
|
34
34
|
},
|