or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

captcha-solving.mdchallenge-handling.mdcore-scraper.mdindex.mdjavascript-interpreters.mdproxy-management.mdstealth-mode.mduser-agent.md

javascript-interpreters.mddocs/

0

# JavaScript Interpreters

1

2

Multiple JavaScript execution backends for solving Cloudflare challenges. CloudScraper supports various interpreters to handle different challenge complexities and system requirements, with automatic fallback and error handling.

3

4

## Capabilities

5

6

### Base Interpreter Interface

7

8

Abstract base class that all JavaScript interpreters implement for consistent challenge solving across different execution backends.

9

10

```python { .api }

11

class JavaScriptInterpreter:

12

def __init__(self, name: str):

13

"""

14

Initialize JavaScript interpreter.

15

16

Parameters:

17

- name: str, interpreter identifier

18

"""

19

20

@classmethod

21

def dynamicImport(cls, name: str):

22

"""

23

Dynamically import and initialize interpreter.

24

25

Parameters:

26

- name: str, interpreter name to load

27

28

Returns:

29

JavaScriptInterpreter instance

30

31

Raises:

32

- ImportError: If interpreter cannot be loaded

33

"""

34

35

def eval(self, jsEnv: str, js: str):

36

"""

37

Execute JavaScript code in given environment.

38

39

Parameters:

40

- jsEnv: str, JavaScript environment/context

41

- js: str, JavaScript code to execute

42

43

Returns:

44

Execution result

45

46

Raises:

47

- CloudflareSolveError: If JavaScript execution fails

48

"""

49

50

def solveChallenge(self, body: str, domain: str) -> str:

51

"""

52

Solve Cloudflare challenge using JavaScript execution.

53

54

Parameters:

55

- body: str, challenge JavaScript code

56

- domain: str, target domain

57

58

Returns:

59

str: Challenge solution as formatted float

60

61

Raises:

62

- CloudflareSolveError: If challenge cannot be solved

63

"""

64

```

65

66

### js2py Interpreter

67

68

Pure Python JavaScript interpreter that provides good compatibility without external dependencies. This is the default and recommended interpreter.

69

70

```python { .api }

71

class ChallengeInterpreter(JavaScriptInterpreter):

72

def __init__(self):

73

"""Initialize js2py interpreter."""

74

75

def eval(self, jsEnv: str, js: str):

76

"""

77

Execute JavaScript using js2py library.

78

79

Parameters:

80

- jsEnv: str, JavaScript environment code

81

- js: str, JavaScript code to execute

82

83

Returns:

84

Execution result from js2py

85

"""

86

```

87

88

#### Usage Examples

89

90

```python

91

# js2py is the default interpreter

92

scraper = cloudscraper.create_scraper() # Uses js2py

93

94

# Explicitly specify js2py

95

scraper = cloudscraper.create_scraper(interpreter='js2py')

96

97

# js2py works well with all challenge types

98

response = scraper.get('https://v1-protected-site.com') # v1 challenges

99

response = scraper.get('https://v2-protected-site.com') # v2 challenges

100

response = scraper.get('https://v3-protected-site.com') # v3 challenges (recommended)

101

```

102

103

### Node.js Interpreter

104

105

Subprocess-based interpreter that uses Node.js for JavaScript execution, providing high compatibility and performance.

106

107

```python { .api }

108

class ChallengeInterpreter(JavaScriptInterpreter):

109

def __init__(self):

110

"""Initialize Node.js interpreter."""

111

112

def eval(self, jsEnv: str, js: str):

113

"""

114

Execute JavaScript using Node.js subprocess.

115

116

Parameters:

117

- jsEnv: str, JavaScript environment code

118

- js: str, JavaScript code to execute

119

120

Returns:

121

Execution result from Node.js

122

123

Raises:

124

- CloudflareSolveError: If Node.js execution fails

125

"""

126

```

127

128

#### Usage Examples

129

130

```python

131

# Requires Node.js installed on system

132

scraper = cloudscraper.create_scraper(interpreter='nodejs')

133

134

# Good for complex JavaScript challenges

135

response = scraper.get('https://complex-protected-site.com')

136

137

# Check if Node.js is available

138

import subprocess

139

try:

140

subprocess.check_output(['node', '--version'])

141

scraper = cloudscraper.create_scraper(interpreter='nodejs')

142

except FileNotFoundError:

143

print("Node.js not available, falling back to js2py")

144

scraper = cloudscraper.create_scraper(interpreter='js2py')

145

```

146

147

### V8 Interpreter

148

149

V8 JavaScript engine wrapper that provides native performance and excellent compatibility with modern JavaScript features.

150

151

```python { .api }

152

class ChallengeInterpreter(JavaScriptInterpreter):

153

def __init__(self):

154

"""Initialize V8 interpreter."""

155

156

def eval(self, jsEnv: str, js: str):

157

"""

158

Execute JavaScript using V8 engine.

159

160

Parameters:

161

- jsEnv: str, JavaScript environment code

162

- js: str, JavaScript code to execute

163

164

Returns:

165

Execution result from V8

166

"""

167

```

168

169

#### Usage Examples

170

171

```python

172

# Requires v8eval Python package

173

scraper = cloudscraper.create_scraper(interpreter='v8')

174

175

# High performance for intensive challenges

176

response = scraper.get('https://performance-intensive-site.com')

177

178

# Install v8eval: pip install v8eval

179

try:

180

scraper = cloudscraper.create_scraper(interpreter='v8')

181

except ImportError:

182

print("V8 not available, using js2py")

183

scraper = cloudscraper.create_scraper(interpreter='js2py')

184

```

185

186

### ChakraCore Interpreter

187

188

Microsoft ChakraCore JavaScript engine wrapper for Windows environments and specific compatibility requirements.

189

190

```python { .api }

191

class ChallengeInterpreter(JavaScriptInterpreter):

192

def __init__(self):

193

"""Initialize ChakraCore interpreter."""

194

195

def eval(self, jsEnv: str, js: str):

196

"""

197

Execute JavaScript using ChakraCore engine.

198

199

Parameters:

200

- jsEnv: str, JavaScript environment code

201

- js: str, JavaScript code to execute

202

203

Returns:

204

Execution result from ChakraCore

205

"""

206

```

207

208

#### Usage Examples

209

210

```python

211

# Windows-optimized interpreter

212

scraper = cloudscraper.create_scraper(interpreter='chakracore')

213

214

# Requires ChakraCore binaries

215

# Download from: https://github.com/VeNoMouS/cloudscraper/tree/ChakraCore/

216

response = scraper.get('https://windows-optimized-site.com')

217

```

218

219

### Native Interpreter

220

221

Self-contained Python implementation for solving challenges without external JavaScript engines.

222

223

```python { .api }

224

class ChallengeInterpreter(JavaScriptInterpreter):

225

def __init__(self):

226

"""Initialize native Python interpreter."""

227

228

def eval(self, jsEnv: str, js: str):

229

"""

230

Execute JavaScript using native Python implementation.

231

232

Parameters:

233

- jsEnv: str, JavaScript environment code

234

- js: str, JavaScript code to execute

235

236

Returns:

237

Execution result from native implementation

238

"""

239

```

240

241

#### Usage Examples

242

243

```python

244

# No external dependencies required

245

scraper = cloudscraper.create_scraper(interpreter='native')

246

247

# Limited to simpler challenges

248

response = scraper.get('https://simple-protected-site.com')

249

250

# Good fallback option

251

interpreters = ['js2py', 'nodejs', 'v8', 'native']

252

for interpreter in interpreters:

253

try:

254

scraper = cloudscraper.create_scraper(interpreter=interpreter)

255

response = scraper.get('https://protected-site.com')

256

print(f"Success with {interpreter}")

257

break

258

except Exception as e:

259

print(f"Failed with {interpreter}: {e}")

260

continue

261

```

262

263

## Interpreter Selection and Compatibility

264

265

### Recommended Interpreters by Challenge Type

266

267

Different challenge types work better with specific interpreters:

268

269

```python

270

# Challenge type recommendations

271

challenge_interpreters = {

272

'v1_challenges': ['js2py', 'nodejs', 'native'],

273

'v2_challenges': ['js2py', 'nodejs', 'v8'],

274

'v3_challenges': ['js2py', 'nodejs'], # js2py highly recommended

275

'complex_js': ['nodejs', 'v8', 'js2py'],

276

'simple_js': ['native', 'js2py']

277

}

278

279

# For maximum v3 compatibility

280

scraper = cloudscraper.create_scraper(

281

interpreter='js2py',

282

delay=5 # Allow extra time for complex v3 challenges

283

)

284

```

285

286

### Interpreter Testing and Fallback

287

288

Test different interpreters to find the most compatible one:

289

290

```python

291

def test_interpreters(url, interpreters=['js2py', 'nodejs', 'v8', 'native']):

292

"""Test different interpreters for a specific site."""

293

results = {}

294

295

for interpreter in interpreters:

296

try:

297

scraper = cloudscraper.create_scraper(

298

interpreter=interpreter,

299

debug=True # See which challenges are detected

300

)

301

response = scraper.get(url)

302

results[interpreter] = {

303

'status': response.status_code,

304

'success': response.status_code == 200,

305

'error': None

306

}

307

print(f"✅ {interpreter}: Success ({response.status_code})")

308

309

except Exception as e:

310

results[interpreter] = {

311

'status': None,

312

'success': False,

313

'error': str(e)

314

}

315

print(f"❌ {interpreter}: Failed - {e}")

316

317

return results

318

319

# Test site with different interpreters

320

results = test_interpreters('https://protected-site.com')

321

```

322

323

### Performance Considerations

324

325

Different interpreters have different performance characteristics:

326

327

```python

328

# Performance ranking (fastest to slowest)

329

performance_ranking = [

330

'v8', # Native C++ V8 engine

331

'chakracore', # Native ChakraCore engine

332

'nodejs', # Node.js subprocess (overhead but fast execution)

333

'js2py', # Pure Python (slower but very compatible)

334

'native' # Limited Python implementation

335

]

336

337

# For performance-critical applications

338

scraper = cloudscraper.create_scraper(

339

interpreter='v8',

340

delay=3 # Faster interpreter may need less delay

341

)

342

343

# For maximum compatibility

344

scraper = cloudscraper.create_scraper(

345

interpreter='js2py',

346

delay=5 # More conservative timing

347

)

348

```

349

350

## Advanced Interpreter Configuration

351

352

### Custom Interpreter Environment

353

354

Configure interpreter-specific settings:

355

356

```python

357

# Different interpreters may support different configurations

358

scraper = cloudscraper.create_scraper(

359

interpreter='js2py',

360

debug=True # See JavaScript execution details

361

)

362

363

# Some interpreters work better with specific delays

364

interpreter_delays = {

365

'js2py': 5,

366

'nodejs': 3,

367

'v8': 2,

368

'chakracore': 3,

369

'native': 5

370

}

371

372

interpreter = 'js2py'

373

scraper = cloudscraper.create_scraper(

374

interpreter=interpreter,

375

delay=interpreter_delays.get(interpreter, 5)

376

)

377

```

378

379

### Interpreter Error Handling

380

381

Handle interpreter-specific errors:

382

383

```python

384

try:

385

scraper = cloudscraper.create_scraper(interpreter='v8')

386

response = scraper.get('https://protected-site.com')

387

388

except ImportError:

389

print("V8 not available, trying Node.js")

390

try:

391

scraper = cloudscraper.create_scraper(interpreter='nodejs')

392

response = scraper.get('https://protected-site.com')

393

except Exception:

394

print("Node.js failed, falling back to js2py")

395

scraper = cloudscraper.create_scraper(interpreter='js2py')

396

response = scraper.get('https://protected-site.com')

397

398

except cloudscraper.CloudflareSolveError as e:

399

print(f"JavaScript execution failed: {e}")

400

print("Try a different interpreter or check the challenge type")

401

```

402

403

### Dynamic Interpreter Selection

404

405

Automatically select the best available interpreter:

406

407

```python

408

def get_best_interpreter():

409

"""Select the best available interpreter."""

410

# Try interpreters in preference order

411

preferred_order = ['v8', 'nodejs', 'js2py', 'native']

412

413

for interpreter in preferred_order:

414

try:

415

# Test interpreter availability

416

test_scraper = cloudscraper.create_scraper(interpreter=interpreter)

417

return interpreter

418

except ImportError:

419

continue

420

421

# Default fallback

422

return 'js2py'

423

424

# Use best available interpreter

425

best_interpreter = get_best_interpreter()

426

scraper = cloudscraper.create_scraper(interpreter=best_interpreter)

427

print(f"Using interpreter: {best_interpreter}")

428

```

429

430

## Troubleshooting Interpreters

431

432

### Common Issues and Solutions

433

434

```python

435

# Issue: ImportError when using specific interpreter

436

try:

437

scraper = cloudscraper.create_scraper(interpreter='v8')

438

except ImportError:

439

print("Install v8eval: pip install v8eval")

440

441

# Issue: CloudflareSolveError during JavaScript execution

442

try:

443

scraper = cloudscraper.create_scraper(interpreter='js2py', debug=True)

444

response = scraper.get('https://protected-site.com')

445

except cloudscraper.CloudflareSolveError as e:

446

print(f"JavaScript execution failed: {e}")

447

print("Try different interpreter or check challenge complexity")

448

449

# Issue: Timeout during challenge solving

450

scraper = cloudscraper.create_scraper(

451

interpreter='js2py',

452

delay=10, # Increase delay for slow interpreters

453

debug=True # See execution progress

454

)

455

```

456

457

### Interpreter Debugging

458

459

Enable debug mode to see interpreter execution:

460

461

```python

462

scraper = cloudscraper.create_scraper(

463

interpreter='js2py',

464

debug=True

465

)

466

467

response = scraper.get('https://protected-site.com')

468

469

# Debug output shows:

470

# "Using js2py interpreter for challenge solving"

471

# "Executing JavaScript challenge code..."

472

# "Challenge solved with result: 1234.5678901234"

473

```