Stealth HTTP Engine for Python
Project description
# Bequests
**Honestly, we're all tired of spending 3 hours debugging headers only to get slapped with a 403.** Bequests was born from a simple fact: making HTTP requests that actually fly under the radar has become a chore. This library isn't just another wrapper—it's an engine that handles the "dirty" work (TLS Fingerprinting, header ordering, hardware simulation) so you can focus on your data.
## Why Bequests instead of Requests??
* **TLS Fingerprinting that actually works**: Powered by curl\_cffi, we perfectly mimic real JA3/HTTP2 fingerprints from Chrome 120 and Safari 15.5.
* **Built-in Tor Support**: Native tunneling through the Tor network for maximum anonymity.
* **Layered Protection System**: No need to reinvent the wheel. Activate MAX or NUCLEAR layers depending on how tough the WAF is.
* **Passive Recon**: The engine recognizes signatures from Cloudflare, Akamai, or Datadome and adjusts its behavior automatically.
* **Hardware Simulation**: We inject real telemetry (Canvas, RAM, Viewport) to prove to the site that you're a human on a browser, not a script in a terminal.
* **Smart Features**: Life-savers like smart\_json (doesn't crash on weird chars) and a vault system to keep your sessions alive.
## Quick Start
### Standard Stealth Request
from bequests import Bequests, MAX\_LAYER
\# Fire up the engine
bot = Bequests(logged=True)
\# Max stealth + human-like navigation (favicon, robots.txt, etc.)
bot.layers(MAX\_LAYER).imit\_nav(True)
\# Fetch data, Bequests handles the bypass
resp = bot.get("\[https://target-website.com](https://target-website.com)")
print(resp.text)
### TOR Integration
\# Just toggle use\_tor to True (assumes Tor is running on default port 9050)
bot = Bequests(use\_tor=True, logged=True)
resp = bot.get("\[https://check.torproject.org](https://check.torproject.org)")
###Async Version
import asyncio
from bequests import AsyncBequests
async def main():
bot = AsyncBequests(logged=True)
# Generate some noise to warm up cookies
await bot.generate\_noise(count=3)
# Clean async request
resp = await bot.get("\[https://api.example.com/data](https://api.example.com/data)")
data = await bot.smart\_json(resp.url)
print(data)
asyncio.run(main())
### Protection Layers Guide
| Layer | Level | Features Included |
| :--- | :--- | :--- |
| **LOWER** | Basic | Identity (UA) + Jitter (random delays) |
| **MEDIUM** | Standard | LOWER + Header ordering consistency (Client Hints) |
| **MAX** | Professional | MEDIUM + Canvas/Hardware simulation + Cookie Warmup |
| **NUCLEAR** | Final Boss | MAX + Automatic pivot through Google Cache if still blocked |
## ⚙️ Under the Hood
### Session Management (Vault)
Bequests manages a bequests\_vault.json file. Your cookies are automatically saved after each success, allowing you to maintain "warm" sessions over the long term.
### Rate Limiting & Proxies
* **Auto-Rotation**: The engine can rotate your proxies automatically upon block detection.
* **Tor Tunnel**: Simple toggle for SOCKS5h routing.
* **Limits**: Use bot.set\_rate\_limit(requests=10, per\_seconds=60) to stay under the server's radar.
### Performance Tracking
To know if your tunnel is efficient, use bot.get\_stats() to monitor real success rates and the types of WAFs encountered.
## License
MIT. Use it wisely.
**Got an idea to improve the engine?** Feel free to open an Issue or suggest a custom Hook!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bequests-0.1.0.tar.gz.
File metadata
- Download URL: bequests-0.1.0.tar.gz
- Upload date:
- Size: 10.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81749588c22dc188bbff495eaea19b7c3b7f85b317a1db0097d27a1bc96dc4b8
|
|
| MD5 |
9dc755641deb98c56c134a10d190ed8c
|
|
| BLAKE2b-256 |
fe5b16bdb6eae310016993d9a69bec2f50e500bdad4f01dee7e6ab891729d17e
|
File details
Details for the file bequests-0.1.0-py2.py3-none-any.whl.
File metadata
- Download URL: bequests-0.1.0-py2.py3-none-any.whl
- Upload date:
- Size: 11.2 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fdf3036b062d3f649ccfd769feae0c6c16d45fcc1087f1897fce319e3b5c57f0
|
|
| MD5 |
8d060d794fb0d14ca5e877141756dc78
|
|
| BLAKE2b-256 |
0f5201b820193fd186040e942f09be9f602e0f3b627c819ba9476676a15337e5
|