# SunnyNet - 网络中间件
SunnyNet 是一个强大的 Python 网络中间件库,提供 HTTP/HTTPS、TCP、UDP 和 WebSocket 代理功能。
## 功能特性
- 🌐 **HTTP/HTTPS 代理**: 支持 HTTP 和 HTTPS 请求拦截和修改
- 🔐 **SSL/TLS 支持**: 内置证书管理,支持 HTTPS 解密
- 🔌 **TCP/UDP 代理**: 完整的 TCP 和 UDP 连接管理
- 💬 **WebSocket 支持**: WebSocket 连接拦截和数据处理
- 🎯 **进程过滤**: 可按进程名称或 PID 进行网络捕获
- 🔧 **驱动支持**: 支持 NFAPI 和 Proxifier 驱动
- 🎲 **JA3 指纹伪装**: 支持随机 JA3 指纹,绕过指纹识别
- 📝 **脚本支持**: 内置脚本编辑器,支持动态脚本
## 安装
### 方法 1: 一键安装(推荐,全局可用)
```bash
# 安装 Python 包
pip install SunnyNet
# 安装库文件到全局目录(类似 playwright install)
sunnynet install
# 或简写
sunnynet i
```
**优点**:
- ✅ 全局安装,所有项目都能使用
- ✅ 类似 Playwright 的使用体验
- ✅ Windows 安装到 `%APPDATA%\SunnyNet\lib`
- ✅ Linux/Mac 安装到 `~/.sunnynet/lib`
### 方法 2: 自动安装(项目级别)
```bash
pip install SunnyNet
```
安装时会**自动下载**库文件到包目录(仅当前虚拟环境可用)
### 查看安装信息
```bash
sunnynet info
```
显示库文件安装位置和状态。
### 离线安装
也可以手动放置库文件:
1. 下载对应平台的库文件
2. 找到安装目录:
```bash
python -c "import SunnyNet; import os; print(os.path.dirname(SunnyNet.__file__))"
```
3. 将库文件复制到该目录
**支持的库文件**:
- **Windows**: `SunnyNet64.dll` / `SunnyNet.dll` (32位)
- **Linux**: `SunnyNet64.so` / `SunnyNet.so` (32位)
- **macOS**: `SunnyNet64.dylib` / `SunnyNet.dylib` (32位)
## 快速开始
```python
from SunnyNet.SunnyNet import SunnyNet
from SunnyNet.Event import HTTPEvent
def http_callback(conn: HTTPEvent):
if conn.get_event_type() == conn.EVENT_TYPE_REQUEST:
print(f"请求: {conn.get_url()}")
elif conn.get_event_type() == conn.EVENT_TYPE_RESPONSE:
print(f"响应: {conn.get_url()}")
# 创建实例
app = SunnyNet()
app.set_port(2025)
app.install_cert_to_system()
# 设置回调
app.set_callback(http_callback=http_callback)
# 启动服务
if app.start():
print("SunnyNet 已启动")
app.set_ie_proxy() # 设置系统代理
else:
print(f"启动失败: {app.error()}")
```
## 主要模块
### SunnyNet - 主中间件类
```python
from SunnyNet.SunnyNet import SunnyNet
app = SunnyNet()
app.set_port(2025) # 设置端口
app.start() # 启动服务
app.stop() # 停止服务
```
### HTTPClient - HTTP 客户端
```python
from SunnyNet.HTTPClient import SunnyHTTPClient
client = SunnyHTTPClient()
client.set_random_tls(True) # 启用随机 TLS 指纹
client.open("GET", "https://example.com")
client.send()
print(client.get_body_string())
```
### CertManager - 证书管理
```python
from SunnyNet.CertManager import CertManager
cert = CertManager()
cert.create("example.com")
print(cert.export_pub_key())
```
### Queue - 消息队列
```python
from SunnyNet.Queue import Queue
queue = Queue("queue_name")
queue.create()
queue.push("message")
print(queue.pull_string())
```
## 进阶功能
### 进程过滤
```python
# 捕获指定进程
app.process_add_name("chrome.exe")
app.process_add_pid(1234)
# 捕获所有进程
app.process_all(True, False)
```
### 上游代理
```python
# 设置代理
app.set_proxy("http://127.0.0.1:8888", 30000)
# 设置代理规则
app.set_proxy_rules(".*google.*|.*facebook.*")
```
### 驱动模式
```python
# 加载 NFAPI 驱动(需要管理员权限)
if app.open_drive(True):
print("驱动加载成功")
app.process_all(True, False)
```
## 事件回调
### HTTP 事件
```python
def http_callback(conn: HTTPEvent):
if conn.get_event_type() == conn.EVENT_TYPE_REQUEST:
# 修改请求
conn.get_request().set_header("User-Agent", "Custom UA")
elif conn.get_event_type() == conn.EVENT_TYPE_RESPONSE:
# 处理响应
body = conn.get_response().body_auto_str()
```
### TCP 事件
```python
def tcp_callback(conn: TCPEvent):
if conn.get_event_type() == conn.EVENT_TYPE_SEND:
print(f"TCP 发送: {len(conn.get_body())} 字节")
elif conn.get_event_type() == conn.EVENT_TYPE_RECEIVE:
print(f"TCP 接收: {len(conn.get_body())} 字节")
```
### WebSocket 事件
```python
def ws_callback(conn: WebSocketEvent):
if conn.get_event_type() == conn.EVENT_TYPE_SEND:
print(f"WS 发送: {conn.get_body()}")
elif conn.get_event_type() == conn.EVENT_TYPE_RECEIVE:
print(f"WS 接收: {conn.get_body()}")
```
## 系统要求
### Windows
- Windows 7 及以上(需要 KB3033929 补丁用于 NFAPI 驱动)
- Python 3.7+
- 管理员权限(驱动模式需要)
### Linux
- Python 3.7+
- 需要 SunnyNet64.so 共享库文件
- 注意:Linux版本目前暂不支持驱动模式
### macOS
- Python 3.7+
- 需要 SunnyNet64.dylib 动态库文件
- 注意:macOS版本目前暂不支持驱动模式
## 注意事项
1. HTTPS 拦截需要安装证书:`app.install_cert_to_system()`
2. 驱动模式需要管理员权限(仅 Windows)
3. NFAPI 驱动在 Windows 7 上需要 KB3033929 补丁
4. Proxifier 驱动不支持 UDP 和 32 位系统
5. Linux 和 macOS 版本需要相应的共享库文件(.so 或 .dylib)
6. 跨平台支持:代码会自动检测操作系统并加载对应的库文件
## 许可证
MIT License
## 联系方式
- QQ 群: 751406884
## 更新日志
### v1.3.3 (2025-10-20)
- 🚀 **新增 GitHub 镜像加速支持**(解决国内下载问题)
- 📊 **改进下载进度显示**(显示进度条和文件大小)
- 🔄 **自动切换镜像源**(支持 6 个镜像站,自动重试)
- ⚡ **优化下载体验**(更快、更稳定)
- 💡 **更友好的错误提示**(提供手动下载指引)
### v1.3.2 (2025-10-20)
- 🐛 **修复 CLI 模块循环依赖问题**
- ✅ CLI 工具可独立运行,不触发 DLL 加载
### v1.3.1 (2025-10-20)
- 🐛 **修复命令行工具加载问题**
- ✅ 优化库文件延迟加载机制
- 🔧 修复 `pyproject.toml` 配置,确保命令行工具正确安装
- 💡 改进错误提示,引导用户使用 `sunnynet install`
### v1.3.0 (2025-10-20)
- 🎯 **新增 CLI 命令行工具**(类似 Playwright)
- ✨ 支持 `sunnynet install` 全局安装库文件
- 🌍 库文件全局可用,所有项目共享
- 📍 Windows: `%APPDATA%\SunnyNet\lib`
- 📍 Linux/Mac: `~/.sunnynet/lib`
- 🔍 新增 `sunnynet info` 查看安装状态
### v1.2.0 (2025-10-20)
- 🚀 **使用 GitHub Releases 下载库文件**(无文件大小限制)
- ✅ 完整支持 Windows 和 Linux 平台自动下载
- 🔧 优化下载脚本,支持文件自动重命名
- 📦 改进大文件下载体验
- 🐛 修复 jsDelivr CDN 文件大小限制问题
### v1.1.0 (2025-10-20)
- ✨ 新增跨平台支持(Windows、Linux、macOS)
- 🔧 自动检测操作系统并加载对应的库文件
- 📝 优化错误提示,显示详细的平台和路径信息
- 🐛 修复库文件路径查找逻辑
- 📚 更新文档,添加跨平台使用说明
### v1.0.0 (2025-04-13)
- 首次发布
- 支持 HTTP/HTTPS、TCP、UDP、WebSocket
- 支持进程过滤
- 支持驱动模式
- 支持 JA3 指纹伪装
Raw data
{
"_id": null,
"home_page": "https://github.com/yourusername/SunnyNet",
"name": "SunnyNet",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "network, proxy, middleware, http, tcp, udp, websocket",
"author": "\u79e6\u5929",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/47/08/cc78a2498703bcf9d9a96b82c57018f96bd27d534bff1f37c1c4a3a19464/sunnynet-1.5.18.tar.gz",
"platform": null,
"description": "# SunnyNet - \u7f51\u7edc\u4e2d\u95f4\u4ef6\r\n\r\nSunnyNet \u662f\u4e00\u4e2a\u5f3a\u5927\u7684 Python \u7f51\u7edc\u4e2d\u95f4\u4ef6\u5e93\uff0c\u63d0\u4f9b HTTP/HTTPS\u3001TCP\u3001UDP \u548c WebSocket \u4ee3\u7406\u529f\u80fd\u3002\r\n\r\n## \u529f\u80fd\u7279\u6027\r\n\r\n- \ud83c\udf10 **HTTP/HTTPS \u4ee3\u7406**: \u652f\u6301 HTTP \u548c HTTPS \u8bf7\u6c42\u62e6\u622a\u548c\u4fee\u6539\r\n- \ud83d\udd10 **SSL/TLS \u652f\u6301**: \u5185\u7f6e\u8bc1\u4e66\u7ba1\u7406\uff0c\u652f\u6301 HTTPS \u89e3\u5bc6\r\n- \ud83d\udd0c **TCP/UDP \u4ee3\u7406**: \u5b8c\u6574\u7684 TCP \u548c UDP \u8fde\u63a5\u7ba1\u7406\r\n- \ud83d\udcac **WebSocket \u652f\u6301**: WebSocket \u8fde\u63a5\u62e6\u622a\u548c\u6570\u636e\u5904\u7406\r\n- \ud83c\udfaf **\u8fdb\u7a0b\u8fc7\u6ee4**: \u53ef\u6309\u8fdb\u7a0b\u540d\u79f0\u6216 PID \u8fdb\u884c\u7f51\u7edc\u6355\u83b7\r\n- \ud83d\udd27 **\u9a71\u52a8\u652f\u6301**: \u652f\u6301 NFAPI \u548c Proxifier \u9a71\u52a8\r\n- \ud83c\udfb2 **JA3 \u6307\u7eb9\u4f2a\u88c5**: \u652f\u6301\u968f\u673a JA3 \u6307\u7eb9\uff0c\u7ed5\u8fc7\u6307\u7eb9\u8bc6\u522b\r\n- \ud83d\udcdd **\u811a\u672c\u652f\u6301**: \u5185\u7f6e\u811a\u672c\u7f16\u8f91\u5668\uff0c\u652f\u6301\u52a8\u6001\u811a\u672c\r\n\r\n## \u5b89\u88c5\r\n\r\n### \u65b9\u6cd5 1: \u4e00\u952e\u5b89\u88c5\uff08\u63a8\u8350\uff0c\u5168\u5c40\u53ef\u7528\uff09\r\n\r\n```bash\r\n# \u5b89\u88c5 Python \u5305\r\npip install SunnyNet\r\n\r\n# \u5b89\u88c5\u5e93\u6587\u4ef6\u5230\u5168\u5c40\u76ee\u5f55\uff08\u7c7b\u4f3c playwright install\uff09\r\nsunnynet install\r\n# \u6216\u7b80\u5199\r\nsunnynet i\r\n```\r\n\r\n**\u4f18\u70b9**\uff1a\r\n- \u2705 \u5168\u5c40\u5b89\u88c5\uff0c\u6240\u6709\u9879\u76ee\u90fd\u80fd\u4f7f\u7528\r\n- \u2705 \u7c7b\u4f3c Playwright \u7684\u4f7f\u7528\u4f53\u9a8c\r\n- \u2705 Windows \u5b89\u88c5\u5230 `%APPDATA%\\SunnyNet\\lib`\r\n- \u2705 Linux/Mac \u5b89\u88c5\u5230 `~/.sunnynet/lib`\r\n\r\n### \u65b9\u6cd5 2: \u81ea\u52a8\u5b89\u88c5\uff08\u9879\u76ee\u7ea7\u522b\uff09\r\n\r\n```bash\r\npip install SunnyNet\r\n```\r\n\r\n\u5b89\u88c5\u65f6\u4f1a**\u81ea\u52a8\u4e0b\u8f7d**\u5e93\u6587\u4ef6\u5230\u5305\u76ee\u5f55\uff08\u4ec5\u5f53\u524d\u865a\u62df\u73af\u5883\u53ef\u7528\uff09\r\n\r\n### \u67e5\u770b\u5b89\u88c5\u4fe1\u606f\r\n\r\n```bash\r\nsunnynet info\r\n```\r\n\r\n\u663e\u793a\u5e93\u6587\u4ef6\u5b89\u88c5\u4f4d\u7f6e\u548c\u72b6\u6001\u3002\r\n\r\n### \u79bb\u7ebf\u5b89\u88c5\r\n\r\n\u4e5f\u53ef\u4ee5\u624b\u52a8\u653e\u7f6e\u5e93\u6587\u4ef6\uff1a\r\n\r\n1. \u4e0b\u8f7d\u5bf9\u5e94\u5e73\u53f0\u7684\u5e93\u6587\u4ef6\r\n2. \u627e\u5230\u5b89\u88c5\u76ee\u5f55\uff1a\r\n ```bash\r\n python -c \"import SunnyNet; import os; print(os.path.dirname(SunnyNet.__file__))\"\r\n ```\r\n3. \u5c06\u5e93\u6587\u4ef6\u590d\u5236\u5230\u8be5\u76ee\u5f55\r\n\r\n**\u652f\u6301\u7684\u5e93\u6587\u4ef6**:\r\n- **Windows**: `SunnyNet64.dll` / `SunnyNet.dll` (32\u4f4d)\r\n- **Linux**: `SunnyNet64.so` / `SunnyNet.so` (32\u4f4d)\r\n- **macOS**: `SunnyNet64.dylib` / `SunnyNet.dylib` (32\u4f4d)\r\n\r\n## \u5feb\u901f\u5f00\u59cb\r\n\r\n```python\r\nfrom SunnyNet.SunnyNet import SunnyNet\r\nfrom SunnyNet.Event import HTTPEvent\r\n\r\ndef http_callback(conn: HTTPEvent):\r\n if conn.get_event_type() == conn.EVENT_TYPE_REQUEST:\r\n print(f\"\u8bf7\u6c42: {conn.get_url()}\")\r\n elif conn.get_event_type() == conn.EVENT_TYPE_RESPONSE:\r\n print(f\"\u54cd\u5e94: {conn.get_url()}\")\r\n\r\n# \u521b\u5efa\u5b9e\u4f8b\r\napp = SunnyNet()\r\napp.set_port(2025)\r\napp.install_cert_to_system()\r\n\r\n# \u8bbe\u7f6e\u56de\u8c03\r\napp.set_callback(http_callback=http_callback)\r\n\r\n# \u542f\u52a8\u670d\u52a1\r\nif app.start():\r\n print(\"SunnyNet \u5df2\u542f\u52a8\")\r\n app.set_ie_proxy() # \u8bbe\u7f6e\u7cfb\u7edf\u4ee3\u7406\r\nelse:\r\n print(f\"\u542f\u52a8\u5931\u8d25: {app.error()}\")\r\n```\r\n\r\n## \u4e3b\u8981\u6a21\u5757\r\n\r\n### SunnyNet - \u4e3b\u4e2d\u95f4\u4ef6\u7c7b\r\n\r\n```python\r\nfrom SunnyNet.SunnyNet import SunnyNet\r\n\r\napp = SunnyNet()\r\napp.set_port(2025) # \u8bbe\u7f6e\u7aef\u53e3\r\napp.start() # \u542f\u52a8\u670d\u52a1\r\napp.stop() # \u505c\u6b62\u670d\u52a1\r\n```\r\n\r\n### HTTPClient - HTTP \u5ba2\u6237\u7aef\r\n\r\n```python\r\nfrom SunnyNet.HTTPClient import SunnyHTTPClient\r\n\r\nclient = SunnyHTTPClient()\r\nclient.set_random_tls(True) # \u542f\u7528\u968f\u673a TLS \u6307\u7eb9\r\nclient.open(\"GET\", \"https://example.com\")\r\nclient.send()\r\nprint(client.get_body_string())\r\n```\r\n\r\n### CertManager - \u8bc1\u4e66\u7ba1\u7406\r\n\r\n```python\r\nfrom SunnyNet.CertManager import CertManager\r\n\r\ncert = CertManager()\r\ncert.create(\"example.com\")\r\nprint(cert.export_pub_key())\r\n```\r\n\r\n### Queue - \u6d88\u606f\u961f\u5217\r\n\r\n```python\r\nfrom SunnyNet.Queue import Queue\r\n\r\nqueue = Queue(\"queue_name\")\r\nqueue.create()\r\nqueue.push(\"message\")\r\nprint(queue.pull_string())\r\n```\r\n\r\n## \u8fdb\u9636\u529f\u80fd\r\n\r\n### \u8fdb\u7a0b\u8fc7\u6ee4\r\n\r\n```python\r\n# \u6355\u83b7\u6307\u5b9a\u8fdb\u7a0b\r\napp.process_add_name(\"chrome.exe\")\r\napp.process_add_pid(1234)\r\n\r\n# \u6355\u83b7\u6240\u6709\u8fdb\u7a0b\r\napp.process_all(True, False)\r\n```\r\n\r\n### \u4e0a\u6e38\u4ee3\u7406\r\n\r\n```python\r\n# \u8bbe\u7f6e\u4ee3\u7406\r\napp.set_proxy(\"http://127.0.0.1:8888\", 30000)\r\n\r\n# \u8bbe\u7f6e\u4ee3\u7406\u89c4\u5219\r\napp.set_proxy_rules(\".*google.*|.*facebook.*\")\r\n```\r\n\r\n### \u9a71\u52a8\u6a21\u5f0f\r\n\r\n```python\r\n# \u52a0\u8f7d NFAPI \u9a71\u52a8\uff08\u9700\u8981\u7ba1\u7406\u5458\u6743\u9650\uff09\r\nif app.open_drive(True):\r\n print(\"\u9a71\u52a8\u52a0\u8f7d\u6210\u529f\")\r\n app.process_all(True, False)\r\n```\r\n\r\n## \u4e8b\u4ef6\u56de\u8c03\r\n\r\n### HTTP \u4e8b\u4ef6\r\n\r\n```python\r\ndef http_callback(conn: HTTPEvent):\r\n if conn.get_event_type() == conn.EVENT_TYPE_REQUEST:\r\n # \u4fee\u6539\u8bf7\u6c42\r\n conn.get_request().set_header(\"User-Agent\", \"Custom UA\")\r\n elif conn.get_event_type() == conn.EVENT_TYPE_RESPONSE:\r\n # \u5904\u7406\u54cd\u5e94\r\n body = conn.get_response().body_auto_str()\r\n```\r\n\r\n### TCP \u4e8b\u4ef6\r\n\r\n```python\r\ndef tcp_callback(conn: TCPEvent):\r\n if conn.get_event_type() == conn.EVENT_TYPE_SEND:\r\n print(f\"TCP \u53d1\u9001: {len(conn.get_body())} \u5b57\u8282\")\r\n elif conn.get_event_type() == conn.EVENT_TYPE_RECEIVE:\r\n print(f\"TCP \u63a5\u6536: {len(conn.get_body())} \u5b57\u8282\")\r\n```\r\n\r\n### WebSocket \u4e8b\u4ef6\r\n\r\n```python\r\ndef ws_callback(conn: WebSocketEvent):\r\n if conn.get_event_type() == conn.EVENT_TYPE_SEND:\r\n print(f\"WS \u53d1\u9001: {conn.get_body()}\")\r\n elif conn.get_event_type() == conn.EVENT_TYPE_RECEIVE:\r\n print(f\"WS \u63a5\u6536: {conn.get_body()}\")\r\n```\r\n\r\n## \u7cfb\u7edf\u8981\u6c42\r\n\r\n### Windows\r\n- Windows 7 \u53ca\u4ee5\u4e0a\uff08\u9700\u8981 KB3033929 \u8865\u4e01\u7528\u4e8e NFAPI \u9a71\u52a8\uff09\r\n- Python 3.7+\r\n- \u7ba1\u7406\u5458\u6743\u9650\uff08\u9a71\u52a8\u6a21\u5f0f\u9700\u8981\uff09\r\n\r\n### Linux\r\n- Python 3.7+\r\n- \u9700\u8981 SunnyNet64.so \u5171\u4eab\u5e93\u6587\u4ef6\r\n- \u6ce8\u610f\uff1aLinux\u7248\u672c\u76ee\u524d\u6682\u4e0d\u652f\u6301\u9a71\u52a8\u6a21\u5f0f\r\n\r\n### macOS\r\n- Python 3.7+\r\n- \u9700\u8981 SunnyNet64.dylib \u52a8\u6001\u5e93\u6587\u4ef6\r\n- \u6ce8\u610f\uff1amacOS\u7248\u672c\u76ee\u524d\u6682\u4e0d\u652f\u6301\u9a71\u52a8\u6a21\u5f0f\r\n\r\n## \u6ce8\u610f\u4e8b\u9879\r\n\r\n1. HTTPS \u62e6\u622a\u9700\u8981\u5b89\u88c5\u8bc1\u4e66\uff1a`app.install_cert_to_system()`\r\n2. \u9a71\u52a8\u6a21\u5f0f\u9700\u8981\u7ba1\u7406\u5458\u6743\u9650\uff08\u4ec5 Windows\uff09\r\n3. NFAPI \u9a71\u52a8\u5728 Windows 7 \u4e0a\u9700\u8981 KB3033929 \u8865\u4e01\r\n4. Proxifier \u9a71\u52a8\u4e0d\u652f\u6301 UDP \u548c 32 \u4f4d\u7cfb\u7edf\r\n5. Linux \u548c macOS \u7248\u672c\u9700\u8981\u76f8\u5e94\u7684\u5171\u4eab\u5e93\u6587\u4ef6\uff08.so \u6216 .dylib\uff09\r\n6. \u8de8\u5e73\u53f0\u652f\u6301\uff1a\u4ee3\u7801\u4f1a\u81ea\u52a8\u68c0\u6d4b\u64cd\u4f5c\u7cfb\u7edf\u5e76\u52a0\u8f7d\u5bf9\u5e94\u7684\u5e93\u6587\u4ef6\r\n\r\n## \u8bb8\u53ef\u8bc1\r\n\r\nMIT License\r\n\r\n## \u8054\u7cfb\u65b9\u5f0f\r\n\r\n- QQ \u7fa4: 751406884\r\n\r\n## \u66f4\u65b0\u65e5\u5fd7\r\n\r\n### v1.3.3 (2025-10-20)\r\n- \ud83d\ude80 **\u65b0\u589e GitHub \u955c\u50cf\u52a0\u901f\u652f\u6301**\uff08\u89e3\u51b3\u56fd\u5185\u4e0b\u8f7d\u95ee\u9898\uff09\r\n- \ud83d\udcca **\u6539\u8fdb\u4e0b\u8f7d\u8fdb\u5ea6\u663e\u793a**\uff08\u663e\u793a\u8fdb\u5ea6\u6761\u548c\u6587\u4ef6\u5927\u5c0f\uff09\r\n- \ud83d\udd04 **\u81ea\u52a8\u5207\u6362\u955c\u50cf\u6e90**\uff08\u652f\u6301 6 \u4e2a\u955c\u50cf\u7ad9\uff0c\u81ea\u52a8\u91cd\u8bd5\uff09\r\n- \u26a1 **\u4f18\u5316\u4e0b\u8f7d\u4f53\u9a8c**\uff08\u66f4\u5feb\u3001\u66f4\u7a33\u5b9a\uff09\r\n- \ud83d\udca1 **\u66f4\u53cb\u597d\u7684\u9519\u8bef\u63d0\u793a**\uff08\u63d0\u4f9b\u624b\u52a8\u4e0b\u8f7d\u6307\u5f15\uff09\r\n\r\n### v1.3.2 (2025-10-20)\r\n- \ud83d\udc1b **\u4fee\u590d CLI \u6a21\u5757\u5faa\u73af\u4f9d\u8d56\u95ee\u9898**\r\n- \u2705 CLI \u5de5\u5177\u53ef\u72ec\u7acb\u8fd0\u884c\uff0c\u4e0d\u89e6\u53d1 DLL \u52a0\u8f7d\r\n\r\n### v1.3.1 (2025-10-20)\r\n- \ud83d\udc1b **\u4fee\u590d\u547d\u4ee4\u884c\u5de5\u5177\u52a0\u8f7d\u95ee\u9898**\r\n- \u2705 \u4f18\u5316\u5e93\u6587\u4ef6\u5ef6\u8fdf\u52a0\u8f7d\u673a\u5236\r\n- \ud83d\udd27 \u4fee\u590d `pyproject.toml` \u914d\u7f6e\uff0c\u786e\u4fdd\u547d\u4ee4\u884c\u5de5\u5177\u6b63\u786e\u5b89\u88c5\r\n- \ud83d\udca1 \u6539\u8fdb\u9519\u8bef\u63d0\u793a\uff0c\u5f15\u5bfc\u7528\u6237\u4f7f\u7528 `sunnynet install`\r\n\r\n### v1.3.0 (2025-10-20)\r\n- \ud83c\udfaf **\u65b0\u589e CLI \u547d\u4ee4\u884c\u5de5\u5177**\uff08\u7c7b\u4f3c Playwright\uff09\r\n- \u2728 \u652f\u6301 `sunnynet install` \u5168\u5c40\u5b89\u88c5\u5e93\u6587\u4ef6\r\n- \ud83c\udf0d \u5e93\u6587\u4ef6\u5168\u5c40\u53ef\u7528\uff0c\u6240\u6709\u9879\u76ee\u5171\u4eab\r\n- \ud83d\udccd Windows: `%APPDATA%\\SunnyNet\\lib`\r\n- \ud83d\udccd Linux/Mac: `~/.sunnynet/lib`\r\n- \ud83d\udd0d \u65b0\u589e `sunnynet info` \u67e5\u770b\u5b89\u88c5\u72b6\u6001\r\n\r\n### v1.2.0 (2025-10-20)\r\n- \ud83d\ude80 **\u4f7f\u7528 GitHub Releases \u4e0b\u8f7d\u5e93\u6587\u4ef6**\uff08\u65e0\u6587\u4ef6\u5927\u5c0f\u9650\u5236\uff09\r\n- \u2705 \u5b8c\u6574\u652f\u6301 Windows \u548c Linux \u5e73\u53f0\u81ea\u52a8\u4e0b\u8f7d\r\n- \ud83d\udd27 \u4f18\u5316\u4e0b\u8f7d\u811a\u672c\uff0c\u652f\u6301\u6587\u4ef6\u81ea\u52a8\u91cd\u547d\u540d\r\n- \ud83d\udce6 \u6539\u8fdb\u5927\u6587\u4ef6\u4e0b\u8f7d\u4f53\u9a8c\r\n- \ud83d\udc1b \u4fee\u590d jsDelivr CDN \u6587\u4ef6\u5927\u5c0f\u9650\u5236\u95ee\u9898\r\n\r\n### v1.1.0 (2025-10-20)\r\n- \u2728 \u65b0\u589e\u8de8\u5e73\u53f0\u652f\u6301\uff08Windows\u3001Linux\u3001macOS\uff09\r\n- \ud83d\udd27 \u81ea\u52a8\u68c0\u6d4b\u64cd\u4f5c\u7cfb\u7edf\u5e76\u52a0\u8f7d\u5bf9\u5e94\u7684\u5e93\u6587\u4ef6\r\n- \ud83d\udcdd \u4f18\u5316\u9519\u8bef\u63d0\u793a\uff0c\u663e\u793a\u8be6\u7ec6\u7684\u5e73\u53f0\u548c\u8def\u5f84\u4fe1\u606f\r\n- \ud83d\udc1b \u4fee\u590d\u5e93\u6587\u4ef6\u8def\u5f84\u67e5\u627e\u903b\u8f91\r\n- \ud83d\udcda \u66f4\u65b0\u6587\u6863\uff0c\u6dfb\u52a0\u8de8\u5e73\u53f0\u4f7f\u7528\u8bf4\u660e\r\n\r\n### v1.0.0 (2025-04-13)\r\n- \u9996\u6b21\u53d1\u5e03\r\n- \u652f\u6301 HTTP/HTTPS\u3001TCP\u3001UDP\u3001WebSocket\r\n- \u652f\u6301\u8fdb\u7a0b\u8fc7\u6ee4\r\n- \u652f\u6301\u9a71\u52a8\u6a21\u5f0f\r\n- \u652f\u6301 JA3 \u6307\u7eb9\u4f2a\u88c5\r\n\r\n",
"bugtrack_url": null,
"license": null,
"summary": "SunnyNet\u7f51\u7edc\u4e2d\u95f4\u4ef6 - \u5f3a\u5927\u7684\u7f51\u7edc\u4ee3\u7406\u548c\u6293\u5305\u5de5\u5177",
"version": "1.5.18",
"project_urls": {
"Bug Reports": "https://github.com/yourusername/SunnyNet/issues",
"Homepage": "https://github.com/yourusername/SunnyNet",
"Source": "https://github.com/yourusername/SunnyNet"
},
"split_keywords": [
"network",
" proxy",
" middleware",
" http",
" tcp",
" udp",
" websocket"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "db12b5807de3593d3050ebe604ab27242c03a9110f0249455cd35d8e60e155b8",
"md5": "9b69f5e29a30562c5a8899f99e653de6",
"sha256": "77dc709e5b35e6238e46f1574ef844c50d8510c06e5c2a6d5d662f7c3453267c"
},
"downloads": -1,
"filename": "sunnynet-1.5.18-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9b69f5e29a30562c5a8899f99e653de6",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 14967690,
"upload_time": "2025-10-22T04:27:39",
"upload_time_iso_8601": "2025-10-22T04:27:39.545501Z",
"url": "https://files.pythonhosted.org/packages/db/12/b5807de3593d3050ebe604ab27242c03a9110f0249455cd35d8e60e155b8/sunnynet-1.5.18-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4708cc78a2498703bcf9d9a96b82c57018f96bd27d534bff1f37c1c4a3a19464",
"md5": "ba1efeb88e9cf8a81937a227cb9cda98",
"sha256": "e72acc449ffac5c2765a0ba6cffb72919881fd2e27fddc551f67640ca46b24e5"
},
"downloads": -1,
"filename": "sunnynet-1.5.18.tar.gz",
"has_sig": false,
"md5_digest": "ba1efeb88e9cf8a81937a227cb9cda98",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 14886607,
"upload_time": "2025-10-22T04:27:42",
"upload_time_iso_8601": "2025-10-22T04:27:42.505985Z",
"url": "https://files.pythonhosted.org/packages/47/08/cc78a2498703bcf9d9a96b82c57018f96bd27d534bff1f37c1c4a3a19464/sunnynet-1.5.18.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-22 04:27:42",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "yourusername",
"github_project": "SunnyNet",
"github_not_found": true,
"lcname": "sunnynet"
}