⭐ 如果觉得好用,点个 Star 支持一下~
这是一个全自动的 Cloudflare CDN 节点优选工具。它通过 TCP 延迟筛选 + IP 可用性二次检测 + 真实带宽测速 三重机制,从多个公开数据源中聚合节点,自动识别并解析任意格式(标准代码、中文名、emoji国旗、JSON等),筛选出当前网络环境下速度最快、可用性最高的 Cloudflare IP,并支持自动更新至 Cloudflare DNS 以及同步至 GitHub 仓库,同时支持微信实时通知。
Important
跨平台支持:本工具同时兼容 Windows 和 Linux 操作系统。
- Windows 自动推送依赖 PowerShell 脚本
git_sync.ps1 - Linux 自动推送依赖 Bash 脚本
git_sync.sh
- 🚀 我要部署(Windows / Linux 命令对照)
- 🔐 我要获取 Token(GitHub / Cloudflare / WxPusher 三合一教程)
- ⚙️ 我要调整参数
- ☁️ 我要配置 Cloudflare DNS
- 📤 我要配置 GitHub 同步
- 🔧 Fork 后无法推送?一键修复
- 🔗 对接 EdgeTunnel 指南
- ❓ 常见问题
| 模块 | 说明 |
|---|---|
| 🌐 多模式筛选 | 全局最优 TopN / 分国家最优 TopN |
| ⚡ TCP 连接测试 | 并发测延迟,可设成功率阈值 |
| 🔍 可用性二次检测 | API 验证代理能力 |
| 📶 真实带宽测速 | curl 下载测速,实测吞吐量 |
| 🧩 多源自适应聚合 | 支持多个数据源,自动识别并解析任意格式(标准代码、中文名、emoji国旗、JSON等),统一转换为标准格式 |
| 🚫 屏蔽国家过滤 | DNS 更新时屏蔽指定国家(仅作用于 DNS 更新环节) |
| 🌍 国家过滤前置 | TCP 测试前即过滤指定国家(减少无效测试) |
| ☁️ Cloudflare DNS 更新 | 批量替换同名 A 记录 |
| 📬 微信实时通知 | 集成 WxPusher,异常/结果推送 |
| 🔄 定时自动运行 | Windows 计划任务 / Linux cron,每 5 分钟 |
| 🚀 一键部署 | setup.ps1 / setup.sh 自动安装依赖并配置 |
| 📤 GitHub 自动同步 | ip.txt 推送至仓库,方便订阅 |
| 🔒 隐私保护 | .gitignore 忽略敏感文件 |
| 🖥️ 跨平台兼容 | 同时支持 Windows 和 Linux |
| 🔧 Fork 修复 | 内置 update_fork.ps1 / update_fork.sh,解决 fork 后的历史冲突与认证问题 |
| 文件 | 说明 |
|---|---|
main.py |
核心优选程序(抓取、测试、筛选、更新、推送) |
config.json |
所有运行参数的配置文件(含详细注释) |
git_sync.ps1 |
Windows 推送脚本(强制推送 ip.txt 到 GitHub) |
git_sync.sh |
Linux 推送脚本(强制推送 ip.txt 到 GitHub) |
setup.ps1 |
Windows 一键部署脚本(安装依赖并配置计划任务) |
setup.sh |
Linux 一键部署脚本(安装依赖并配置 cron) |
ip.txt |
最终优选节点列表(每次运行覆盖) |
update_fork.ps1 |
Windows 仓库修复脚本(解决 fork 后冲突/认证) |
update_fork.sh |
Linux 仓库修复脚本(解决 fork 后冲突/认证) |
- 操作系统:Windows 10+ / Windows Server 2016+ 或 Linux(Ubuntu/Debian/CentOS 等)
- 必备软件:
- Python 3.7+
- Git
- curl(需在系统 PATH 中可用)
- Python 依赖:
requests库
-
获取项目文件
- 方式一(推荐):点击本仓库页面的绿色
Code按钮 →Download ZIP,下载压缩包后解压到本地。 - 方式二(熟悉 Git 的用户):使用命令行克隆仓库:
git clone https://github.com/你的用户名/仓库名.git cd 仓库名
- 方式一(推荐):点击本仓库页面的绿色
-
配置各项令牌(见下一节)
根据需求获取并填写 GitHub Token、Cloudflare API Token 和 WxPusher 凭证。
💡 部署脚本会自动安装依赖、创建
.gitignore并配置定时任务(每 5 分钟整点运行)。
若你希望启用 GitHub 自动推送、Cloudflare DNS 更新或微信通知,请参考下表获取对应令牌。
| GitHub Personal Access Token | Cloudflare API Token | WxPusher 微信通知 |
|---|---|---|
| 1. 登录 GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic) | 1. 登录 Cloudflare → My Profile → API Tokens → Create Token → Create Custom Token | 1. 访问 WxPusher 后台,微信扫码登录 |
| 2. Generate new token (classic),Note 任意填 | 2. Token name 任意;Permissions: Zone → DNS → Edit;Zone Resources: 选择你的域名 |
2. 左侧菜单“应用管理”→“应用信息”→“新增应用”,填写名称后创建 |
3. Expiration 必须选 No expiration |
3. 点击 Continue to summary → Create Token | 3. 复制保存 AppToken(仅显示一次) |
| 4. Select scopes: 仅勾选 repo(自动勾全) | 4. 保存 Token | 4. 左侧“关注应用”→微信扫码关注公众号 |
| 5. Generate token,保存 | 5. Zone ID 在域名概览页右侧“API”栏目复制 | 5. 公众号菜单“我的”→“我的UID”获取 UID |
填入 git_sync.ps1 / git_sync.sh 的 github_token |
填入 config.json 的 CF_API_TOKEN 和 CF_ZONE_ID |
填入 config.json 的 WXPUSHER_APP_TOKEN 和 WXPUSHER_UIDS |
💡 若不需要某项功能,可跳过对应步骤或在配置中关闭开关:
- 无需微信通知:
config.json中设ENABLE_WXPUSHER: false- 无需 GitHub 推送:
config.json中设GITHUB_SYNC_MAX_RETRIES: 0- 无需 Cloudflare DNS 更新:
config.json中设CF_ENABLED: false
以管理员身份打开 PowerShell,逐行执行以下命令:
# 1. 进入项目目录
cd "C:\你的项目路径\cfnb"
# 2. 若提示脚本禁用,临时绕过(可选)
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
# 3. 运行部署脚本
.\setup.ps1
# 4. 编辑推送脚本,填入 GitHub 令牌等信息
notepad git_sync.ps1
# 5. 测试运行
python main.py在终端中逐行执行以下命令:
# 1. 进入项目目录
cd /path/to/cfnb
# 2. 赋予执行权限
chmod +x setup.sh
# 3. 运行部署脚本(需要 sudo 安装软件包)
sudo ./setup.sh
# 4. 编辑推送脚本,填入 GitHub 令牌等信息
nano git_sync.sh
# 5. 测试运行
python3 main.py📝 手动部署详细步骤(点击展开)
- 安装 Python 3(勾选 “Add Python to PATH”)。
- 安装 Git 和 curl(curl 需加入 PATH)。
- 在项目目录打开命令提示符,安装依赖:
pip install requests
- (可选)手动创建计划任务:
- 按
Win + R,输入taskschd.msc打开任务计划程序。 - 创建任务,名称
Cloudflare IP 优选,勾选“不管用户是否登录都要运行”和“使用最高权限运行”。 - 触发器:新建 → 开始任务“按预定计划” → 设置“一次”,开始时间为下一个整5分钟时刻;高级设置中勾选“重复任务间隔”,选择“5分钟”,持续时间“无限期”。
- 操作:新建 → 操作“启动程序”,程序填写
python.exe路径,参数填写main.py完整路径,起始于填写项目目录。 - 在 “设置” 选项卡中,将 “优先级” 下拉框设为 “高”。
- 点击确定,输入 Windows 登录密码保存。
- 按
- 安装系统依赖(以 Debian/Ubuntu 为例):
sudo apt update sudo apt install -y python3 python3-pip git curl
- 安装 Python 依赖:
pip3 install requests
- 赋予推送脚本执行权限(如果需要):
chmod +x git_sync.sh
- (可选)添加 cron 任务:
(crontab -l 2>/dev/null; echo "*/5 * * * * cd $(pwd) && nice -n -10 /usr/bin/python3 $(pwd)/main.py >> $(pwd)/cron.log 2>&1") | crontab -
- 验证:
crontab -l
适用于 fork 或修改远程仓库后,出现以下任一问题的情况:
git pull报错:fatal: refusing to merge unrelated histories- 推送时每次弹出浏览器要求登录
运行对应平台的一键修复脚本即可(前提:已按前文填写好 config.json 与推送脚本中的令牌)
| 平台 | 命令 |
|---|---|
| Windows PowerShell | .\update_fork.ps1 |
| Linux | chmod +x update_fork.sh && ./update_fork.sh |
脚本会自动完成:
- 备份现有配置文件(可随时恢复)
- 设置免认证远程地址
- 强制对齐本地与远程仓库
- 将你的令牌安全注入最新版本的文件(不覆盖其他参数)
💡 运行成功后,
main.py即可正常自动推送,不再有任何冲突或弹窗。
| 平台 | 方式 | 行为 |
|---|---|---|
| Windows | 计划任务 Cloudflare IP 优选 |
从下一个整 5 分钟开始,之后每 5 分钟永久重复 |
| Linux | cron 定时任务 | 分钟字段为 */5,整点对齐 |
日志查看:
- Windows:任务计划程序中查看历史记录。
- Linux:
tail -f cron.log
Note
默认参数基于 2核2G 云服务器 测试通过。若在 软路由、树莓派或低配 PC 上运行,建议适当降低 MAX_WORKERS、BANDWIDTH_WORKERS。
所有参数均位于 config.json,以下为逐项说明。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
USE_GLOBAL_MODE |
boolean |
true |
true=全局优选;false=分国家优选 |
GLOBAL_TOP_N |
int |
15 |
全局模式保留节点数 |
PER_COUNTRY_TOP_N |
int |
1 |
分国家模式每国保留节点数 |
BANDWIDTH_CANDIDATES |
int |
90 |
进入测速的候选节点数 |
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
TCP_PROBES |
int |
3 |
每个节点 TCP 测试次数 |
MIN_SUCCESS_RATE |
float |
1.0 |
最低成功率阈值(0.0~1.0) |
TIMEOUT |
float |
2.0 |
单次 TCP 连接超时(秒) |
SOCKET_DEFAULT_TIMEOUT |
int |
3 |
全局 Socket 默认超时(秒),防止永久阻塞 |
PROGRESS_PRINT_INTERVAL |
float |
1 |
进度打印刷新间隔(秒),避免频繁 I/O |
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
FILTER_COUNTRIES_ENABLED |
boolean |
false |
是否启用国家过滤 |
ALLOWED_COUNTRIES |
array |
["US"] |
允许的国家代码列表 |
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
FILTER_BLOCKED_COUNTRIES_ENABLED |
boolean |
true |
是否在 DNS 更新阶段屏蔽特定国家的节点 |
BLOCKED_COUNTRIES |
array |
BD, BI, BY, CD, CF, CN, CU, DE, ET, HK,IR, KP, LY, MO, NG, NL, PK, RU, SD, SO,SY, TH, TW, UA, VE, VN, YE, ZW |
DNS 更新时需要屏蔽的国家代码列表(共 28 个) |
DNS_UPDATE_TARGET_COUNT |
int |
15 |
DNS 更新时目标 IP 数量(仅当调用时未指定时使用) |
说明:
- 该过滤仅作用于 Cloudflare DNS 批量更新环节,不会影响
ip.txt的内容和 GitHub 推送。- DNS 更新过滤顺序:端口 443 → IPv6 落地 → 屏蔽国家。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
ENABLE_WXPUSHER |
boolean |
true |
是否启用微信通知 |
WXPUSHER_APP_TOKEN |
string |
"your_app_token_here" |
【必填】 WxPusher 的 APP_TOKEN |
WXPUSHER_UIDS |
array |
["your_uid_here"] |
【必填】 接收通知的用户 UID 列表 |
WXPUSHER_API_URL |
string |
"http://wxpusher.zjiecode.com/api/send/message" |
消息发送 API 地址 |
NOTIFY_TIMEOUT |
int |
3 |
微信通知 API 读取超时(秒) |
NOTIFY_CONNECT_TIMEOUT |
int |
3 |
微信通知 API 连接超时(秒) |
💡 若不需要通知,将
ENABLE_WXPUSHER设为false即可。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
CF_ENABLED |
boolean |
true |
是否启用 DNS 自动更新 |
CF_API_TOKEN |
string |
"your_CF_API_TOKEN" |
Cloudflare API 令牌(Zone:DNS:Edit 权限) |
CF_ZONE_ID |
string |
"your_CF_ZONE_ID" |
域名区域 ID |
CF_DNS_RECORD_NAME |
string |
"your_CF_DNS_RECORD_NAME" |
完整子域名 |
CF_TTL |
int |
60 |
DNS 记录 TTL(秒) |
CF_PROXIED |
boolean |
false |
是否启用 Cloudflare CDN 代理 |
CF_DNS_CONNECT_TIMEOUT |
int |
3 |
Cloudflare API 连接超时(秒) |
CF_DNS_READ_TIMEOUT |
int |
3 |
Cloudflare API 读取超时(秒) |
💡 若不需要 DNS 更新,将
CF_ENABLED设为false即可。
Note
本工具支持多个数据源同时使用,并内置了完全自适应的解析引擎。无论数据源是标准 IP:端口#代码 格式,还是中文标签、emoji国旗、JSON数组/对象,甚至是混合无关文字的标签,程序都能自动识别并统一转换为标准格式。添加新数据源只需在 ADDITIONAL_SOURCES 数组中新增一个对象,无需任何代码修改。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
ADDITIONAL_SOURCES |
array |
[] |
所有数据源列表,每个对象包含 url(必填)和 enabled(可选,默认true)。程序会自动识别并解析任何常见格式(标准代码/中文/emoji/JSON等) |
FETCH_MAX_RETRIES |
int |
3 |
获取节点列表失败时的最大重试次数 |
FETCH_RETRY_DELAY |
int |
3 |
获取节点列表重试间隔(秒) |
FETCH_TIMEOUT |
int |
3 |
获取节点列表读取超时(秒) |
FETCH_CONNECT_TIMEOUT |
int |
3 |
获取节点列表连接超时(秒) |
OUTPUT_FILE |
string |
"ip.txt" |
最终结果保存文件名 |
🔧 高级参数(可用性 / 带宽 / 并发 / 重试)
可用性检测参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
TEST_AVAILABILITY |
boolean |
true |
是否进行可用性二次筛选 |
AVAILABILITY_CHECK_API |
string |
"https://api.090227.xyz/check" |
可用性检测 API 地址 |
AVAILABILITY_TIMEOUT |
int |
3 |
可用性 API 读取超时(秒) |
AVAILABILITY_CONNECT_TIMEOUT |
int |
3 |
可用性 API 连接超时(秒) |
AVAILABILITY_RETRY_MAX |
int |
2 |
可用性检测最大重试轮数 |
AVAILABILITY_RETRY_DELAY |
int |
3 |
可用性检测重试间隔(秒) |
FILTER_IPV6_AVAILABILITY |
boolean |
true |
仅作用于 DNS:是否过滤落地仅 IPv6 的节点(ipv6_only) |
💡 IPv6 过滤逻辑:通过 API 返回的
inferred_stack判断,仅淘汰ipv6_only节点,保留ipv4_only和dual_stack节点。
带宽测速参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
BANDWIDTH_SIZE_MB |
int |
0.5 |
测速下载文件大小(MB) |
BANDWIDTH_TIMEOUT |
int |
3 |
单个节点带宽测速超时(秒) |
BANDWIDTH_RETRY_MAX |
int |
2 |
带宽测速整体重试轮数 |
BANDWIDTH_RETRY_DELAY |
int |
3 |
带宽测速重试间隔(秒) |
BANDWIDTH_URL_TEMPLATE |
string |
"https://speed.cloudflare.com/__down?bytes={bytes}" |
测速 URL 模板 |
BANDWIDTH_PROCESS_BUFFER |
int |
2 |
curl 进程额外缓冲时间(秒) |
BANDWIDTH_CONNECT_TIMEOUT |
int |
3 |
curl 测速连接超时(秒) |
并发控制参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
MAX_WORKERS |
int |
200 |
TCP 并发测试最大线程数 |
AVAILABILITY_WORKERS |
int |
10 |
可用性检测并发数 |
BANDWIDTH_WORKERS |
int |
10 |
带宽测速并发数(建议不超过 10) |
FALLBACK_WORKERS |
int |
10 |
备用国家查询的并发线程数(当标签无法识别时自动调用可用性API查询国家) |
重试策略配置
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
DNS_UPDATE_MAX_RETRIES |
int |
3 |
DNS 更新最大重试次数 |
DNS_UPDATE_RETRY_DELAY |
int |
3 |
DNS 更新重试间隔(秒) |
GITHUB_SYNC_MAX_RETRIES |
int |
3 |
GitHub 推送最大重试次数 |
GITHUB_SYNC_RETRY_DELAY |
int |
3 |
GitHub 推送重试间隔(秒) |
GIT_SYNC_PROCESS_TIMEOUT |
int |
180 |
Git 同步子进程最大运行时间(秒) |
💡 快速配置建议
- 通常只需修改
ALLOWED_COUNTRIES、WXPUSHER_APP_TOKEN、WXPUSHER_UIDS。- 启用 DNS 更新需正确填写
CF_API_TOKEN、CF_ZONE_ID、CF_DNS_RECORD_NAME。- 网络不稳定时可 ↑
TCP_PROBES/TIMEOUT,↓MIN_SUCCESS_RATE/MAX_WORKERS。- 希望更快出结果可 ↓
BANDWIDTH_CANDIDATES或BANDWIDTH_SIZE_MB。
程序运行完成后,会在本地生成 ip.txt 文件,每行格式为 IP地址:端口#国家代码,例如:
104.16.x.x:443#US
162.159.x.x:443#HK
重要说明:
ip.txt中保存的是基于带宽测速排序的结果,以确保 GitHub 推送的节点列表完整且不丢失任何高速 IP。- Cloudflare DNS 批量更新环节会额外应用
FILTER_IPV6_AVAILABILITY(过滤落地 IPv6)和BLOCKED_COUNTRIES(屏蔽特定国家)两项过滤,仅将符合条件的 IP 写入 DNS 记录。
若你已配置 GitHub 自动同步,该文件将自动推送至远程仓库,订阅链接请参考 配置 GitHub 自动同步 章节末尾。
本工具支持将优选出的 IP 地址列表自动更新到 Cloudflare DNS 的同名 A 记录,实现解析层面的多 IP 轮询负载均衡。
- 按照 获取必要令牌 中的步骤获取 Cloudflare API Token(需具有 Zone:DNS:Edit 权限)。
- 在 Cloudflare 域名概览页面右侧复制你的 Zone ID。
编辑 config.json,找到 Cloudflare DNS 配置部分,填入你的信息:
"CF_ENABLED": true,
"CF_API_TOKEN": "your_CF_API_TOKEN",
"CF_ZONE_ID": "your_CF_ZONE_ID",
"CF_DNS_RECORD_NAME": "your_CF_DNS_RECORD_NAME",
"CF_TTL": 60,
"CF_PROXIED": false| 参数 | 说明 |
|---|---|
CF_ENABLED |
设为 true 启用 DNS 自动更新 |
CF_API_TOKEN |
上一步获取的 API Token |
CF_ZONE_ID |
上一步获取的 Zone ID |
CF_DNS_RECORD_NAME |
要更新的完整子域名 |
CF_TTL |
DNS 记录 TTL(秒),免费套餐最低 120 |
CF_PROXIED |
是否启用 Cloudflare CDN 代理(橙色云朵),通常设为 false |
💡 若不需要 DNS 更新功能,将
CF_ENABLED设为false即可。
- 手动运行一次优选程序:
python main.py(Windows)或python3 main.py(Linux)。 - 程序运行结束后,观察控制台输出。若看到
✅ Cloudflare DNS 批量更新成功!,则配置成功。
每次运行时,脚本会:
- 查询目标子域名下现有的所有 A 记录。
- 从带宽测速结果中按速度顺序挑选落地 IPv4 的节点(若启用
FILTER_IPV6_AVAILABILITY)。 - 利用 Cloudflare 批量 API 先删除所有旧记录,再创建新记录,实现原子替换。
- 免费套餐单次批量操作最多支持 200 条记录,足够使用。
- 若候选池中落地 IPv4 节点不足目标数量,则更新实际可用的数量,不会强制凑满。
- 全量替换在极短时间内可能导致解析短暂为空,但对绝大多数场景无影响。
本工具支持每次运行后将 ip.txt 自动推送到你指定的 GitHub 仓库,方便通过 Raw 链接订阅节点列表。
- 登录 GitHub,点击右上角
+→ New repository。 - Repository name 可任意填写(如
cf-ip)。 - 仓库类型选择 Private(推荐)或 Public。
- 不要勾选 “Add a README file”、“.gitignore” 等初始化选项。
- 点击 Create repository。
在项目根目录下打开终端(Windows 为 PowerShell,Linux 为终端),依次执行以下命令:
# 1. 初始化 Git 仓库(如果尚未初始化)
git init
# 2. 关联远程仓库(将下面网址中的 你的用户名 和 仓库名 替换成你自己的)
git remote remove origin 2>/dev/null
git remote add origin https://github.com/你的用户名/仓库名.git
# 3. 拉取远程默认分支名,并切换到该分支(自动对齐,无需手动指定 main/master)
git fetch origin
git checkout -b temp-branch 2>/dev/null || git checkout main 2>/dev/null || git checkout master 2>/dev/null
git branch -M $(git remote show origin | grep "HEAD branch" | cut -d " " -f5) 2>/dev/null || git branch -M main💡 如果你是通过网页下载的 ZIP 压缩包解压的,必须执行以上全部命令。
如果你是用git clone命令下载的,则本地仓库已自动关联远程,可以跳过这一步,直接进入第三步。
-
按照 获取必要令牌 中的步骤获取 GitHub Personal Access Token(需勾选
repo权限,过期时间设为 No expiration)。 -
编辑对应平台的推送脚本:
- Windows:用文本编辑器打开
git_sync.ps1 - Linux:用文本编辑器打开
git_sync.sh
- Windows:用文本编辑器打开
-
将脚本开头部分的四个变量替换为你的真实信息:
# Windows (git_sync.ps1) $github_token = "your_github_personal_access_token_here" $github_username = "your_github_username" $repo_name = "your_repo_name" $branch = "your_branch"
# Linux (git_sync.sh) github_token="your_github_personal_access_token_here" github_username="your_github_username" repo_name="your_repo_name" branch="your_branch"
- 确保项目目录下已有
ip.txt文件(可先手动运行一次python main.py生成)。 - 手动执行推送脚本测试:
- Windows:双击运行
git_sync.ps1或在 PowerShell 中执行.\git_sync.ps1 - Linux:执行
./git_sync.sh
- Windows:双击运行
- 若终端显示
✅ ip.txt 已推送到 GitHub,则配置成功。 - 之后每次运行
main.py,程序都会自动调用推送脚本,无需人工干预。
🚨 推送报错常见原因
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
remote origin already exists |
远程仓库已关联过 | 执行 git remote set-url origin https://github.com/你的用户名/仓库名.git 直接修改地址 |
failed to push some refs |
远程有本地没有的文件(如 README) | 首次推送使用 git push -f origin main 强制覆盖( |
Permission denied 或 403 |
Token 无效或权限不足 | 检查 Token 是否勾选 repo 权限,且未过期;重新生成 Token 并替换 |
src refspec main does not match any |
本地分支名不是 main |
执行 git branch 查看实际分支名,修改推送脚本中的 $branch 变量与之相同 |
Warning
关于私有仓库的特别提醒
如果你将仓库设置为 Private(私有),则通过 Raw 链接访问 ip.txt 时必须在 URL 后附加 ?token=你的令牌 参数才能获取内容,例如:
https://raw.githubusercontent.com/用户名/仓库名/refs/heads/分支名/ip.txt?token=xxxxxx
但请注意,部分代理工具或订阅解析器可能无法正确处理带 Token 参数的 URL,原因包括:
- 不支持自定义请求头(GitHub 要求完整的 User-Agent 等头信息)
- 无法解析带查询参数的链接
- 防火墙或网络环境限制
因此,如果你希望将 ip.txt 作为订阅链接供代理工具使用,强烈建议将仓库设为 Public(公开)。
公开仓库的 Raw 链接无需 Token 即可访问,兼容性最佳:
https://raw.githubusercontent.com/用户名/仓库名/refs/heads/分支名/ip.txt
推送成功后,访问 https://raw.githubusercontent.com/你的用户名/仓库名/refs/heads/分支名/ip.txt 即可获取最新节点列表,供代理工具订阅使用。
💡 若不需要 GitHub 同步功能,可在
config.json中设置GITHUB_SYNC_MAX_RETRIES: 0即可关闭。
EdgeTunnel (EDTunnel) 是基于 Cloudflare Workers 的隧道工具。使用本项目筛选出的 ip.txt 可以显著提升连接速度和稳定性。
- 复制你的 GitHub Raw 链接:
https://raw.githubusercontent.com/你的用户名/仓库名/refs/heads/分支名/ip.txt - 打开 EdgeTunnel 控制面板,点击菜单栏的 “优选订阅生成”。
- 在 “优选订阅模式” 区域,选择 “自定义订阅(支持汇聚订阅)”。
- 点击 “订阅接口” 按钮,在 API URL 输入框中粘贴上一步获取的 GitHub Raw 链接。
💡 如需指定端口,可在链接后添加
?port=443。 - (可选)勾选 “将优选作为 PROXYIP”。
- 点击 “可用性验证”,系统将验证 API 并拉取节点列表。
- 检查无误后,点击 “追加API” 按钮将链接加入自定义订阅地址。
- 点击 “保存” 按钮完成配置。
- 打开 EdgeTunnel 控制面板,点击菜单栏的 “优选订阅生成”。
- 在 “优选订阅模式” 区域,选择 “自定义订阅(支持汇聚订阅)”。
- 在 “自定义订阅地址” 输入框中直接粘贴节点地址,每行一个,例如:
104.16.x.x:443#US 162.159.x.x:443#HK - 点击 “保存” 按钮,即可手动指定优选的节点列表。
如果你已启用 Cloudflare DNS 批量更新,可以直接将你的子域名(如 cf.yourdomain.com)填入 EdgeTunnel:
方式一:通过“优选订阅生成”
- 打开 “优选订阅生成” 页面,选择 “自定义订阅(支持汇聚订阅)”。
- 在 “自定义订阅地址” 输入框中,填入你的子域名(例如
cf.yourdomain.com)。 - 点击 “保存” 按钮。
方式二:通过“Cloudflare CDN 访问设置”
- 进入 “Cloudflare CDN 访问设置” 页面。
- 在 “PROXYIP” 输入框中,填入你的子域名(例如
cf.yourdomain.com)。 - 点击 “保存” 按钮。
该域名会自动解析到当前最优的多个 IP 之一,实现零配置动态切换。
- 低延迟:
main.py已经通过 TCP 握手筛选出了延迟最低的节点。 - 高带宽:结果经过真实
curl下载测试,排在前面的节点具有更强的并发吞吐能力。 - 高可用:通过
AVAILABILITY_CHECK_API过滤了那些能 Ping 通但无法正常通过代理请求的无效 IP。 - 自动更新:DNS 记录随优选结果自动刷新,无需手动修改配置。
- GitHub 缓存:GitHub Raw 链接有一定的 CDN 缓存时间(通常为 5 分钟左右)。如果刚运行完脚本发现链接内容没变,请稍等片刻。
- 网络环境:建议在你的主运行环境(如家庭软路由或主力 PC)运行此脚本,因为不同网络环境下筛选出的最优 IP 可能不同。
- DNS 生效时间:修改 DNS 记录后受 TTL 影响,全球生效可能需要几分钟,但通常 Cloudflare 更新是实时的。
🌐 代理环境影响
会影响,尤其全局/TUN 模式。
| 测试阶段 | 是否走代理 | 说明 |
|---|---|---|
| TCP 延迟测试 (Socket) | ❌ 直连 | 反映本机到节点的 RTT |
| 带宽测速 (curl) | ❌ 直连 | 反映本机到 CDN 的速度 |
| API 请求类 (requests) | ✅ 跟随系统代理 | 获取节点、可用性、微信通知等 |
| Git 推送 (git) | ✅ 跟随系统代理 | 涉及 github.com 等 |
各阶段对应域名见上方“涉及域名”列表。
涉及域名:
cm.edu.kg · 090227.xyz · cloudflare.com · zjiecode.com · pages.dev · github.com · githubusercontent.com
建议:
- 检查本机能否直连上述域名 → 能通设
DIRECT,不通设PROXY - 运行程序时关闭全局模式 / TUN 模式
- 不确定网络情况就直接退出代理工具再运行
🔌 依赖与安装
-
提示
ModuleNotFoundError: No module named 'requests'
请执行pip install requests(Windows) 或pip3 install requests(Linux)。 -
带宽测速被跳过
请确保系统已安装curl且位于 PATH 环境变量中。 -
Linux 下
git_sync.sh权限被拒绝
执行chmod +x git_sync.sh赋予执行权限。
📤 GitHub 推送与同步
-
GitHub 推送失败
- 检查
git_sync.ps1/git_sync.sh中的 Token、用户名、仓库名是否正确。 - 确保 Token 具备
repo权限。 - 确认本地 Git 已正确配置用户信息(
git config --global user.name/email)。
- 检查
-
GitHub 推送时提示权限错误或 403
- 请确认令牌具有
repo权限,且未过期。创建令牌时务必勾选 repo 全部子项,并将过期时间设为 No expiration。
- 请确认令牌具有
-
git pull报错fatal: refusing to merge unrelated histories- 通常发生在 Fork 或手动修改远程仓库后。运行对应平台的一键修复脚本即可:
- Windows:
.\update_fork.ps1 - Linux:
./update_fork.sh
- Windows:
- 通常发生在 Fork 或手动修改远程仓库后。运行对应平台的一键修复脚本即可:
-
每次推送都弹出浏览器要求登录
- 运行上述
update_fork.ps1或update_fork.sh,自动将远程地址设为免认证模式。
- 运行上述
☁️ Cloudflare DNS 更新
-
Cloudflare DNS 更新失败
- 检查
CF_API_TOKEN权限、CF_ZONE_ID、CF_DNS_RECORD_NAME是否正确。 - 程序内置重试机制,全部失败时会通过微信通知(如已启用)。
- 检查
-
为什么我的 DNS 记录数量少于
GLOBAL_TOP_N?
如果你启用了FILTER_IPV6_AVAILABILITY,且候选池中落地 IPv4 的节点总数不足目标数量,则 DNS 只会更新实际可用的节点数。这是正常现象,你可以通过增加BANDWIDTH_CANDIDATES来扩大候选池。
🔍 检测与过滤
- 可用性检测全部失败
若 API 接口异常,程序会自动跳过此步骤并回退到 TCP 筛选结果,同时发送微信提醒(如已配置)。
🔒 隐私与其他
- 隐私保护
自动生成的.gitignore文件会忽略config.json、git_sync.ps1和git_sync.sh,防止敏感信息被提交到公开仓库。
许可证:本项目采用 MIT License 开源。