Metadata-Version: 2.4
Name: tlsreq
Version: 0.1.0
Summary: Unified async/sync HTTP client over curl_cffi, wreq, niquests+utls, and httpx+utls
Author: xiaoweigege
License-Expression: MIT
Project-URL: Homepage, https://github.com/xiaoweigege/tlsreq
Project-URL: Repository, https://github.com/xiaoweigege/tlsreq
Project-URL: Issues, https://github.com/xiaoweigege/tlsreq/issues
Project-URL: utls (Chrome 152), https://github.com/xiaoweigege/utls/releases/tag/2026.9.4
Keywords: tls,http2,fingerprint,ja4,utls,curl_cffi,wreq
Classifier: Programming Language :: Python :: 3
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: Typing :: Typed
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: curl-cffi
Requires-Dist: curl_cffi>=0.13; extra == "curl-cffi"
Provides-Extra: wreq
Requires-Dist: wreq>=0.12; extra == "wreq"
Provides-Extra: niquests
Requires-Dist: niquests>=3.0; extra == "niquests"
Provides-Extra: httpx
Requires-Dist: httpx>=0.27; extra == "httpx"
Requires-Dist: httpcore>=1.0; extra == "httpx"
Requires-Dist: h2>=4.1; extra == "httpx"
Provides-Extra: all
Requires-Dist: tlsreq[curl_cffi]; extra == "all"
Requires-Dist: tlsreq[wreq]; extra == "all"
Requires-Dist: tlsreq[niquests]; extra == "all"
Requires-Dist: tlsreq[httpx]; extra == "all"
Dynamic: license-file

# tlsreq

把 `curl_cffi`、`wreq`、`niquests+utls`、`httpx+utls` 收成同一套 Session API。换库只改 `backend` 和 `impersonate`。

GitHub: https://github.com/xiaoweigege/tlsreq

## 安装

```bash
pip install tlsreq
pip install "tlsreq[httpx]"      # 或 niquests / wreq / curl_cffi / all
```

Chrome 152 不在 PyPI 的 `utls` 里。httpx / niquests 需要再装 GitHub 2026.9.4：

https://github.com/xiaoweigege/utls/releases/tag/2026.9.4

```bash
python -m tlsreq.install_utls
# 或 tlsreq-install-utls
```

## 用法

```python
from tlsreq import AsyncSession, Session

async with AsyncSession(
    backend="niquests",           # curl_cffi / wreq / niquests / httpx
    impersonate="chrome152",
    proxy="http://user:pass@host:port",
    timeout=30,
    extra={"pool_maxsize": 1},    # 只传给当前库
) as s:
    r = await s.get(url, headers=headers)
    print(r.status_code, r.text, r.cookies, r.http_version)
    r = await s.post(url, data=body, headers=headers, header_order=["user-agent", "accept"])

s = Session(backend="wreq", impersonate="chrome149", proxy=proxy)
r = s.get(url, headers=headers)
```

`extra=` 会合并进底层构造函数或单次请求，后写覆盖统一层映射。底层 client 在 `s.raw`。

niquests / httpx 默认带 Chrome 152 的 HTTP/2 SETTINGS、窗口和 HEADERS Priority，JA4 / peetprint / akamai_fingerprint 对齐真机。
