一个 Windows 桌面版的 IP 优选测速工具(Python + PySide6)。
到 Releases 页面 下载
IP-Optimizer-V1.4.2.exe(约 36 MB,Windows 10 / 11 64 位)。 双击即用,不需要安装 Python、不需要pip install。 运行后的日志与导出结果在 exe 同级的logs\与output\目录里。 完整说明见 第 16 章 下载可执行文件(免安装版)。
当前已包含的功能(自动获取 IP + 三级测速 + 综合评分排名 + 稳定性复测):
TXT / 粘贴 / 自动获取 Cloudflare IP → IP 验证 → TCP 测速 → HTTP 测速 → 下载测速 → 并发测速 → 综合评分排名(TOP100 / 筛选) → 稳定性复测(多轮重测) → 界面显示结果 → 一键复制 / 导出 → 支持中途停止
V1.1 新增:自动获取更多 IP——软件自动请求 Cloudflare 官方公开 IPv4 网段(CIDR), 从网段中随机抽取候选 IP(不会遍历整个网段),自动去重、过滤后加入当前 IP 列表。
V1.2 新增:TCP → HTTP → 下载 三级测速流程——
- TCP 443 握手测延迟(V1.1 已有);
- TCP 通过后发起 HTTPS 请求,测 HTTP 状态码与响应延迟;
- HTTP 通过后下载固定大小数据(默认 1 MB),统计下载速度。
三个阶段逐级瀑布:前一级失败,后面的阶段自动跳过,不浪费流量与时间。
V1.3 新增:综合评分 / 排名 / 筛选 / 一键复制 / 导出—— 测速结束后所有成功 IP 得到 0~100 的综合评分并按评分排名,可筛选最低速度与最大延迟、 只看 TOP10/20/50/100,一键复制或导出 TXT / CSV。
V1.4 新增:稳定性复测——对 V1.3 排名中的 TOP IP 重复测试多轮(默认 5 轮), 统计成功率与波动(变异系数 CV),算出每个 IP 的稳定性评分与最终评分:
最终评分 = V1.3 综合评分 × 0.9 + 稳定性评分 × 0.1
复测后表格按最终评分重新排名,「一次快、多次抖」的 IP 会被排到后面, 稳定可用的 IP 排到前面;V1.3 的评分与排名完全保留(表格里仍能看到)。
| 项目 | 说明 |
|---|---|
| 名称 | 数码解码 IP 优选器 V1.4 |
| 类型 | Windows 桌面软件(GUI) |
| 用途 | 批量导入 IP,通过 TCP → HTTP → 下载 三级测速 + 稳定性复测找出又快又稳的 IP |
| 测速方式 | 三级流水:TCP 握手(默认 443 / 1000ms)→ HTTPS 连通(默认 3000ms)→ 下载 1MB(默认 10000ms) |
| 并发方式 | asyncio 异步并发,默认并发 50,最多 500 |
| 数据存储 | 不联网上传、不使用数据库、不收集个人信息 |
第一阶段不使用:MySQL、Redis、Docker、Web 服务器、用户系统、账号登录、会员系统。 所有功能都在本机运行,不会修改系统网络设置、不会修改 DNS。
- Python 3.12 或更高版本(3.12 / 3.13 均可)
- Windows 10 / Windows 11
检查是否安装成功(在终端执行):
python --version正常应输出:Python 3.12.x
⚠️ 如果提示「不是内部或外部命令」,或者显示的是 Windows 应用商店的提示, 说明没有安装真正的 Python,请到 https://www.python.org/downloads/windows/ 下载并安装(安装时务必勾选 Add python.exe to PATH)。
- 打开官网 https://www.python.org/downloads/windows/
- 下载 Python 3.12 的
Windows installer (64-bit) - 安装时勾选 Add python.exe to PATH
- 安装完成后重新打开终端,执行
python --version验证
在项目根目录(也就是本 README 所在的目录)打开终端,执行:
python -m pip install -r requirements.txt建议(可选)先创建虚拟环境:
python -m venv .venv .venv\Scripts\activate python -m pip install -r requirements.txt
第一阶段只安装一个第三方依赖:
| 依赖 | 用途 |
|---|---|
PySide6 |
桌面界面(GUI) |
下载太慢怎么办? 完整的
PySide6安装包约 250MB(包含大量本项目用不到的高级模块)。 如果下载很慢或经常中断,可以把requirements.txt里的PySide6>=6.6.0换成官方精简版PySide6-Essentials>=6.6.0(约 80MB):python -m pip install "PySide6-Essentials>=6.6.0"两者的导入方式完全一样(都是
from PySide6.QtWidgets import ...),本项目都能正常运行。
其余功能全部使用 Python 标准库,不需要额外安装:
asyncio:异步并发socket:TCP 连接测试ipaddress:IP 地址验证urllib.request:请求 Cloudflare 官方 API(自动使用系统代理)logging:日志pathlib:跨平台路径处理unittest:单元测试
直接双击项目根目录下的 run.bat 即可启动。
在项目根目录执行:
python main.py程序启动后:
- 日志会写入
logs/app.log - 主窗口标题为「数码解码 IP 优选器 V1.2」
想快速体验,可以在 IP 来源 区域点击【选择IP文件】, 选中项目里的示例文件
sample_ips.txt,再点【导入IP】即可。 这个示例文件里故意混入了非法 IP、私有 IP、回环地址、IPv6 和重复行, 用来演示程序的自动过滤与统计功能。
- 用 VS Code 打开项目根目录(也就是本 README 所在目录)
- 安装 VS Code 扩展:Python(Microsoft 出品)
- 按
Ctrl + Shift + P,输入并选择 Python: Select Interpreter - 选择已安装的 Python 3.12(路径类似
...\Programs\Python\Python312\python.exe) - 打开
main.py,按F5或点击右上角 ▶ 运行
⚠️ 一定要在项目根目录运行,否则会报
ModuleNotFoundError: No module named 'core'(因为core、gui、utils是按项目根目录导入的)。
界面上的 IP 来源 区域提供两种方式:
- 点击 【选择IP文件】,选择 TXT 文件
- 点击 【导入IP】,程序会导入文件内容
文件内容示例(每行一个):
104.16.0.1
104.16.0.2:443
104.16.0.3
支持 IP 和 IP:端口 两种写法;端口不写时使用界面上设置的端口。
- 在文本框中粘贴 IP(每行一个)
- 点击 【导入IP】(注意:如果已经选择了文件,会优先导入文件)
不想自己准备 IP?点击 【自动获取IP】,软件会自动拿到一批公网候选 IP:
- 在弹出的对话框中选择 候选IP数量(100 / 500 / 1000 / 3000 / 5000 / 10000,默认 1000)
- 点击 【开始获取】
- 软件请求 Cloudflare 官方公开接口(
https://api.cloudflare.com/client/v4/ips)拿到官方 IPv4 网段(CIDR) - 从这些网段中随机抽取指定数量的 IPv4(按需生成,不会遍历整个网段)
- 自动去重、自动过滤(私有 / 回环 / 非法地址)
- 新 IP 追加加入当前 IP 列表(界面上「读取数量 / 有效IP」等统计随之更新)
- 获取完成后不会自动开始测速,需要你自己点击 【开始测速】
获取完成后,对话框和界面会显示:
IP来源:Cloudflare 官方
CIDR数量:15
候选IP:1000
有效IP:1000
重复IP:0
获取耗时:0.8 秒
对话框里有一个 【测试Cloudflare连接】 按钮。它只测试能不能连上 Cloudflare 官方接口, 不会生成任何 IP:
- 点击 【测试Cloudflare连接】
- 成功时状态栏显示:
状态:Cloudflare API 连接正常(HTTP 200,IPv4 CIDR 15 个,耗时 759 ms,来源:主源(JSON API)) - 失败时显示具体原因(中文 + 真实错误),例如:
连接失败:网络连接错误(本机配置了系统代理 127.0.0.1:1819:请确认代理软件已启动) 连接失败:HTTP 状态码:503 连接失败:网络连接超时
重要:本程序会自动使用系统代理(和浏览器一致)。 如果你本机装了代理软件(如 Clash / v2ray 等), 必须先启动代理软件,否则程序连不上 Cloudflare(这是最常见的失败原因)。 详细排查方法见下文「10. 常见错误」。
点击 【刷新IP】:用上次设置的候选数量重新请求 Cloudflare 网段、重新随机生成候选 IP, 并与当前列表自动去重(只会补充新 IP,不会产生重复)。同样不会自动开始测速。
⚠️ 重要说明:自动获取的 IP 来自 Cloudflare 官方公开 IPv4 网段,是「官方网段内的随机抽样」。 随机抽到的 IP 是否适合你当前的网络环境,需要实际测速确认——请以测速结果为准。
- 自动跳过空行和注释行(以
#、//、;开头) - 自动去重(同一个 IP + 同一个端口只保留一条)
- 自动过滤:非法 IP、IPv6、私有地址、回环地址、链路本地地址等
- 手动导入完成后会弹窗显示:
读取数量:1000
去重后数量:900
重复数量:100
格式错误:0
有效 IP:850
无效 IP:150
数量关系:
读取数量 = 有效 IP + 重复数量 + 无效 IP
- 在 测速设置 中填写:
- 端口:默认
443 - 并发:默认
50(范围 1 ~ 500) - 超时:默认
1000 ms(范围 100 ~ 60000,TCP 阶段使用) - HTTP 测试:勾选后进行 HTTPS 连通性测试,超时默认
3000 ms(V1.2 新增) - 下载测试:勾选后下载固定大小数据测速度,大小默认
1 MB、超时默认10000 ms(V1.2 新增)
- 端口:默认
- 点击 【开始测速】
- 观察 测试进度 区域:进度条、已测试 / 成功 / 失败 / 用时,以及三行阶段统计:
TCP 成功 X / 失败 YHTTP 成功 X / 失败 Y / 未测试 Z(未测试 = TCP 失败而被跳过的数量)下载 成功 X / 失败 Y / 未测试 Z(未测试 = TCP 或 HTTP 失败而被跳过的数量)
- 测速过程中界面不会卡死,可以继续拖动窗口
- 测速结束后,结果表格按综合评分排名显示(V1.3):评分高的在前,失败 IP 在最后
- (V1.4 可选) 想进一步确认「是不是一直都快」,再做一次稳定性复测(见下一节)
- 点击表头也可以手动排序(数字列按真实数值排序,不是按文字排序)
每个 IP 依次执行三个阶段,前一级失败则后面的阶段自动跳过:
TCP 443 握手(1000 ms)
↓ 通过
HTTPS 请求 /__down?bytes=0(3000 ms,验证 HTTP 层可用,几乎不消耗流量)
↓ 通过
HTTPS 下载 /__down?bytes=1048576(10000 ms,统计下载速度)
- HTTPS 请求的 SNI 与 Host 均使用
speed.cloudflare.com(Cloudflare 官方测速域名), 因此对 Cloudflare IP 段的测速结果最准确; - 端口 443 / 2053 / 2083 / 2087 / 2096 / 8443 走 HTTPS, 80 / 8080 / 8880 / 2052 / 2082 / 2086 / 2095 走明文 HTTP;
- 下载测试独立发起新连接(不复用 HTTP 测试的连接),每次测速都是完整真实的一次请求。
只有下载测速成功的 IP 才参与评分(0 ~ 100 分),公式在 core/score.py:
| 指标 | 权重 | 方向 | 说明 |
|---|---|---|---|
| TCP 延迟 | 25% | 越低越好 | ≤50ms 满分,≥1000ms 0 分 |
| HTTP 延迟 | 20% | 越低越好 | ≤100ms 满分,≥3000ms 0 分 |
| 下载速度 | 45% | 越高越好 | ≥5MB/s 满分,≤10KB/s 0 分 |
| 稳定性 | 10% | — | V1.4 起由稳定性复测的真实数据参与(见下一节),未复测时以「HTTP 拿到正常状态码」兜底 |
- 每项先对数归一化再加权,避免一个极端高速 IP 把其他 IP 全部压成低分;
- 排名规则(
core/ranking.py):成功 IP 按评分降序 → 评分相同比下载速度 → 再相同比 TCP 延迟; 失败 IP 永远排在最后且不占名次; - 结果区上方可按 最低速度 / 最大TCP延迟 筛选,显示 下拉框切换 TOP 10 / 20 / 50 / 100 (默认 TOP 100,有效 IP 不足时显示全部),改完点 【应用筛选】 立即重新排名。
测速结束后,结果区下方出现 稳定性复测 区域:对当前 V1.3 排名里评分有效的 TOP IP 再重复测试多轮,用真实的多次结果判断「这个 IP 是不是一直都快」。
| 选项 | 可选值 | 默认 | 说明 |
|---|---|---|---|
| 复测轮数 | 3 / 5 / 10 次 | 5 次 | 每个 IP 重复测几次;次数越多结论越稳,用时越长 |
| 复测并发 | 10 / 20 / 50 | 20 | 复测时同时测试几个 IP;越大越快,对网络压力越大 |
操作步骤:
- 先完成一次测速(得到 V1.3 排名);
- 在 稳定性复测 里选好轮数与并发,点 【开始复测】(测速中或没有有效 IP 时按钮是灰的);
- 观察进度条与状态行:
第 X/Y 轮,已测 a/b、当前:IP; - 复测中可随时点 【停止复测】,已完成的轮次结果会被保留并参与最终排名;
- 复测结束后表格按最终评分重新排名,弹窗显示稳定 IP 数量、平均稳定性、最高最终评分与 TOP10。
稳定性评分(0 ~ 100),公式在 core/stability.py:
| 指标 | 满分 | 说明 |
|---|---|---|
| TCP 成功率 | 20 分 | 多轮里 TCP 连上的比例 |
| HTTP 成功率 | 20 分 | 多轮里 HTTP 正常响应的比例 |
| 下载成功率 | 20 分 | 多轮里下载成功的比例 |
| TCP 延迟稳定 | 20 分 | 变异系数 CV ≤ 15% 满分,≥ 60% 0 分 |
| 下载速度稳定 | 20 分 | 变异系数 CV ≤ 20% 满分,≥ 100% 0 分 |
波动用 变异系数 CV = 标准差 ÷ 平均值 衡量:CV 越小说明每轮结果越接近,也就是越稳定。 只有 1 轮数据时无法计算波动,表格里显示
--。
最终评分与最终排名:
最终评分 = V1.3 综合评分 × 0.9 + 稳定性评分 × 0.1
- 排名规则(
core/ranking.py):按最终评分降序 → 再比稳定性评分 → 再比 V1.3 综合评分; - V1.3 的评分与排名完全保留:表格里
排名/综合评分两列仍是 V1.3 的值, 复测结果放在稳定性/最终评分/最终排名等新列里; - 复测只覆盖 TOP 集合,因此复测后表格只显示参与复测的 IP(按最终名次排列);
- 一旦重新点【应用筛选】或重新测速,旧的复测结果就会失效(需要重新复测)。
复测完成后,稳定性区域出现 2 个按钮:
| 按钮 | 作用 |
|---|---|
| 【导出稳定TOP TXT】 | 按最终排名取前 100 的 IP 保存到 output\IP优选_稳定TOP100_日期时间.txt(每行一个) |
| 【导出稳定性CSV】 | 保存完整复测统计到 output\IP优选_稳定性结果_日期时间.csv(含轮数/各阶段成功率/CV/稳定性评分/最终评分/最终排名) |
V1.4 起,【复制TOP10/50/100】在复测完成后会优先按最终排名复制(稳定者优先)。
测速结束后结果区下方会出现 5 个按钮:
| 按钮 | 作用 |
|---|---|
| 【复制TOP10】/【复制TOP50】/【复制TOP100】 | 把前 N 名 IP 复制到剪贴板,每行一个、不带其他文字 |
| 【导出TXT】 | 保存 TOP100 到 output\IP优选_TOP100_日期时间.txt(每行一个 IP) |
| 【导出CSV】 | 保存完整结果到 output\IP优选_结果_日期时间.csv(含排名/延迟/状态/评分,UTF-8-BOM 编码,Excel 直接打开不乱码) |
测速结束后表格下方显示一行摘要:
有效IP | 最快速度 | 平均速度 | 最低延迟 | 平均TCP延迟 | 平均HTTP延迟 | TOP1(评分)
复测完成后,稳定性区域下方还会多显示一行复测摘要:
稳定IP | 波动IP | 平均稳定性 | 最高最终评分 | TOP10(稳定性评分 ≥ 60 视为「稳定」)。
- 测速过程中点 【停止测速】:不再创建新任务,正在进行的连接安全结束,已得到的结果保留并显示;
- 复测过程中点 【停止复测】:已完成的轮次结果保留,并据此生成最终排名;
- 两种情况按钮状态都会自动恢复,可以重新测速 / 重新复测。
| 字段 | 说明 |
|---|---|
| 排名 | 综合排名(V1.3);测速中或失败显示 -- |
| IP | 目标 IP |
| 端口 | 实际测试的端口 |
| TCP延迟 | TCP 握手耗时(毫秒);失败显示 -- |
| HTTP状态 | HTTP/HTTPS 响应状态码(如 200);未测试显示 -- |
| HTTP延迟 | 从发出请求到收到响应头的耗时(毫秒) |
| 下载速度 | 下载测速结果,如 1.25 MB/s;未测试显示 -- |
| 综合评分 | 0 ~ 100(V1.3);≥80 绿色、≥50 橙色、其余红色;无评分显示 -- |
| 稳定性 | 0 ~ 100(V1.4,多轮复测得出);≥80 绿色、≥50 橙色、其余红色;未复测显示 -- |
| TCP成功率 | 复测里 TCP 连上的比例(如 100%);无复测数据显示 -- |
| HTTP成功率 | 复测里 HTTP 正常响应的比例;无复测数据显示 -- |
| 下载成功率 | 复测里下载成功的比例;无复测数据显示 -- |
| TCP波动 | TCP 延迟的变异系数(如 ±8%);轮数不足 2 无法计算时显示 -- |
| 下载波动 | 下载速度的变异系数;轮数不足 2 无法计算时显示 -- |
| 最终评分 | V1.3综合评分 × 0.9 + 稳定性 × 0.1(V1.4);未复测显示 -- |
| 最终排名 | 按最终评分排出的名次(V1.4);未复测显示 -- |
| 状态 | 全部成功 / HTTP失败(原因) / TCP失败(原因) |
鼠标悬停在 IP 上可以看到失败的具体原因;复测后悬停还会显示 V1.3 评分、稳定性评分、复测轮数与 TCP 延迟区间。
ip-optimizer/ (项目根目录,也就是本文件所在目录)
│
├── main.py 程序入口:创建日志、启动界面
├── run.bat 双击启动脚本(Windows 便捷入口)
├── requirements.txt 依赖清单(只有 PySide6)
├── README.md 说明文档
├── sample_ips.txt 示例 IP 列表(含无效数据,用于试用)
├── .gitignore Git 忽略规则
│
├── core/ 核心业务逻辑(与界面无关)
│ ├── __init__.py
│ ├── cloudflare_source.py 请求 Cloudflare 官方 API 获取 IPv4 CIDR(urllib + 超时)
│ ├── cidr_generator.py 从 CIDR 随机抽取候选 IP(按需生成、去重、过滤)
│ ├── ip_loader.py IP 导入:读文件 / 解析文本 / 去重
│ ├── ip_validator.py IP 验证:过滤非法、私有、回环、IPv6 + 统计
│ ├── tcp_tester.py 单个 IP 的 TCP 连接测速
│ ├── http_tester.py HTTP/HTTPS 连通性 + 下载测速(V1.2 新增)
│ ├── score.py 综合评分公式(V1.3 新增)
│ ├── ranking.py 综合排名 / 筛选 / 最终排名(V1.3 新增,V1.4 扩展 build_final_ranking)
│ ├── stability.py 稳定性统计与评分:成功率 + 变异系数 CV(V1.4 新增)
│ └── scanner.py 并发调度、三级流水、进度统计、停止控制、结果排序
│
├── gui/ 界面层(PySide6)
│ ├── __init__.py
│ ├── fetch_dialog.py 「自动获取IP」设置与状态对话框
│ ├── fetch_worker.py 自动获取后台线程(QThread,网络不阻塞界面)
│ ├── main_window.py 主窗口:布局、交互、进度显示、稳定性复测交互
│ ├── ip_panel.py IP 来源面板:选文件 / 粘贴 / 导入 / 统计
│ ├── result_table.py 结果表格控件(含数字排序、颜色标记、复测列)
│ ├── scan_worker.py 测速线程(QThread + asyncio,避免界面卡死)
│ └── stability_worker.py 稳定性复测线程(多轮重复测速,V1.4 新增)
│
├── utils/ 通用工具
│ ├── __init__.py
│ ├── export.py TXT / CSV 导出(V1.3 新增,V1.4 增加稳定性导出)
│ └── logger.py 日志:logs/app.log
│
├── tests/ 单元测试(标准库 unittest)
│ ├── test_ip_loader.py
│ ├── test_ip_validator.py
│ ├── test_cidr_generator.py CIDR 随机生成:数量 / 去重 / 过滤 / 非法 CIDR
│ ├── test_cloudflare_source.py API 获取:正常返回 / HTTP 错误 / 超时 / JSON 错误(mock,不依赖真实网络)
│ ├── test_http_tester.py HTTP/下载(V1.2):状态码 / 404 / 超时 / 速度统计(mock,不依赖真实网络)
│ ├── test_score.py 综合评分(V1.3):各指标归一化与权重
│ ├── test_ranking.py 综合排名 / 筛选 / 最终排名(V1.3、V1.4)
│ ├── test_export.py TXT / CSV 导出内容与编码(V1.3、V1.4)
│ └── test_stability.py 稳定性统计与评分:成功率 / CV / 满轮与部分轮(V1.4)
│
├── assets/ 资源目录(第一阶段为空)
├── output/ 结果输出目录(留给后续阶段导出 CSV/JSON)
└── logs/ 运行日志(自动创建,已被 .gitignore 忽略)
└── app.log
说明:为了让文件不要太长、职责更单一(每个文件都不超过 500 行), 在
gui/里额外增加了ip_panel.py(IP 来源面板)、fetch_dialog.py/fetch_worker.py(自动获取)和scan_worker.py(测速线程),其余文件与设计一致。
在项目根目录执行全部单元测试:
python -m unittest discover -s tests -v只运行某一个测试文件:
python tests/test_ip_loader.py
python tests/test_ip_validator.py
python tests/test_cidr_generator.py
python tests/test_cloudflare_source.py
python tests/test_http_tester.py
python tests/test_score.py
python tests/test_ranking.py
python tests/test_export.py
python tests/test_stability.py测试内容:
- IP 读取:正常 IP、
IP:端口、空行、注释、重复 IP、格式错误、空文本、空文件 - 文件读取:UTF-8、带 BOM 的 UTF-8、GBK、文件不存在、传入目录
- IP 验证:正常 IPv4、非法 IPv4、私有 IPv4、
127.0.0.1、IPv6、组播、保留地址 - 导入统计:
读取数量 = 有效 + 重复 + 无效 - CIDR 随机生成:网段解析、按指定数量生成、不超过上限、去重、过滤私有/回环、排除已有 IP、非法 CIDR 容错
- Cloudflare API:正常返回、HTTP 错误、网络超时、JSON 解析失败、缺少
ipv4_cidrs(全部用 mock 模拟,单元测试不依赖真实网络) - HTTP / 下载测速(V1.2):TLS 握手、状态码解析、2xx/3xx 成功、404 失败、超时、下载字节数与速度统计、错误分类(本地 mock 服务器,不依赖真实网络)
- 综合评分(V1.3):各指标归一化、权重边界(满分 / 0 分 / 中间值)、评分范围 0~100
- 综合排名(V1.3 / V1.4):评分降序、同分比速度再比延迟、失败 IP 沉底不占名次、
筛选(最低速度 / 最大延迟)、TOP N 截断、
compute_final_score取整与边界 - 导出(V1.3 / V1.4):TXT 每行一个 IP、TOP N 截断、CSV 字段完整、UTF-8-BOM 编码、空列表不报错
- 稳定性(V1.4):成功率统计、变异系数 CV 计算、
_cv_score的满分/零分/中间值、 满轮与部分轮(停止复测)两种情况下的稳定性评分与最终排名(不依赖真实网络)
| 现象 | 原因 | 解决方法 |
|---|---|---|
python 不是内部或外部命令 |
没有安装 Python 或未加入 PATH | 重装 Python 并勾选 Add python.exe to PATH,然后重开终端 |
运行 python 打开了应用商店 |
系统中的“应用执行别名”占位程序 | 设置 → 应用 → 高级应用设置 → 应用执行别名 → 关闭 python.exe / python3.exe |
ModuleNotFoundError: No module named 'PySide6' |
没有安装依赖 | 执行 python -m pip install -r requirements.txt |
| 安装 PySide6 时下载很慢 / 中断 | 完整 PySide6 包较大 | 见上文「下载太慢怎么办」,改用 PySide6-Essentials |
ModuleNotFoundError: No module named 'core' |
没有在项目根目录运行 | 先 cd 到项目根目录,再执行 python main.py |
| 提示「IP 文件不存在」 | 文件被移动或删除 | 重新点击【选择IP文件】选择正确的文件 |
| 提示「文件编码无法识别」 | 文件是特殊编码 | 用记事本另存为 UTF-8 编码后重试 |
| 提示「没有可用的公网 IPv4 地址」 | 导入的 IP 都是私有 / 非法 / IPv6 | 检查导入内容,第一阶段只支持公网 IPv4 |
| 提示「网络连接错误(本机配置了系统代理 127.0.0.1:1819:请确认代理软件已启动)」 | 最常见:本机配了系统代理,但代理软件(Clash / v2ray 等)没启动或节点失效 | 启动代理软件并确认节点可用,然后再点【测试Cloudflare连接】 |
| 提示「网络连接错误」 | 没有网络、防火墙拦截、DNS 解析失败 | 检查网络后重试;仍失败可改用手动导入(不影响其他功能) |
| 提示「HTTP 状态码:XXX」 | Cloudflare 接口临时故障或被网络设备拦截(如 403 / 429 / 503) | 稍后重试;先点【测试Cloudflare连接】看具体状态码 |
| 提示「JSON 解析失败」 | 返回内容不是预期的 JSON(常见于被劫持或被安全网关替换页面) | 检查是否有网络劫持 / 公司网关;先点【测试Cloudflare连接】 |
| 提示「API 返回异常(缺少 ipv4_cidrs)」 | 接口返回格式变化 | 稍后重试;接口地址与数据格式见 Cloudflare 官方文档 |
| 提示「网络连接超时」 | 网络较慢、代理不通 | 稍后重试;先点【测试Cloudflare连接】;或先手动导入,不影响其他功能 |
全部显示 失败(timeout) |
网络不通、IP 不可用、超时太短 | 增大超时(如 2000~3000 ms),或更换可用 IP |
| 提示「连接被拒绝」 | 目标端口没有开放 | 换端口(常见 443 / 2053 / 8443)或换 IP |
部分行显示 HTTP失败(TLS握手失败…)(V1.2) |
少数 IP 的 TLS 握手异常(服务端拒绝、证书链不完整等) | 属正常现象;这部分 IP 已计入 HTTP 失败统计,可直接忽略或重测 |
下载速度列全部为 --(V1.2) |
未勾选【下载测试】,或全部 IP 都没通过 TCP / HTTP 阶段 | 勾选【下载测试】后重测;或先用更大超时重测 |
| 界面卡住不动 | 极少见(例如系统防火墙拦截大量连接) | 点击【停止测速】,降低并发(如 20)后重试 |
| 【开始复测】按钮是灰色(V1.4) | 还没测速、排名里没有「下载成功」的 IP,或正在测速 / 正在复测 | 先完成一次测速并确认有综合评分;等当前任务结束后再点 |
| 复测后表格只剩少量行(V1.4) | 复测只覆盖 V1.3 排名里的 TOP IP,表格就只显示这些 IP | 属正常现象;点【应用筛选】或重新测速可回到完整列表 |
复测后 稳定性 / 最终评分 全是 --(V1.4) |
复测没有拿到有效数据(全部超时 / 刚开始就被停止) | 检查网络后重试;或放宽 HTTP / 下载超时后再复测 |
TCP波动 / 下载波动 显示 --(V1.4) |
有效轮数不足 2 轮,无法计算变异系数 | 增加复测轮数(如 5 或 10 次)后重测 |
| 稳定性评分普遍偏低(V1.4) | 目标 IP 本身波动大,或下载超时太短导致部分轮次失败 | 适当增大下载超时 / 降低复测并发,再复测观察 |
| 想查看详细原因 | — | 打开 logs/app.log 查看日志 |
- 日志文件:
logs/app.log(UTF-8,单个文件最大 2MB,自动保留 3 个备份) - 记录内容:软件启动、IP 导入、自动获取(CIDR 数量 / 候选 IP)、开始测速、测速完成、 开始复测 / 复测完成(目标 IP 数 / 轮数 / 并发 / 用时 / 是否用户停止)、导出、异常和错误
- 不会记录任何敏感信息(本项目也不收集用户个人信息)
界面上只显示简短的中文提示(例如「网络连接错误」),
而真实错误(异常类型 + 原始信息)会完整记录到 logs/app.log,方便排查:
2026-09-18 22:57:25 [INFO] ip_optimizer: Cloudflare API request started: url=https://api.cloudflare.com/client/v4/ips
2026-09-18 22:57:25 [INFO] ip_optimizer: HTTP status: 200
2026-09-18 22:57:25 [INFO] ip_optimizer: response length: 4123 bytes
2026-09-18 22:57:26 [INFO] ip_optimizer: 获取 Cloudflare IPv4 网段成功(主源):15 个 CIDR,耗时 0.76 秒
# 失败时会出现下面这类真实错误记录:
2026-09-18 22:58:01 [ERROR] ip_optimizer: connection error: <urlopen error [WinError 10061] ...>
2026-09-18 22:58:01 [ERROR] ip_optimizer: timeout error: <urlopen error timed out>
2026-09-18 22:58:01 [ERROR] ip_optimizer: JSON parse error: Expecting value: line 1 column 1 (char 0)
排查顺序建议:① 打开
logs/app.log看最后几行 → ② 点界面上的【测试Cloudflare连接】→ ③ 若日志里出现127.0.0.1:xxxx说明是系统代理问题,请先启动代理软件。
已完成:IP 自动获取 / Cloudflare IP 段随机抽样(V1.1 完成) 已完成:HTTP / HTTPS 测速、下载测速、TCP → HTTP → 下载 三级测速流程(V1.2 完成) 已完成:综合评分、IP 排名、TOP100、一键复制、TXT/CSV 导出、结果筛选与摘要(V1.3 完成) 已完成:稳定性复测(多轮重测 / 成功率与波动统计 / 稳定性评分 / 最终评分与最终排名 / 稳定性导出)(V1.4 完成)
下一阶段(等待确认后再开发)建议顺序:
- TLS 握手耗时单独统计并接入评分(更细的「连接质量」维度)
- JSON 导出 / TOP100 结果文件自动生成
- HTTP 测速目标可配置(自定义测试域名)
已完成的功能均已锁定,后续开发不会破坏现有结构。
本章是手把手教程:假设你刚下载好这个软件、手上一个 IP 都没有, 照着做一遍就能拿到一份「又快又稳」的可用 IP 列表。 只想查某个参数含义看第 7 章,遇到报错看第 10 章。
1. 启动软件 双击 run.bat,或执行 python main.py
↓
2. 准备候选 IP 点【自动获取IP】拿 1000 个 Cloudflare IP(推荐)
↓
3. 设置测速参数 端口 443 / 并发 50 / 超时 1000ms / 勾选 HTTP + 下载
↓
4. 开始测速 TCP → HTTP → 下载 三级流水,前一级失败自动跳过
↓
5. 看结果挑 IP 按综合评分排名,可筛选速度 / 延迟、只看 TOP10
↓
6. 稳定性复测(可选) 对 TOP IP 重复测 5 轮,看「是不是一直都快」
↓
7. 复制 / 导出 复制 TOP10/50/100,或导出 TXT / CSV 文件
↓
8. 用到你的软件里 把节点的「服务器地址」换成优选 IP(见第 14 章)
全过程都在本机完成:不上传任何数据、不修改系统网络设置、不改 DNS。
三种启动方式任选一种(都不需要管理员权限、不需要装额外软件):
| 方式 | 操作 | 适合谁 |
|---|---|---|
| ① 双击(最简单) | 双击项目根目录的 run.bat |
所有人 |
| ② 命令行 | 在项目目录执行 python main.py |
需要看报错信息时 |
| ③ VS Code | 用 VS Code 打开项目 → 打开 main.py → 按 F5 |
想调试 / 改代码时 |
启动成功后,窗口从上到下是 5 个区域(记住这 5 块,后面每一步都对应其中一块):
① IP 导入 选择IP文件 / 粘贴文本框 / 导入IP · 清空导入 · 自动获取IP · 刷新IP
② 测速设置 端口 · 并发 · 超时 · HTTP测试 · 下载测试 · 下载大小
③ 测试进度 进度条 + 已测试/成功/失败/用时 + TCP / HTTP / 下载 三行阶段统计
④ 稳定性复测 复测轮数 · 复测并发 · 开始复测 · 停止复测 · 导出稳定TOP TXT / 稳定性CSV
⑤ 测试结果 筛选(最低速度 / 最大TCP延迟 / 显示 TOP N)· 结果表格 · 复制 / 导出
首次使用的两条建议:
- 每一步操作后看窗口底部状态栏的提示文字,它会告诉你「现在该做什么」「刚刚做了什么」;
- 如果打算用【自动获取IP】,先启动你的代理软件(Clash / v2ray 等), 否则连不上 Cloudflare —— 这是新手最常踩的坑(原因与排查见第 10 章)。
💡 关闭窗口时,如果测速或复测还在进行,软件会先弹窗确认,再安全停止后台线程才退出, 已经测到的结果不会丢失。
三种方式任选,推荐第一种(不用自己找 IP):
| 方式 | 操作 | 适合谁 | 拿到的 IP 数量 |
|---|---|---|---|
| ① 自动获取(推荐) | 点【自动获取IP】→ 选数量 → 【开始获取】 | 所有人,尤其是新手 | 100 / 500 / 1000 / 3000 / 5000 / 10000 |
| ② 选择文件 | 点【选择IP文件】→ 选 TXT → 【导入IP】 | 手上已有 IP 列表 | 取决于文件 |
| ③ 直接粘贴 | 把 IP 粘到文本框 → 【导入IP】 | 临时测几个 IP | 取决于粘贴内容 |
- 自动获取默认给 1000 个候选 IP,测 1000 个大约需要几分钟(并发 50);
- 想先试水,选 100 个即可,几十秒就能跑完;
- 想认真挑,选 3000 ~ 10000 个,基数越大越可能撞到一条特别好的线路;
- 每次点【刷新IP】会重新随机一批并与已有列表自动去重(不产生重复行);
- 获取完成后不会自动测速,需要你自己点【开始测速】。
⚠️ 如果自动获取失败,先点对话框里的【测试Cloudflare连接】看真实原因。 本机装了代理软件(Clash / v2ray 等)的话,必须先启动代理,否则连不上 Cloudflare。 这是最常见的失败原因,排查见第 10 章。
在 测速设置 区域填写,第一次用直接保持默认值就能跑出可用结果:
| 参数 | 默认值 | 可调范围 / 选项 | 怎么选 |
|---|---|---|---|
| 端口 | 443 |
常见 443 / 2053 / 2083 / 8443 | 换成你实际要用的节点端口,必须和节点一致 |
| 并发 | 50 |
1 ~ 500 | 网络好可调到 100;被防火墙拦截或频繁超时就降到 20 |
| 超时 | 1000 ms |
100 ~ 60000 | 国内网络建议 1000~2000;线路差调到 3000 |
| HTTP 测试 | 勾选 | 开 / 关 | 建议勾选,能筛掉「TCP 通但 HTTP 不通」的 IP |
| HTTP 超时 | 3000 ms |
100 ~ 60000 | 一般不用改 |
| 下载测试 | 勾选 | 开 / 关 | 必须勾选,否则拿不到速度、也拿不到综合评分 |
| 下载大小 | 1 MB |
256KB / 512KB / 1MB / 2MB / 5MB | 挑 IP 用 1MB;想更准用 2~5MB(更耗流量);只想快筛用 256KB |
| 下载超时 | 10000 ms |
100 ~ 60000 | 线路差、下载 5MB 时适当调大 |
三种典型场景的推荐配置:
【快速筛一遍】并发 100,下载大小 256KB,下载超时 5000ms
→ 几十秒出结果,先砍掉大部分劣质 IP
【认真挑 IP】并发 50,下载大小 1MB,下载超时 10000ms
→ 默认配置,速度与准确度平衡(推荐)
【网络较差 / 移动网络】并发 20,超时 2000ms,下载大小 512KB,下载超时 20000ms
→ 容错更高,避免把好 IP 误判为失败
点 【开始测速】,看 测试进度 区域:
- 进度条 +
已测试 / 成功 / 失败 / 用时(用时每秒都会走动,不会看起来像卡死); - 三行阶段统计,一眼看出卡在哪一级:
TCP 成功 812 / 失败 188 ← 有 812 个 IP 能连上 443
HTTP 成功 806 / 失败 6 / 未测试 188 ← 未测试 = TCP 失败被跳过的数量
下载 成功 780 / 失败 26 / 未测试 220 ← 成功 780 个 = 最终参与评分的 IP
测速过程中界面不会卡死,可以拖动窗口;想停就点 【停止测速】, 已得到的结果会保留并立即参与排名。
测速结束后,表格已经按综合评分从高到低排好顺序,只看最上面几行就够了。
先看懂颜色(一眼判断好坏):
| 列 | 判定标准 |
|---|---|
| TCP延迟 | ≤ 80ms 绿色(很好)、≤ 200ms 橙色(一般)、> 200ms 红色(偏慢) |
| 下载速度 | ≥ 5 MB/s 绿色、≥ 1 MB/s 橙色、< 1 MB/s 红色 |
| 综合评分 | ≥ 80 绿色、≥ 50 橙色、其余红色 |
| 状态 | 全部成功 绿色、HTTP成功 橙色、TCP失败 / HTTP失败 红色 |
用筛选只留「好的」(结果区第一行,四个控件依次是:最低速度 / 最大TCP延迟 / 显示 / 应用筛选):
- 最低速度 选
1 MB/s,把慢的 IP 直接排除; - 最大TCP延迟 选
200 ms,保证连接不卡顿; - 显示 选
TOP100(或TOP50/TOP20/TOP10),只保留前 N 名; - 点 【应用筛选】,表格与下方摘要会立刻按新条件刷新。
筛选只影响「显示」,不会丢数据:把条件放宽后再点【应用筛选】就能恢复。
用排序找「单项冠军」:点表头即可排序。
例如想找延迟最低的 IP,就点 TCP延迟 列标题两次(升序)。
看摘要确认整体质量(表格下方那行):
有效IP:780 | 最快速度:12.35 MB/s | 平均速度:3.81 MB/s | 最低延迟:32 ms
| 平均TCP延迟:95 ms | 平均HTTP延迟:210 ms | TOP1:104.16.x.x(评分 92)
💡 新手通用打法:最低速度
1 MB/s+ 最大TCP延迟200 ms+ 显示TOP100, 应用筛选后直接进入下一步做稳定性复测。
为什么一定要做这一步?
单次测速可能刚好撞上「网络波动好的一瞬间」——某个 IP 一次测得很快,但实际用时忽快忽慢。 复测就是把同一批 TOP IP 重复测多轮,用成功率和波动幅度算出「它一直都快,还是只是偶尔快」。
复测完成后,表格会按最终评分重新排名:
最终评分 = V1.3 综合评分 × 0.9 + 稳定性评分 × 0.1
「一次快、多次抖」的 IP 会被排到后面,稳定可用的 IP 排到前面;
V1.3 的评分与排名照样保留在表格里(排名 / 综合评分 两列),随时能对比。
操作步骤:
- 在 稳定性复测 区域选择 复测轮数:
3 次/5 次(默认)/10 次; - 选择 复测并发:
10/20(默认)/50; - 点 【开始复测】 —— 进度条、
复测中:第 x/5 轮,已测 n/总数、当前:x.x.x.x会实时刷新; - 等它跑完(会弹窗提示用时与摘要),表格自动切换到最终排名;
- 想中断就点 【停止复测】:已完成的轮次会保留,并据此生成最终排名(不会白跑)。
参数怎么选:
| 场景 | 建议 |
|---|---|
| 快速确认(只想跑一遍) | 轮数 3,并发 20 |
| 认真挑(默认,推荐) | 轮数 5,并发 20 |
| 追求结论可靠(IP 数量不多时) | 轮数 10,并发 10 |
| IP 很多、机器性能好 | 轮数 5,并发 50 |
复测结果怎么看(表格右侧 8 列):
| 列 | 含义 | 多少算好 |
|---|---|---|
| 稳定性 | 0~100 的稳定性评分(V1.4) | ≥ 80 绿色很稳、≥ 50 一般 |
| TCP成功率 | 多轮里 TCP 连上的比例 | 100% 最好 |
| HTTP成功率 | 多轮里 HTTP 正常响应的比例 | 100% 最好 |
| 下载成功率 | 多轮里下载成功的比例 | 100% 最好 |
| TCP波动 | TCP 延迟的变异系数(CV,越小越稳) | ≤ 15% 绿色 |
| 下载波动 | 下载速度的变异系数(越小越稳) | ≤ 15% 绿色 |
| 最终评分 | V1.3评分×0.9 + 稳定性×0.1 | 越高越好 |
| 最终排名 | 按最终评分排出的名次 | 前几行就是优选结果 |
复测完成后,稳定性区域下方还会多出一行复测摘要:
稳定IP:58 | 波动IP:42 | 平均稳定性:76 | 最高最终评分:89(104.16.x.x) | TOP10:…
稳定性评分 ≥ 60 视为「稳定」,教程里就按这一行判断这批 IP 整体质量。
拿到满意的排名后,用结果区下方的按钮把 IP 拿出来用:
| 按钮 | 干什么 | 你要用的场合 |
|---|---|---|
| 【复制TOP10】 | 前 10 名 IP 复制到剪贴板,每行一个、不带任何多余文字 | 只挑几条最优质的线路 |
| 【复制TOP50】 | 前 50 名 IP 复制到剪贴板 | 想留一批备用 |
| 【复制TOP100】 | 前 100 名 IP 复制到剪贴板 | 交给订阅转换 / 批量脚本 |
| 【导出TXT】 | 把 TOP100 存成 output\IP优选_TOP100_日期时间.txt |
需要留档、或给别的程序读 |
| 【导出CSV】 | 把完整结果存成 output\IP优选_结果_日期时间.csv(含排名/延迟/状态/评分) |
想用 Excel 自己再筛一遍 |
复测完成后,稳定性区域会多出两个按钮:
| 按钮 | 干什么 | 文件 |
|---|---|---|
| 【导出稳定TOP TXT】 | 按最终排名取前 100 个 IP | output\IP优选_稳定TOP100_日期时间.txt |
| 【导出稳定性CSV】 | 完整复测统计(轮数 / 各阶段成功率 / 波动 / 稳定性评分 / 最终评分 / 最终排名) | output\IP优选_稳定性结果_日期时间.csv |
💡 重要:复测完成后,【复制TOP10/50/100】会自动改用最终排名(稳定者优先)—— 也就是说做完了 13.7 步,直接点【复制TOP10】拿到的就是「又稳」的那批 IP。
CSV 是 UTF-8-BOM 编码,用 Excel 双击打开不会乱码;TXT 每行一个纯 IP,没有表头。 所有文件都保存在项目目录下的
output\里,文件名带时间戳,不会互相覆盖。
这一步就是把测出来的 IP 填进你平时用的软件,让软件连上这条更快的线路。
一句话原理(先看懂这句,后面全通):
你的节点本来是:服务器地址 = abc.example.com (域名 → 背后是 Cloudflare 的 IP 池)
测速做的事: 找出这个池子里「对你最快」的那些真实 IP
你要做的事: 只把「服务器地址」从域名换成优选 IP,其它一个字都不改
(端口、UUID/密码、TLS、SNI / Host / 伪装域名 全部保持原样)
所以操作永远是三下:
1. 复制一个优选 IP(表格里第 2 列,或点【复制TOP10】)
2. 打开你的客户端 → 编辑节点 → 把「地址 / Server / Address」改成这个 IP
3. 保存 → 重新连接 → 打开测速网站验证速度
具体到各类软件怎么改,见第 14 章(含 Clash、v2rayN、v2rayNG、Shadowrocket、 Surge、sing-box、OpenClash / PassWall 等,以及哪些节点根本用不上优选 IP)。
先记住两条最容易踩的坑:
- SNI / servername / host 千万别改:它必须还是原来的域名,否则 TLS 校验不过,显示连上但打不开网页;
- 端口要和测速时一致:你在软件里用 443 测出结果,客户端也要用 443;想用 2053 就先把测速端口改成 2053 再测。
💡 建议一次填 3~5 个 IP(而不是只填 1 个):配合客户端的自动测速/故障转移分组, 一条线路被限速了会自动切下一条。具体做法见第 14 章。
🔁 优选 IP 会「过期」:运营商线路、QoS 策略变化都会让原来的 IP 变慢。 建议每隔几天重新跑一遍 13.4 → 13.7,更新一次 IP 列表。
下面是最省事的一套完整操作,按顺序做即可,全程约 5~10 分钟:
| 步骤 | 操作 | 预计耗时 |
|---|---|---|
| 1 | 双击 run.bat 启动软件 |
3 秒 |
| 2 | 确认代理软件(Clash / v2ray 等)已经启动 | —— |
| 3 | 【自动获取IP】→ 选 1000 → 【开始获取】 |
10 ~ 30 秒 |
| 4 | 端口填你节点真实的端口(如 443);并发 50;超时 1000 ms |
10 秒 |
| 5 | 确认 HTTP测试 与 下载测试 都勾选;下载大小 1 MB |
5 秒 |
| 6 | 点【开始测速】,等进度条走完(可随时【停止测速】) | 1 ~ 5 分钟 |
| 7 | 最低速度 1 MB/s + 最大TCP延迟 200 ms + 显示 TOP100 → 【应用筛选】 |
10 秒 |
| 8 | 复测轮数 5、复测并发 20 → 【开始复测】 |
1 ~ 3 分钟 |
| 9 | 点【复制TOP10】→ 粘到客户端里替换服务器地址(见第 14 章) | 1 分钟 |
| 10 | 客户端重连,测速对比前后差异 | 1 分钟 |
想更快(只要 30 秒出结果):跳过第 8 步,并把第 5 步的下载大小改成 256 KB、第 4 步并发改成 100。
想更准(多花几分钟):第 3 步选 3000 或 10000 个 IP,第 5 步下载大小用 2 MB,
第 8 步复测轮数用 10、并发用 10。
| 现象 / 疑问 | 原因与做法 |
|---|---|
| 点【开始测速】提示「还没有可用的 IP」 | 先去 13.3 步准备 IP(自动获取 / 导入 / 粘贴) |
| 【自动获取IP】失败 | 先启动代理软件,再点对话框里的【测试Cloudflare连接】看原因(见第 10 章) |
结果里「下载速度」全是 -- |
忘了勾选 下载测试 → 勾上重新测 |
结果里「综合评分」全是 -- |
同上:评分依赖下载速度,必须勾选下载测试(见第 6 章评分算法) |
表格里出现一堆 TCP失败 |
端口填错了(要填你节点的真实端口),或网络太差把并发降下来 |
| 【开始复测】按钮是灰的 | 必须先完成一次测速、且排名里有评分有效的 IP |
| 复测完了表格里 IP 变少了 | 正常:复测只覆盖 V1.3 的 TOP 集合,表格只显示参与复测的 IP(见第 6 章) |
| 复测结果没了 | 重新点【应用筛选】或重新测速都会让旧复测失效,需要重新复测 |
| 想保留两轮结果对比 | 每轮结束后点【导出CSV / 导出稳定性CSV】,文件名带时间戳不会互相覆盖 |
| 测速时界面能关掉吗 | 可以:会先弹窗确认,安全停止后台线程后退出,已测结果不丢 |
| 测速会不会影响我正在用的网络 | 不会改 DNS、不改系统代理、不改路由;只是并发发起 TCP/HTTP/下载请求,会占一点带宽 |
| 优选 IP 要多久更新一次 | 建议 3~7 天重跑一次;发现速度掉下来就立刻重测 |
| 一个 IP 能用多久 | 没有固定答案:取决于运营商线路变化,所以要看「稳定性」这一列挑长期稳的 |
| 能不能不填端口 | 表格里每条结果都带测试时的端口,客户端要填成同一个端口 |
这一章解决一个核心问题:测出来的这些 IP,到底能填进哪些软件里?怎么填? 结论先给:只要你的节点是「走 Cloudflare CDN 的 HTTP 类代理协议」, 几乎所有主流代理客户端都支持——因为对客户端来说,这不过是「把服务器地址 从域名换成 IP」而已。真正用不上优选 IP 的,是不走 CDN 的节点(见 14.5)。 注意:目标域名必须在 Cloudflare 上(不必是你自己的域名), 而「能不能真的打开」往往还取决于 SNI 是否被链路掐断——见 14.8 的实测。
满足下面 3 个条件 就能用(对着你的节点配置看一眼即可):
① 服务器地址填的是「域名」(不是你直接拿到的 IP)
② 这个域名解析到 Cloudflare(即节点是 CF 中转/CDN 节点:VLESS / VMess / Trojan / SS 等 + WS / gRPC / HTTP 传输)
③ 客户端里能单独填一个「SNI / Host / 伪装域名」字段
三个都满足 → 本软件可用(照 14.3 改地址即可)。 第 ① 条不满足(节点直接填 IP、不经过 Cloudflare)→ 优选 IP 对它无效,本软件不用改。 第 ③ 条不满足 → 尽量别改(改了会因为证书域名不匹配而连不上),见 14.5。
| 软件 / 客户端 | 平台 | 支持 | 改哪一项 |
|---|---|---|---|
| Clash / Clash Meta(mihomo)内核 | 全平台 | ✅ | 配置里 proxies[].server |
| Clash Verge / Clash Verge Rev / Mihomo Party | Win / macOS / Linux | ✅ | 图形界面编辑节点 → 「服务器」字段 |
| Clash for Windows / ClashN / FlClash | Win | ✅ | 同上(「Server / 服务器地址」) |
| v2rayN | Windows | ✅ | 节点编辑 → 「地址(address)」 |
| v2rayNG | Android | ✅ | 节点编辑 → 「地址」 |
| NekoRay / NekoBox | Win / Android | ✅ | 节点编辑 → 「地址」 |
| sing-box(含官方 App / Hiddify) | 全平台 | ✅ | JSON / 界面里的 server |
| Shadowrocket | iOS | ✅ | 节点 ⓘ → 「地址」 |
| Stash / Surge / Loon / Quantumult X | iOS / macOS | ✅ | 配置行的「服务器地址」 |
| OpenClash / PassWall / SSR Plus+ | OpenWrt / iStoreOS 软路由 | ✅ | 节点配置里的「服务器地址」 |
Xray / V2Ray 命令行(config.json) |
全平台 | ✅ | outbounds[].settings.vnext[].address |
| Clash / sing-box 的订阅文件 | 全平台 | ✅ | 先测速 → 再把地址替换进订阅(见 14.4) |
| 浏览器扩展(SwitchyOmega 等) | 浏览器 | ⚠️ 间接 | 扩展本身不填服务器地址,它只做分流;真正要改的是它背后那款客户端 |
| WireGuard / OpenVPN / IPsec 客户端 | 全平台 | ❌ | 不是 HTTP 类代理、不走 CF CDN,优选 IP 无意义 |
| Cloudflare WARP / 1.1.1.1 客户端 | 全平台 | ❌ | 有自己的选路机制,与优选 IP 无关 |
| 直连 IP 的节点(无 CDN) | —— | ❌ | 域名都不存在,没有「池子」可选 |
| 把优选 IP 填给不在 Cloudflare 上的网站(Google / GitHub 等) | —— | ❌ | 域名不在 CF,CF 边缘不认识它,详见 14.8 |
| 把优选 IP 填给在 Cloudflare 上、但 SNI 被链路掐断的站点(如 chatgpt.com) | —— | ❌ | 换任何 IP 都会被重置,详见 14.8 |
| 机场自带「自动优选 / 智能选路」的客户端 | —— | ⚠️ 可能重复 | 机场已经帮你优选的,不必再自己改 |
💡 一句话记忆:软件几乎不限,关键是「节点必须是 CF CDN 节点」。 本软件(数码解码 IP 优选器)本身不修改任何客户端配置,它只负责测出 IP; 「填进去」的动作永远在你平时用的那个客户端里完成。
不管你的客户端长什么样,改法都是同一套 「找地址 → 换地址 → 保端口」:
第 1 步 在客户端里找到你的节点,点【编辑】,定位到「服务器地址 / 地址 / server / address」这一项
第 2 步 把原来的域名(例如 cf.example.com)整个替换成本软件测出来的优选 IP
—— 被替换的只是这一个字段,其它字段一个都别动
第 3 步 确认「端口」与本软件结果里的端口一致(表格的「端口」列),保存后重新连接
各客户端具体位置(对应 14.2 表格的最后一列):
| 客户端 | 具体操作 |
|---|---|
| v2rayN / v2rayNG / NekoRay / NekoBox | 双击节点(或右键 →【编辑】)→ 找到「地址(address)」,改成优选 IP → 【确定】→ 右键节点【设为活动服务器】 |
| Clash Verge / Verge Rev / Mihomo Party / Clash for Windows | 左侧【订阅 / 配置】→ 进入节点编辑(或【节点】列表 → 右键【编辑】)→ 把 server 改成优选 IP → 保存 |
| sing-box 官方 App / Hiddify | 打开配置 → 编辑节点(或直接改 JSON)→ "server": "优选IP" → 保存并切换 |
| Shadowrocket(iOS) | 首页节点右侧 ⓘ → 「地址」改成优选 IP → 返回 → 点节点连接 |
| Stash / Surge / Loon / Quantumult X(iOS / macOS) | 编辑配置文件里该节点的 server = 优选IP(或界面里点节点编辑) |
| OpenClash / PassWall / SSR Plus+(软路由) | 路由器后台 → 插件 → 节点管理 → 编辑节点「服务器地址」→ 保存并重启该插件 |
| Xray / V2Ray 命令行 | 编辑 config.json → outbounds[].settings.vnext[].address 改成优选 IP → 重启进程 |
⚠️ 千万不要改的字段:
SNI、Host、伪装域名、path、TLS、servername、WS 头。 这些字段里填的必须还是原来的域名——它决定「TLS 证书对不对得上」。 只把「服务器地址」这一个字段换成 IP,其它原样保留,就不会出错。
如果你用的是机场订阅(一份 YAML / JSON 里几十个节点),手动改太累,推荐两种做法:
做法 A(推荐):只在客户端里改「当前使用的那几个节点」
订阅本身不用动,每次订阅更新后,把你在用的 1~3 个节点地址改掉即可。 优点是订阅照常更新,不会被覆盖。
做法 B:本地副本替换(Clash YAML 示例)
# 改之前:只有一个域名
- name: "CF-节点-1"
type: vless
server: cf.example.com # ← 要换的字段
port: 443
uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
tls: true
servername: cf.example.com # ← 不要动!这是 SNI
# 改之后:把 server 换成优选 IP(表头其它字段照抄)
- name: "CF-节点-1"
type: vless
server: 104.16.0.1 # ← 只换这一行(来自本软件结果表格)
port: 443
uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
tls: true
servername: cf.example.com # ← 保持不变做法 B-2:sing-box JSON 示例
{
"type": "vless",
"tag": "cf-node",
"server": "104.16.0.1", // ← 只把这里从域名换成优选 IP
"server_port": 443,
"uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tls": {
"enabled": true,
"server_name": "cf.example.com" // ← 保持不变(SNI)
}
}做法 C:想一次用多个优选 IP(负载 / 备用)
在 Clash 里加多条只有 name 和 server 不同的节点(其它字段复制同一份),
再用 proxy-groups 组合起来,例如:
proxy-groups:
- name: "CF-优选组"
type: url-test # 自动挑选当前最快的
url: "http://www.gstatic.com/generate_204"
interval: 300
proxies: ["CF-优选-1", "CF-优选-2", "CF-优选-3"]把这份组合替换掉原来的单个节点,客户端就会自动在几个优选 IP 之间挑最快的用。
💡 建议先在本软件里只挑 3~5 个最稳的再填进去(看「稳定性」和「最终评分」列), 填太多反而拖慢客户端的健康检查。
| 情况 | 为什么别改 |
|---|---|
| 节点直接填 IP、不经过 Cloudflare | 没有「CDN 池」这个概念,优选 IP 与它无关 |
| 用的是 WireGuard / OpenVPN / IPsec / SS / SS2022 直连节点 | 不是 HTTP 类代理、也不走 CF CDN,改 IP 只会连不上 |
| Cloudflare WARP / 1.1.1.1 客户端 | 它有自己的入口选路机制,与优选 IP 无关 |
| 客户端里没有 SNI / Host / 伪装域名 字段 | 换成 IP 后 TLS 证书域名不匹配,会直接握手失败 |
| 域名同时用于别的服务(网站、企业邮箱、其他节点) | 你在客户端里改 IP 只影响本地这一份配置,不会影响域名本身,但若你改的是服务器端配置则会影响全部服务 |
| 机场已经提供「智能选路 / 自动优选」 | 机场侧已经在优化,重复改容易互相冲突 |
⚠️ 特别提醒:不要去改自己的 DNS 记录或域名解析来「使用优选 IP」。 优选 IP 是在客户端侧替换地址,与 DNS 无关;改解析只会让你的域名指向一个陌生 IP, 影响所有依赖该域名的服务(包括证书校验)。 本软件也不会修改你的 DNS、系统代理、路由表或任何客户端配置。
第 1 步 客户端里连上改过的节点,看是否「连接成功 / 延迟正常」
第 2 步 打开浏览器访问一个需要代理的网站(或用客户端自带的「延迟测试」)
第 3 步 对比改前后的延迟与下载速度(本软件结果里的 TCP延迟 / 下载速度就是参考值)
第 4 步 观察 5~10 分钟:如果不掉线、速度稳定 → 这个 IP 可以用
更严谨一点的做法(推荐给长期使用):
- 在本软件里记下候选 IP 的「TCP延迟」「下载速度」「稳定性」「最终评分」四列;
- 填进客户端后,用客户端的延迟测试再测一次,两边都排在前面的才算真正可用;
- 如果一个 IP 在客户端里频繁掉线,直接换下一个(本软件里复测「波动」大的最容易被淘汰)。
| 现象 | 原因 | 做法 |
|---|---|---|
| 改完连不上 | 端口与优选 IP 的端口不一致 | 用本软件结果里的「端口」重新填一遍(常见错填 80 / 8080) |
| 改完连不上 | 顺手把 SNI / Host 也换成了 IP | 恢复成原来的域名(见 14.3 的警示框) |
| 能连上但很快断开 | 这个 IP 稳定性差 | 换成本软件里「稳定性」高、「波动(±%)」小的 IP |
| 速度反而变慢了 | 测速时的网络状况与现在不同 | 重新跑一次测速 + 复测,或在客户端里配置多个 IP 用 url-test 自动挑 |
| 订阅更新后又变回域名 | 客户端覆盖了本地修改 | 用 14.4 的做法 A(只改在用节点)或把订阅转成本地配置 |
| 软路由(OpenClash 等)改了不生效 | 插件没重新加载配置 | 在插件里【保存并应用】或【重启 OpenClash】 |
| iOS 客户端改了没生效 | 没切换到该节点 | 在首页把节点重新点选一次(或断开重连) |
| 同一条 IP 昨天好用今天慢 | IP 的线路质量会随运营商变化 | 建议 3~7 天重跑一次测速(见 13.11 最后几行) |
先给三句结论:
- 优选 IP 只能用来替换「服务器地址」,它本身不是代理服务器,不能替你去访问网站;
- 目标域名必须在 Cloudflare 上才谈得上直连,但不必是你自己的域名——
任何 CF 客户(
openai.com、example.com都算)在架构上都能被 IP 直连; - 就算满足第 2 条也不一定通,还要过「SNI 会不会被掐断」和「站点自己的 WAF」两关。
实测中
chatgpt.com卡在第二关(SNI 直接被重置),换多少条优选 IP 都是同一个结果。
第一关:目标域名得真的在 Cloudflare 上
Cloudflare 是任播(Anycast)网络:一个边缘 IP 服务的是它全部客户的域名,
不是只有你自己的域名。实测把任意 CF IP 当入口、SNI 填 openai.com,
Cloudflare 会返回属于 openai.com 的证书并正常应答请求——
所以「不是你的域名」不构成障碍。
反过来,域名根本不在 CF 上时,握手会直接失败。失败签名的含义完全不同,别混为一谈:
| 实测现象(括号里是 SNI) | 含义 | 卡在哪一关 |
|---|---|---|
握手成功,并拿到 Cloudflare 返回的、含该域名的证书(example.com 返回 200 OK、shopify.com 返回 301) |
CF 认识这个域名,它是 CF 客户 | 第一关 ✅ |
SSL: SSLV3_ALERT_HANDSHAKE_FAILURE(www.qq.com) |
CF 不认识这个域名,没有回源信息,拒绝握手 | 第一关 ❌(这才是「域名不在 CF」的正确签名) |
连接被重置:ConnectionResetError / WinError 10054,换任何 CF IP 都一样(chatgpt.com) |
不是 CF 的问题:握手在到达 CF 之前就被链路中断 | 第二关 ❌ |
握手成功但返回 403 Forbidden / 验证页,响应头带 Cf-Mitigated: challenge(openai.com) |
CF 认识域名,是站点自己配置的 WAF / 人机验证在挡 | 第三关 ❌ |
第二关(最要命的一关):SNI 是明文的,可以被按域名掐断
TLS 握手里的 SNI 默认是明文发送的,链路中间的设备能读到「你要访问哪个域名」, 并据此直接掐断连接。实测同一时间、同一台机器、只改 SNI 字符串(目标 IP 不变):
| SNI | 结果 |
|---|---|
example.com |
✅ 握手成功 → 200 OK |
openai.com |
✅ 握手成功 → 403 Forbidden(被站点 WAF 挡) |
chatgpt.com |
❌ ConnectionResetError(换成另一个 CF IP,结果完全一致) |
这就是答案:
chatgpt.com直连打不开,跟「选哪条优选 IP」完全无关。 把 hosts 或服务器地址指向任何一条优选 IP,结果都是被重置—— 因为问题出在 SNI 这一层,而不是 IP 这一层。 只有在没有这层掐断的网络里,第二关才不存在(那种网络下你本来也能直接打开它,用不上优选 IP)。
第三关:站点自己的风控,与线路质量无关
就算连接通了、CF 也认识域名,站点仍可以在 CF 面板里配置 WAF / 人机验证(Turnstile),
边缘就会替站点返回 403 Forbidden + Cf-Mitigated: challenge;
OpenAI 这类服务还会按来源 IP 的地区与机房类型决定是否提供服务
(Cloudflare 段本身就是数据中心 IP,落地地区由 CF 自行选择),
落到不支持的地区就会看到 Service we don't support in your country。
这一层与本软件的测速结果无关:分数再高也绕不过去。
那「优选 IP 打开 ChatGPT」到底能修到什么程度?
| 你想做的事 | 能不能成 | 卡在哪一关 |
|---|---|---|
把 chatgpt.com 直接指向优选 IP 打开网页 |
❌ 不能 | 第二关:SNI 被重置,换 IP 无效 |
把 google.com 指向优选 IP |
❌ 不能 | 第一关:Google 不在 CF 上,没有 CF IP 认识它 |
| 用它加速别的 CF 托管站点 | ⚠️ 视情况 | 三关都要过:域名在 CF + SNI 不被掐 + 站点 WAF 不挡 |
| 用它加速你自己的 CF CDN 节点 | ✅ 能 | 这才是本软件的主用途(正确路径见下) |
说明:优选 IP 本身不是代理,它不改变流量最终从哪里去访问目标网站。 要让 ChatGPT 这类站点可用,必须有一台位于可用地区的服务器替你去请求, 那是**代理节点(VPS / 机场节点)**的职责;优选 IP 后面没挂着节点,就没有程序替你连目标站。 打个比方:优选 IP 是「离你家最不堵的高速路入口」,入口不等于目的地, 你得先有车(代理节点),才谈得上去哪。
本软件的分数到底代表什么
测速时候选的 IP 全部来自 Cloudflare 官方公开网段(core/cloudflare_source.py),
TLS 的 SNI 与 HTTP Host 固定使用 Cloudflare 官方测速域名 speed.cloudflare.com
(core/http_tester.py)。因此:
表格里「TCP延迟 / HTTP / 下载速度」 = 你家 → 最近的 Cloudflare 边缘节点 这一段的质量
它不代表 = 这个 IP 能访问哪些网站
⚠️ 已知限制:因为测速的 SNI 固定为
speed.cloudflare.com,分数不能回答 「这条 IP 能不能用来访问某个具体域名」。后者要按上面三关逐一验证。
那想更快地访问 ChatGPT,正确路径是什么
你的软件 ── SNI = 你自己的伪装域名(明文里出现的是它,通常不会被掐)
└─→ 优选 IP(CF 边缘入口)→ 你的 CF CDN 节点 → 在可用地区回源 → ChatGPT
关键差别:你链路里明文出现的 SNI 是你自己的域名,chatgpt.com 只出现在
加密隧道内部,中间设备看不到它,也就无从掐断。
所以「优选 IP + 节点」才是既能提速、又能打开目标站的做法(前提:节点落在可用地区)。
判断你的节点能不能用优选 IP:节点里「服务器地址」是域名,且该域名
nslookup 出来落在 Cloudflare 的网段(常见 104.16~104.24、172.64、188.114 等),
并且带 WS / gRPC / HTTP 传输与伪装域名——三条判定的完整说明见 14.1。
三种典型误操作
| 误操作 | 结果 | 正确做法 |
|---|---|---|
在 hosts 里把 chatgpt.com 指向优选 IP |
非 CF 站点必然失败;chatgpt.com 这类 CF 站点也会被 SNI 重置挡住,换 IP 无用 |
按上面三关先判断「卡在哪一关」,再决定是换 IP 还是换思路 |
| 把优选 IP 填进浏览器 / 客户端的「代理服务器」栏 | 连不上——它不是 SOCKS / HTTP 代理 | 代理栏填真正的代理软件端口(如 127.0.0.1:7890) |
| 换 IP 时顺手把 SNI / Host 也改成 IP | TLS 证书域名不匹配,握手直接失败 | 只改「服务器地址」,SNI / Host 保持原域名(见 14.3) |
怎么自己验证(30 秒)
nslookup chatgpt.com 1.1.1.1 # 看 A 记录是否在 CF 段:104.16~104.31 / 172.64~172.71 / 162.158 / 188.114A 记录落在 CF 段 → 第一关 ✅;接下来能不能用,还要看第二关(SNI)和第三关(站点 WAF), 这两关都不是「换一条更快的优选 IP」能解决的。
💡 补充:ECH(Encrypted Client Hello)可以把 SNI 也加密,但目前并非所有站点与客户端都启用, 代理场景通常不依赖它,本软件的测速也不依赖它。
⚠️ 顺带说明:Cloudflare WARP(1.1.1.1 客户端)也用不上优选 IP, 它有自己的入口选路机制(见 14.2 / 14.5)。想让 ChatGPT 更快, 正确的方向是更换或优化代理节点本身,而不是给网站换 IP。
| 版本 | 日期 | 主要内容 |
|---|---|---|
| V1.0 | 2026-09 | 初始版本:手动导入 / 粘贴 IP,公网 IPv4 校验与去重,并发 TCP 连接测速(延迟),结果表格展示,运行日志 |
| V1.1 | 2026-09 | Cloudflare IP 自动获取(CIDR 随机抽样去重)、【测试Cloudflare连接】、获取失败的中文提示与日志排查指引 |
| V1.2 | 2026-09 | 三级测速流程(TCP → HTTP → 下载),HTTP 状态码 / 响应耗时列,下载速度测速(256KB~5MB 可选),各阶段成功 / 失败 / 未测试统计,各级超时与开关独立可配 |
| V1.3 | 2026-09 | 综合评分(下载速度权重最高、延迟越低越好)、IP 排名与 TOP N 截断(10/50/100)、一键复制 TOP IP、TXT / CSV 导出、速度 / 延迟筛选、结果摘要(最快 / 平均速度、最低 / 平均延迟、TOP1) |
| V1.4 | 2026-09 | 稳定性复测:对 V1.3 TOP IP 多轮重复测试(3/5/10 轮,独立复测并发),统计 TCP / HTTP / 下载成功率与 TCP 延迟、下载速度波动(变异系数),生成稳定性评分、最终评分(V1.3 评分 ×0.9 + 稳定性 ×0.1)与最终排名;稳定 TOP TXT / 稳定性 CSV 导出;复测可随时停止且保留已完成轮次 |
| V1.4.1 | 2026-09 | 发布修复(功能与 V1.4 相同):新增 utils/paths.py,使打包成 exe 后日志与导出结果落在 exe 同级目录(原先写进临时目录、退出即丢失);exe 位于只读目录时自动回退到 %LOCALAPPDATA%;新增第 16 章「下载可执行文件」与免安装 exe 发布 |
| V1.4.2 | 2026-09 | 改名发布(功能与 V1.4 / V1.4.1 完全相同,未改动任何算法与界面):程序与发行文件更名,移除旧品牌字样;仓库更名为 ip-optimizer,可执行文件更名为 IP-Optimizer-V1.4.2.exe,只读目录下的回退数据目录更名为 %LOCALAPPDATA%\IPOptimizer\;旧版 exe 的下载链接同时失效 |
已完成版本的功能均已锁定,接口与文件结构保持向后兼容。
文档补充:第 13 章(完整使用教程)与第 14 章(优选 IP 怎么用、支持哪些软件) 只增加说明文字,不改动任何程序代码与文件结构。
本章面向不想碰命令行、只想双击用的用户。前面 1~15 章讲的是源码运行方式, 如果你只是要测 IP,看完这一节就够了。
| 方式 | 适合谁 | 需要装 Python 吗 | 步骤 |
|---|---|---|---|
| 下载 exe(推荐) | 只想用功能的大多数用户 | 不需要 | 到 Releases 下载 .exe,双击 |
| 源码运行 | 想改代码、审计代码的人 | 需要(3.12+) | 见第 3 章【安装依赖】与第 13.1 节 |
| 自己打包 | 不信任别人给的 exe 的人 | 需要(3.12+) | 见下面的 16.6 |
- 打开 https://github.com/shuma12303/ip-optimizer/releases/latest;
- 在 Assets 里下载
IP-Optimizer-V1.4.2.exe(约 36 MB); - (可选)校验文件是否完整、有没有被中途篡改——在 PowerShell 里执行:
Get-FileHash -Algorithm SHA256 .\IP-Optimizer-V1.4.2.exe输出的哈希应当等于:
01746F912810301F95427B9576D5D61A949FB2D246B290A5468368CCEC86FEC7
对不上就别用(说明下载不完整或文件被动过)。
看到蓝色弹窗 "Windows 已保护你的电脑" 是正常现象,不代表有毒:
点弹窗左下角的【更多信息】 → 再点【仍要运行】
之所以会弹,是因为程序没有购买代码签名证书(证书需要付费并向微软提交审计), Windows 对所有未签名程序都会弹这个提示。点过一次【仍要运行】后,以后双击不再弹。
| 问题 | 说明 |
|---|---|
| 要安装吗 | 不用,绿色单文件,拷到桌面 / U 盘 / 移动硬盘都能直接跑 |
| 需要管理员权限吗 | 不需要,普通用户目录即可 |
logs\、output\ 在哪 |
exe 同级目录,第一次启动时自动创建;导出的 TXT/CSV 在 output\ |
放到 C:\Program Files\ 打不开 |
这类目录普通用户不可写,程序会自动改用 %LOCALAPPDATA%\IPOptimizer\,日志和导出结果也在那里 |
| 双击后 2~5 秒没反应 | 正常:单文件版需要先自解压,等一下就会出窗口 |
| 卸载 | 直接删除 exe 和 logs\、output\ 即可,不写注册表 |
PyInstaller 单文件 exe 会被少数杀软(尤其 360、部分企业终端防护)误报, 原因是它运行时往临时目录解压自身——这个行为和木马打包器一样,属于已知误报模式。 处理方式任选:加入白名单 / 换用源码运行 / 按 16.6 自己打包一份。
如果你不放心,最可靠的做法是自己打包——源码全开放,可以逐行审计。
python -m pip install -r requirements.txt
python -m pip install pyinstaller
python -m PyInstaller --noconfirm --onefile --windowed --name IP-Optimizer-V1.4.2 --exclude-module tkinter main.py打包结果在 dist\IP-Optimizer-V1.4.2.exe。
build\ 目录是中间产物,可以删掉;dist\、build\、*.spec 已被 .gitignore 忽略。
| 现象 | 原因 | 做法 |
|---|---|---|
| 双击完全没反应,任务管理器里也没有进程 | 被杀软静默拦截 | 查看杀软隔离区,恢复并加白名单 |
| 窗口一直不出来 | 首次自解压较慢,或被拦截 | 等 5~10 秒;看 logs\app.log 是否有「主窗口创建完成」 |
提示缺少 python312.dll |
exe 文件不完整(下载中断或被杀软删了片段) | 重新下载并核对 16.2 的哈希值 |
| 导出成功但找不到文件 | 看导出提示里的路径;若 exe 在只读目录,结果在 %LOCALAPPDATA%\IPOptimizer\output\ |
到该目录查看,或把 exe 挪到可写目录 |
| 在 OneDrive 同步目录里运行卡顿 | 云盘按需下载 + 大量小文件 | 把 exe 移到本地磁盘(如 D:\ip\)再运行 |
功能完全相同,V1.4.1 只解决"打包成 exe 之后"的两个问题:
- 新增
utils/paths.py:打包后日志与导出结果原先会写进临时解压目录、程序一关就消失, 现在正确落在 exe 同级目录; - exe 放在不可写目录(如
C:\Program Files\)时自动回退到用户目录, 避免双击直接崩溃。
源码运行(python main.py)的行为与 V1.4 完全一致,不受影响。
V1.4.2 只是更名版:程序名、可执行文件名、只读目录下的回退数据目录
(%LOCALAPPDATA%\IPOptimizer\)以及仓库名一并更名,算法、界面、文件格式没有任何改动。
如果你之前下载过 V1.4.1 的 exe,它仍然可用,只是旧的下载链接已随本次更名下线;
V1.4.1 在只读目录里生成的旧数据目录不会再被使用,可以手动删除。