Metadata-Version: 2.4
Name: proxy-hunter-botman
Version: 1.0.0
Summary: Fast concurrent proxy scraper and checker — by BotMan Army
Author: morose1337
License: MIT
Project-URL: Telegram, https://t.me/botmanarmy
Project-URL: Developer, https://t.me/morose1337
Keywords: proxy,scraper,checker,http,socks,free-proxy
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Internet
Classifier: Topic :: Internet :: Proxy Servers
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: requests>=2.28.0
Dynamic: license-file

# Proxy Hunter

**Fast concurrent proxy scraper and checker**

By **BotMan Army** | Developer: **morose1337**

Telegram: [t.me/botmanarmy](https://t.me/botmanarmy) | [t.me/morose1337](https://t.me/morose1337)

## Install

```bash
pip install proxy-hunter
```

## Usage

### Get working proxies (scrape + check)

```python
from proxy_hunter import get_proxies

# Returns list of working proxies
proxies = get_proxies()
print(proxies)
# ['103.152.112.162:80', '47.88.31.226:8080', ...]

# With options
proxies = get_proxies(
    workers=500,
    timeout=8,
    verbose=True,
    save_to="working.txt",
)
```

### Only scrape (no checking)

```python
from proxy_hunter import grab_proxies

all_proxies = grab_proxies()
print(f"Grabbed {len(all_proxies)} proxies")
```

### Check your own proxy list

```python
from proxy_hunter import check

my_proxies = ["103.152.112.162:80", "47.88.31.226:8080"]
result = check(my_proxies, workers=100, timeout=5, verbose=True)

print(result["working"])       # list of working proxies
print(result["working_count"]) # count
print(result["elapsed"])       # seconds
print(result["rate"])          # proxies/sec
```

### With callback

```python
from proxy_hunter import get_proxies

def on_hit(proxy, latency_ms):
    print(f"Found: {proxy} ({latency_ms}ms)")

proxies = get_proxies(callback=on_hit)
```

## CLI

```bash
# Default
proxy-hunter

# Custom
proxy-hunter -w 1000 -t 4 -o results.txt --insecure -v

# As module
python -m proxy_hunter -w 500 -v
```

## API

### `get_proxies(**kwargs) -> list[str]`
Scrape + check. Returns working proxies.

| Param | Default | Description |
|-------|---------|-------------|
| `workers` | 800 | Concurrent threads |
| `timeout` | 6 | Seconds per proxy |
| `retries` | 2 | Retry attempts |
| `verify_ssl` | False | Verify SSL certs |
| `verbose` | False | Print live output |
| `save_to` | None | Save to file |
| `callback` | None | `fn(proxy, latency_ms)` |

### `grab_proxies(verbose=False) -> list[str]`
Scrape only, no checking.

### `check(proxies, **kwargs) -> dict`
Check a given list. Returns dict with `working`, `total`, `tested`, `working_count`, `failed_count`, `elapsed`, `rate`.
