barebrowse 0.1.0 → 0.2.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.
- package/.mcp.json +8 -0
- package/CHANGELOG.md +100 -0
- package/CLAUDE.md +22 -0
- package/README.md +123 -43
- package/barebrowse.context.md +261 -0
- package/cli.js +156 -0
- package/docs/blueprint.md +361 -0
- package/docs/testing.md +202 -0
- package/mcp-server.js +216 -0
- package/package.json +22 -9
- package/src/aria.js +69 -0
- package/src/auth.js +279 -0
- package/src/bareagent.js +161 -0
- package/src/cdp.js +148 -0
- package/src/chromium.js +148 -0
- package/src/consent.js +210 -0
- package/src/index.js +186 -10
- package/src/interact.js +208 -0
- package/src/prune.js +472 -0
- package/src/stealth.js +51 -0
package/src/stealth.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stealth.js — Anti-detection patches for headless Chromium.
|
|
3
|
+
*
|
|
4
|
+
* Uses Page.addScriptToEvaluateOnNewDocument so patches run before
|
|
5
|
+
* any page scripts (unlike Runtime.evaluate which runs after).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const STEALTH_SCRIPT = `
|
|
9
|
+
// Hide webdriver flag
|
|
10
|
+
Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
|
|
11
|
+
|
|
12
|
+
// Fake plugins (headless has 0)
|
|
13
|
+
Object.defineProperty(navigator, 'plugins', {
|
|
14
|
+
get: () => [
|
|
15
|
+
{ name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer' },
|
|
16
|
+
{ name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai' },
|
|
17
|
+
{ name: 'Native Client', filename: 'internal-nacl-plugin' },
|
|
18
|
+
],
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// Fake languages
|
|
22
|
+
Object.defineProperty(navigator, 'languages', {
|
|
23
|
+
get: () => ['en-US', 'en'],
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// Fake chrome object (missing in headless)
|
|
27
|
+
if (!window.chrome) {
|
|
28
|
+
window.chrome = { runtime: {} };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Permissions.query: notifications return 'prompt' instead of 'denied'
|
|
32
|
+
const origQuery = Permissions.prototype.query;
|
|
33
|
+
Permissions.prototype.query = function(desc) {
|
|
34
|
+
if (desc.name === 'notifications') {
|
|
35
|
+
return Promise.resolve({ state: 'prompt', onchange: null });
|
|
36
|
+
}
|
|
37
|
+
return origQuery.call(this, desc);
|
|
38
|
+
};
|
|
39
|
+
`;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Apply stealth patches to a CDP session.
|
|
43
|
+
* Must be called before any navigation.
|
|
44
|
+
*
|
|
45
|
+
* @param {object} session - Session-scoped CDP handle
|
|
46
|
+
*/
|
|
47
|
+
export async function applyStealth(session) {
|
|
48
|
+
await session.send('Page.addScriptToEvaluateOnNewDocument', {
|
|
49
|
+
source: STEALTH_SCRIPT,
|
|
50
|
+
});
|
|
51
|
+
}
|