brave-real-browser 2.0.1 → 2.0.3

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/README.md CHANGED
@@ -1,37 +1,3 @@
1
- > [!WARNING]
2
- > This repo will no longer receive updates. Thank you to everyone who supported it.
3
-
4
- <br/>
5
- <p align="center">
6
- <a href="https://github.com/codeiva4u/Brave-Real-Browser">
7
- <img src="https://github.com/zfcsoftware/puppeteer-real-browser/assets/123484092/cc8b5fb9-504a-4fd3-97f6-a51990bb4303" alt="Logo" width="80" height="80">
8
- </a>
9
-
10
- <h3 align="center">Brave Real Browser</h3>
11
-
12
- <p align="center">
13
- This package prevents Puppeteer from being detected as a bot in services like Cloudflare and allows you to pass captchas without any problems. It behaves like a real browser.
14
- <br/>
15
- <br/>
16
- If you are only interested in Cloudflare WAF, please check this repo:<br/> https://github.com/zfcsoftware/cf-clearance-scraper
17
- </p>
18
- </p>
19
-
20
- <p align="center">
21
- <video src='https://github.com/user-attachments/assets/5dddca09-6941-42e9-9427-5c666632483f'/>
22
- </p>
23
-
24
- <p align="center">
25
- <img src="https://img.shields.io/github/contributors/codeiva4u/Brave-Real-Browser?color=dark-green" alt="Contributors" />
26
- <img src="https://img.shields.io/github/forks/codeiva4u/Brave-Real-Browser?style=social" alt="Forks" />
27
- <img src="https://img.shields.io/github/stars/codeiva4u/Brave-Real-Browser?style=social" alt="Stargazers" />
28
- <img src="https://img.shields.io/github/issues/codeiva4u/Brave-Real-Browser" alt="Issues" />
29
- <img src="https://img.shields.io/github/license/codeiva4u/Brave-Real-Browser" alt="License" />
30
- </p>
31
-
32
- ## Sponsor
33
-
34
- [![ScrapeDo](data/sdo.gif)](https://scrape.do/?utm_source=github&utm_medium=repo_prb)
35
1
 
36
2
  ## Installation
37
3
 
@@ -47,56 +13,33 @@ if you are using linux:
47
13
  sudo apt-get install xvfb
48
14
  ```
49
15
 
50
- ## Include
16
+ ## Docker
51
17
 
52
- ### CommonJS
18
+ You can use the Dockerfile file in the main directory to use this library with docker. It has been tested with docker on Ubuntu server operating systems.
53
19
 
54
- ```js
55
- const { connect } = require("brave-real-browser");
20
+ To run a test, you can follow these steps
56
21
 
57
- const start = async () => {
58
- const { page, browser } = await connect();
59
- };
22
+ ```bash
23
+ git clone https://github.com/codeiva4u/Brave-Real-Browser.git
60
24
  ```
61
25
 
62
- ### Module
63
-
64
- ```js
65
- import { connect } from "brave-real-browser";
66
-
67
- const { page, browser } = await connect();
26
+ ```bash
27
+ cd brave-real-browser
28
+ ```
29
+ ```bash
30
+ npm run cjs_test
68
31
  ```
69
32
 
70
- ## Usage
71
-
72
- ```js
73
- const { connect } = require("brave-real-browser");
74
-
75
- async function test() {
76
- const { browser, page } = await connect({
77
- headless: false,
78
-
79
- args: [],
80
-
81
- customConfig: {},
82
-
83
- turnstile: true,
84
-
85
- connectOption: {},
33
+ ```bash
34
+ npm run esm_test
35
+ ```
86
36
 
87
- disableXvfb: false,
88
- ignoreAllFlags: false,
89
- // proxy:{
90
- // host:'<proxy-host>',
91
- // port:'<proxy-port>',
92
- // username:'<proxy-username>',
93
- // password:'<proxy-password>'
94
- // }
95
- });
96
- await page.goto("<url>");
97
- }
37
+ ```bash
38
+ docker build -t brave-real-browser-project .
39
+ ```
98
40
 
99
- test();
41
+ ```bash
42
+ docker run brave-real-browser-project
100
43
  ```
101
44
 
102
45
  **headless**: The default value is false. Values such as “new”, true, “shell” can also be sent, but it works most stable when false is used.
@@ -124,51 +67,6 @@ The following is an example of installing a plugin. You can install other plugin
124
67
  npm i puppeteer-extra-plugin-click-and-wait
125
68
  ```
126
69
 
127
- ```js
128
- const test = require("node:test");
129
- const assert = require("node:assert");
130
- const { connect } = require("brave-real-browser");
131
-
132
- test("Puppeteer Extra Plugin", async () => {
133
- const { page, browser } = await connect({
134
- args: ["--start-maximized"],
135
- turnstile: true,
136
- headless: false,
137
- // disableXvfb: true,
138
- customConfig: {},
139
- connectOption: {
140
- defaultViewport: null,
141
- },
142
- plugins: [require("puppeteer-extra-plugin-click-and-wait")()],
143
- });
144
- await page.goto("https://google.com", { waitUntil: "domcontentloaded" });
145
- await page.clickAndWaitForNavigation("body");
146
- await browser.close();
147
- });
148
- ```
149
-
150
- ## Docker
151
-
152
- You can use the Dockerfile file in the main directory to use this library with docker. It has been tested with docker on Ubuntu server operating systems.
153
-
154
- To run a test, you can follow these steps
155
-
156
- ```bash
157
- git clone https://github.com/codeiva4u/Brave-Real-Browser.git
158
- ```
159
-
160
- ```bash
161
- cd brave-real-browser
162
- ```
163
-
164
- ```bash
165
- docker build -t brave-real-browser-project .
166
- ```
167
-
168
- ```bash
169
- docker run brave-real-browser-project
170
- ```
171
-
172
70
  ## Support Us
173
71
 
174
72
  This library is completely open source and is constantly being updated. Please star this repo to support this project. Starring and supporting the project will ensure that it receives updates. If you want to support it further, you can consider sponsoring me (https://github.com/sponsors/codeiva4u)
package/lib/cjs/index.js CHANGED
@@ -56,6 +56,7 @@ async function connect({
56
56
 
57
57
  const browser = await puppeteer.connect({
58
58
  browserURL: `http://127.0.0.1:${brave.port}`,
59
+ defaultViewport: null, // Full window content - no viewport restriction
59
60
  ...connectOption,
60
61
  });
61
62
 
package/lib/esm/index.mjs CHANGED
@@ -55,6 +55,7 @@ export async function connect({
55
55
 
56
56
  const browser = await (pextra ? pextra : puppeteer).connect({
57
57
  browserURL: `http://127.0.0.1:${brave.port}`,
58
+ defaultViewport: null, // Full window content - no viewport restriction
58
59
  ...connectOption,
59
60
  });
60
61
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brave-real-browser",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "description": "This package is designed to bypass puppeteer's bot-detecting captchas such as Cloudflare. It acts like a real browser and can be managed with puppeteer.",
5
5
  "main": "lib/cjs/index.js",
6
6
  "module": "lib/esm/index.mjs",
@@ -36,8 +36,8 @@
36
36
  "author": "codeiva4u",
37
37
  "license": "ISC",
38
38
  "dependencies": {
39
- "brave-real-launcher": "^1.2.40",
40
- "brave-real-puppeteer-core": "^24.34.0-patch.5",
39
+ "brave-real-launcher": "^1.2.43",
40
+ "brave-real-puppeteer-core": "^24.34.0-patch.9",
41
41
  "ghost-cursor": "^1.4.1",
42
42
  "puppeteer-extra": "^3.3.6",
43
43
  "tree-kill": "^1.2.2",
package/test/cjs/test.js CHANGED
@@ -2,53 +2,50 @@ const test = require('node:test');
2
2
  const assert = require('node:assert');
3
3
  const { connect } = require('../../lib/cjs/index.js');
4
4
 
5
-
6
5
  const realBrowserOption = {
7
- args: ["--start-minimized"],
8
6
  turnstile: true,
9
7
  headless: false,
10
- // disableXvfb: true,
11
8
  customConfig: {},
12
- connectOption: {
13
- defaultViewport: null
14
- },
15
9
  plugins: []
16
10
  }
17
11
 
18
- // test('Puppeteer Extra Plugin', async () => {
19
- // /*
20
- // Run with:
21
- // npm i puppeteer-extra-plugin-click-and-wait
22
- // */
23
- // realBrowserOption.plugins = [
24
- // require('puppeteer-extra-plugin-click-and-wait')()
25
- // ]
26
- // const { page, browser } = await connect(realBrowserOption)
27
- // await page.goto("https://google.com", { waitUntil: "domcontentloaded" })
28
- // await page.clickAndWaitForNavigation('body')
29
- // await browser.close()
30
- // })
12
+ // Shared browser instance for all tests
13
+ let browser = null;
14
+ let page = null;
15
+
16
+ // Setup - Run once before all tests
17
+ test.before(async () => {
18
+ console.log('🚀 Starting browser for all tests...');
19
+ const result = await connect(realBrowserOption);
20
+ browser = result.browser;
21
+ page = result.page;
22
+ console.log('✅ Browser started successfully');
23
+ });
24
+
25
+ // Teardown - Run once after all tests
26
+ test.after(async () => {
27
+ console.log('🏁 Closing browser after all tests...');
28
+ if (browser) {
29
+ await browser.close();
30
+ console.log('✅ Browser closed successfully');
31
+ }
32
+ });
31
33
 
32
34
  test('DrissionPage Detector', async () => {
33
- const { page, browser } = await connect(realBrowserOption)
34
35
  await page.goto("https://web.archive.org/web/20240913054632/https://drissionpage.pages.dev/");
35
36
  await page.realClick("#detector")
36
37
  let result = await page.evaluate(() => { return document.querySelector('#isBot span').textContent.includes("not") ? true : false })
37
- await browser.close()
38
38
  assert.strictEqual(result, true, "DrissionPage Detector test failed!")
39
39
  })
40
40
 
41
41
  test('Brotector, a webdriver detector', async () => {
42
- const { page, browser } = await connect(realBrowserOption)
43
42
  await page.goto("https://kaliiiiiiiiii.github.io/brotector/");
44
43
  await new Promise(r => setTimeout(r, 3000));
45
44
  let result = await page.evaluate(() => { return document.querySelector('#table-keys').getAttribute('bgcolor') })
46
- await browser.close()
47
45
  assert.strictEqual(result === "darkgreen", true, "Brotector, a webdriver detector test failed!")
48
46
  })
49
47
 
50
48
  test('Cloudflare WAF', async () => {
51
- const { page, browser } = await connect(realBrowserOption)
52
49
  await page.goto("https://nopecha.com/demo/cloudflare");
53
50
  let verify = null
54
51
  let startDate = Date.now()
@@ -60,13 +57,11 @@ test('Cloudflare WAF', async () => {
60
57
  }).catch(() => null)
61
58
  await new Promise(r => setTimeout(r, 2000));
62
59
  }
63
- await browser.close()
64
60
  assert.strictEqual(verify === true, true, "Cloudflare WAF test failed! (Site may be blocking automated access)")
65
61
  })
66
62
 
67
63
 
68
64
  test('Cloudflare Turnstile', async () => {
69
- const { page, browser } = await connect(realBrowserOption)
70
65
  await page.goto("https://2captcha.com/demo/cloudflare-turnstile");
71
66
  await page.waitForSelector('.cf-turnstile')
72
67
  let token = null
@@ -82,14 +77,11 @@ test('Cloudflare Turnstile', async () => {
82
77
  })
83
78
  await new Promise(r => setTimeout(r, 1000));
84
79
  }
85
- await browser.close()
86
- // if (token !== null) console.log('Cloudflare Turnstile Token: ' + token);
87
80
  assert.strictEqual(token !== null, true, "Cloudflare turnstile test failed!")
88
81
  })
89
82
 
90
83
 
91
84
  test('Fingerprint JS Bot Detector', async () => {
92
- const { page, browser } = await connect(realBrowserOption)
93
85
  await page.goto("https://fingerprint.com/products/bot-detection/");
94
86
  await new Promise(r => setTimeout(r, 8000));
95
87
  const detect = await page.evaluate(() => {
@@ -111,30 +103,24 @@ test('Fingerprint JS Bot Detector', async () => {
111
103
  }
112
104
  return false;
113
105
  })
114
- await browser.close()
115
106
  assert.strictEqual(detect, true, "Fingerprint JS Bot Detector test failed!")
116
107
  })
117
108
 
118
109
 
119
110
  // If you fail this test, your ip address probably has a high spam score. Please use a mobile or clean ip address.
120
111
  test('Datadome Bot Detector', async (t) => {
121
- const { page, browser } = await connect(realBrowserOption)
122
112
  await page.goto("https://antoinevastel.com/bots/datadome");
123
113
  const check = await page.waitForSelector('nav #navbarCollapse').catch(() => null)
124
- await browser.close()
125
114
  assert.strictEqual(check ? true : false, true, "Datadome Bot Detector test failed! [This may also be because your ip address has a high spam score. Please try with a clean ip address.]")
126
115
  })
127
116
 
128
117
  // If this test fails, please first check if you can access https://antcpt.com/score_detector/
129
118
  test('Recaptcha V3 Score (hard)', async () => {
130
- const { page, browser } = await connect(realBrowserOption)
131
119
  await page.goto("https://antcpt.com/score_detector/");
132
120
  await page.realClick("button")
133
121
  await new Promise(r => setTimeout(r, 5000));
134
122
  const score = await page.evaluate(() => {
135
123
  return document.querySelector('big').textContent.replace(/[^0-9.]/g, '')
136
124
  })
137
- await browser.close()
138
- // if (Number(score) >= 0.7) console.log('Recaptcha V3 Score: ' + score);
139
125
  assert.strictEqual(Number(score) >= 0.7, true, "(please first check if you can access https://antcpt.com/score_detector/.) Recaptcha V3 Score (hard) should be >=0.7. Score Result: " + score)
140
126
  })
package/test/esm/test.js CHANGED
@@ -3,54 +3,49 @@ import assert from 'node:assert';
3
3
  import { connect } from '../../lib/esm/index.mjs';
4
4
 
5
5
  const realBrowserOption = {
6
- args: ["--start-minimized"],
7
6
  turnstile: true,
8
7
  headless: false,
9
- // disableXvfb: true,
10
- // ignoreAllFlags:true,
11
8
  customConfig: {},
12
- connectOption: {
13
- defaultViewport: null
14
- },
15
9
  plugins: []
16
10
  }
17
11
 
12
+ // Shared browser instance for all tests
13
+ let browser = null;
14
+ let page = null;
18
15
 
19
- // test('Puppeteer Extra Plugin', async () => {
20
- // /*
21
- // Run with:
22
- // npm i puppeteer-extra-plugin-click-and-wait
23
- // */
24
- // const clickAndWait = await (await import('puppeteer-extra-plugin-click-and-wait')).default
25
- // realBrowserOption.plugins = [
26
- // clickAndWait()
27
- // ]
28
- // const { page, browser } = await connect(realBrowserOption)
29
- // await page.goto("https://google.com", { waitUntil: "domcontentloaded" })
30
- // await page.clickAndWaitForNavigation('body')
31
- // await browser.close()
32
- // })
16
+ // Setup - Run once before all tests
17
+ test.before(async () => {
18
+ console.log('🚀 Starting browser for all tests...');
19
+ const result = await connect(realBrowserOption);
20
+ browser = result.browser;
21
+ page = result.page;
22
+ console.log('✅ Browser started successfully');
23
+ });
24
+
25
+ // Teardown - Run once after all tests
26
+ test.after(async () => {
27
+ console.log('🏁 Closing browser after all tests...');
28
+ if (browser) {
29
+ await browser.close();
30
+ console.log('✅ Browser closed successfully');
31
+ }
32
+ });
33
33
 
34
34
  test('DrissionPage Detector', async () => {
35
- const { page, browser } = await connect(realBrowserOption)
36
35
  await page.goto("https://web.archive.org/web/20240913054632/https://drissionpage.pages.dev/");
37
36
  await page.realClick("#detector")
38
37
  let result = await page.evaluate(() => { return document.querySelector('#isBot span').textContent.includes("not") ? true : false })
39
- await browser.close()
40
38
  assert.strictEqual(result, true, "DrissionPage Detector test failed!")
41
39
  })
42
40
 
43
41
  test('Brotector, a webdriver detector', async () => {
44
- const { page, browser } = await connect(realBrowserOption)
45
42
  await page.goto("https://kaliiiiiiiiii.github.io/brotector/");
46
43
  await new Promise(r => setTimeout(r, 3000));
47
44
  let result = await page.evaluate(() => { return document.querySelector('#table-keys').getAttribute('bgcolor') })
48
- await browser.close()
49
45
  assert.strictEqual(result === "darkgreen", true, "Brotector, a webdriver detector test failed!")
50
46
  })
51
47
 
52
48
  test('Cloudflare WAF', async () => {
53
- const { page, browser } = await connect(realBrowserOption)
54
49
  await page.goto("https://nopecha.com/demo/cloudflare");
55
50
  let verify = null
56
51
  let startDate = Date.now()
@@ -62,13 +57,11 @@ test('Cloudflare WAF', async () => {
62
57
  }).catch(() => null)
63
58
  await new Promise(r => setTimeout(r, 2000));
64
59
  }
65
- await browser.close()
66
60
  assert.strictEqual(verify === true, true, "Cloudflare WAF test failed! (Site may be blocking automated access)")
67
61
  })
68
62
 
69
63
 
70
64
  test('Cloudflare Turnstile', async () => {
71
- const { page, browser } = await connect(realBrowserOption)
72
65
  await page.goto("https://2captcha.com/demo/cloudflare-turnstile");
73
66
  await page.waitForSelector('.cf-turnstile')
74
67
  let token = null
@@ -84,15 +77,12 @@ test('Cloudflare Turnstile', async () => {
84
77
  })
85
78
  await new Promise(r => setTimeout(r, 1000));
86
79
  }
87
- await browser.close()
88
- // if (token !== null) console.log('Cloudflare Turnstile Token: ' + token);
89
80
  assert.strictEqual(token !== null, true, "Cloudflare turnstile test failed!")
90
81
  })
91
82
 
92
83
 
93
84
 
94
85
  test('Fingerprint JS Bot Detector', async () => {
95
- const { page, browser } = await connect(realBrowserOption)
96
86
  await page.goto("https://fingerprint.com/products/bot-detection/");
97
87
  await new Promise(r => setTimeout(r, 8000));
98
88
  const detect = await page.evaluate(() => {
@@ -114,30 +104,24 @@ test('Fingerprint JS Bot Detector', async () => {
114
104
  }
115
105
  return false;
116
106
  })
117
- await browser.close()
118
107
  assert.strictEqual(detect, true, "Fingerprint JS Bot Detector test failed!")
119
108
  })
120
109
 
121
110
 
122
111
  // If you fail this test, your ip address probably has a high spam score. Please use a mobile or clean ip address.
123
112
  test('Datadome Bot Detector', async (t) => {
124
- const { page, browser } = await connect(realBrowserOption)
125
113
  await page.goto("https://antoinevastel.com/bots/datadome");
126
114
  const check = await page.waitForSelector('nav #navbarCollapse').catch(() => null)
127
- await browser.close()
128
115
  assert.strictEqual(check ? true : false, true, "Datadome Bot Detector test failed! [This may also be because your ip address has a high spam score. Please try with a clean ip address.]")
129
116
  })
130
117
 
131
118
  // If this test fails, please first check if you can access https://antcpt.com/score_detector/
132
119
  test('Recaptcha V3 Score (hard)', async () => {
133
- const { page, browser } = await connect(realBrowserOption)
134
120
  await page.goto("https://antcpt.com/score_detector/");
135
121
  await page.realClick("button")
136
122
  await new Promise(r => setTimeout(r, 5000));
137
123
  const score = await page.evaluate(() => {
138
124
  return document.querySelector('big').textContent.replace(/[^0-9.]/g, '')
139
125
  })
140
- await browser.close()
141
- // if (Number(score) >= 0.7) console.log('Recaptcha V3 Score: ' + score);
142
126
  assert.strictEqual(Number(score) >= 0.7, true, "(please first check if you can access https://antcpt.com/score_detector/.) Recaptcha V3 Score (hard) should be >=0.7. Score Result: " + score)
143
127
  })