Rust winsafe 原生 Win32 Windows 10+ 单文件免安装

网页模板与整站克隆,一条命令完成

WebClone(Rust 版)是 C# + WPF 版 WebClone 的 1:1 复刻:图形界面走 winsafe 原生 Win32 控件,不引入任何 UI 框架;命令行版与 C# 版完全同参。从单个页面到整站递归,把网页离线搬回本地。

2
克隆模式
3.3 MB
单文件 exe
59
条 GUI 断言
Win10+
官方保证
WebClone — 图形界面(winsafe 原生控件)
WebClone 图形界面截图:克隆标签页包含网址输入、克隆模式、递归深度、保存位置、网络代理与下载选项等配置区
图形界面 · 原生控件 · 配置自动记忆到 webclone-gui.json
两种模式

以 wget 的语义为基准

两种模式对应 wget 的两种经典用法,行为边界清晰:单页模板只抓当前页面及其引用资源,整站克隆按 -np 语义递归追踪站内链接、绝不越界到上级目录。

单页模板

只抓当前页与它引用的资源,不递归 a 链接。适合快速归档落地页、设计稿与单篇文章。

# 等价 wget
wget -r -E -np -c -k --ignore-tags=a <url>
CLI 模式参数:-m single

整站克隆

递归追踪站内链接(不向上级目录),把全站页面与资源完整搬回本地。

# 等价 wget
wget -r -np -c -k <url>
CLI 模式参数:-m full
核心特性

为「离线保存网页」认真做的细节

核心引擎 webclone-core 为纯 Rust 实现,AOT 友好、零反射;解析器、编码识别、路径映射全部自研,不依赖任何 HTML 库。

增量与断点续传

二进制资源用 ETag / 304 跳过未变更;中断的下载用 Range + If-Range 续传;一律先写 .part 再原子改名,不留残缺成品。

编码智能识别

按 BOM → HTTP charset → meta charset → 严格 UTF-8 嗅探 → GB18030 兜底识别,统一转 UTF-8 保存并改写编码声明,GBK 页面不乱码。

自研解析器

HTML / CSS 扫描器为零依赖状态机,记录原文下标原地替换;覆盖 link、script、img、srcset、video、iframe、内联 style、@import、@font-face 与 data-src 懒加载。

路径与类型归一

所有资源引用改写为相对路径,跨域 CDN 按各自域名归档;下载完成后按真实 Content-Type 修正扩展名,无扩展名的动态样式表也能正确存为 .css。

HTTP / SOCKS5 双模代理

SOCKS5 走 socks5h 语义,域名交给代理解析,与 C# 版手写 RFC 1928 行为一致;支持用户名密码认证。

重定向归一

下载时跟随服务端重定向,最终地址与请求地址共享同一本地文件;整站克隆不会因 /doc 与 /doc/ 的写法差异存出两份。

自定义浏览器 UA

GUI「下载选项」新增自定义 UA 复选框(默认预填 Edge 的 UA),CLI 用 --user-agent 对应;测试服务器会记录收到的 UA 验证真的生效。

单文件免安装

CLI 与 GUI 各是一个独立 exe(约 3.3 / 3.4 MB),Rust 直接编成机器码,不需要 .NET 或任何运行库,拷到别的机器直接能跑。

快速上手

命令行,即拿即用

命令行版 bin 名 webclone,与 C# 版参数完全一致;退出码 0 成功、1 有失败项、2 参数错误、3 未处理异常、130 用户取消。

webclone-cli — 常用命令
# 单页模板:抓取页面及其引用的全部资源 webclone https://example.com -o D:\site # 整站递归:深度 3,并发 16 webclone https://example.com -m full -d 3 -c 16 -o D:\site # SOCKS5 代理(域名交给代理解析,支持 user:pass) webclone https://example.com --proxy socks5://user:pass@127.0.0.1:1080 # 自定义浏览器 UA webclone https://example.com --user-agent "Mozilla/5.0 (…) Edg/126.0.0.0"

常用选项

-m single | full克隆模式:单页模板 / 整站递归
-o 目录输出目录
-d 深度整站递归深度
-c 并发并发下载数
--proxyHTTP(S) / SOCKS5 代理地址
--user-agent自定义浏览器 UA
--no-cross-origin不抓取跨域 CDN 资源
--no-incremental关闭增量下载
--ignore-cert-errors忽略 HTTPS 证书错误
-v详细日志

更多选项(--max-pages、--timeout、--retry、--keep-absolute、--keep-external-links 等)见项目 README。

项目结构

workspace 拆分,核心引擎与界面解耦

webclone-core 的模块划分刻意与 C# 版 WebClone.Core 一一对应,方便对照阅读;GUI 层约 1500 行,核心引擎不受界面影响。

webclone-rs/ ├── Cargo.toml # workspace 定义 ├── build.ps1 / build.sh # 一键构建 ├── assets/app.ico # 程序图标(6 尺寸) ├── build/embed_icon.rs # 图标嵌入共用逻辑 ├── crates/ │ ├── webclone-core/ # 核心引擎(纯 Rust) │ ├── webclone-cli/ # 命令行版(webclone) │ └── webclone-gui/ # winsafe 原生 Win32 └── tests/ ├── make_test_site.py # 验证站点(含 GBK) ├── test_server.py # ETag/304/Range ├── test_proxy.py # HTTP/SOCKS5 代理 ├── regression.ps1 # CLI 回归(6 场景) ├── gui_probe.py # GUI 探针(59 断言) └── check_icon.py # 图标 / 版本校验

与 C# 版一一对应

Rust 模块与 C# 版 WebClone.Core 的类逐一对应,迁移对照阅读零成本。

C# 版Rust 版
CloneEngine.csengine.rs
CloneOptions.cs / ProxySettings.csoptions.rs
Net/ResourceDownloader.csnet/downloader.rs
Parse/HtmlScanner.csparse/html_scanner.rs
Storage/PathMapper.csstorage/path_mapper.rs
Text/EncodingDetector.cstext/encoding.rs
测试质量

用探针、截图与逐字节校验说话

自动化测试覆盖 CLI 与 GUI 两条链路,GUI 探针用 ctypes + PIL 直接操作真实窗口,在沙箱隔离环境下验证行为而非只读状态。

6
CLI 一键回归场景(单页 / 增量 / 整站 / -np 越界 / GBK / UA)
59
GUI 探针断言,分「首次运行 50 条 + 配置恢复 9 条」两阶段
0.00%
切页重绘像素差异(修复前 20.89%,修复后 0.00%)
1:1
exe 内嵌图标与 app.ico 逐字节比对校验

可复现的验证体系

测试基础设施齐备:make_test_site.py 生成含 GBK 页面、查询参数资源、CSS 嵌套引用的验证站点;test_server.py 支持 ETag / 304 / Range 续传;test_proxy.py 提供 HTTP / SOCKS5 双模代理;ua_server.py 记录收到的 UA。

GUI 冒烟在沙箱目录运行,配置写在 exe 同目录,测试与用户配置双向隔离;图标校验用自研的零依赖 PE 资源解析器逐图层比对。

README 沉淀的 5 个 Win32 深坑

  • 01
    切页重影空心分组框撞上 WS_CLIPCHILDREN,接管 WM_ERASEBKGND + RedrawWindow 修复
  • 02
    回车被 IsDialogMessage 吃掉WM_GETDLGCODE 里对回车回 DLGC_WANTMESSAGE 放行
  • 03
    子类化安装时机必须等 WM_CREATE 之后 HWND 真正存在再 SetWindowSubclass
  • 04
    端口输入框与微调是双窗口禁用必须同时作用于 Edit 与 UpDown
  • 05
    单选回填「两个同时选中」程序化设置必须走 select_radio_only,BM_SETCHECK 不会取消同组兄弟
系统要求与构建

Windows 10 起,零运行库

最低支持平台是 Rust 工具链的硬口径而非项目取舍;Rust 1.78+ 起官方最低支持 Windows 10,本项目由 rustc 1.97.1 构建。

系统要求

  • Windows 10 及以上(x64),官方保证
  • TLS 走系统 Schannel,无需额外配置
  • 不需要 .NET 或任何运行库
  • 需要 Rust 1.75+ 才能构建(实测 1.97.1)

发布产物

  • dist/webclone.exe — 命令行版,约 3.3 MB
  • dist/WebClone-GUI.exe — 图形界面版,约 3.4 MB
  • 均为独立单文件,拷贝即用
  • GUI 配置存 exe 同目录 webclone-gui.json,与 C# 版可互读

一键构建

# Windows 上优先用 PowerShell .\build.ps1 # CLI + GUI .\build.ps1 -SkipGui # 只构建命令行版 .\build.ps1 -SkipCli # 只构建图形界面版 .\build.ps1 -Clean # 先清 dist\ 与 target\

克隆任意网页,从一条命令开始

Rust + winsafe 1:1 复刻 · 原生 Win32 界面 · 与 C# 版完全同参