点一下更新,客户端做的事分两步。先把订阅地址当成一个网址去下载,再把下回来的文字解析成节点。两步都可能出错,报出来的话也不一样。
我把 Clash Verge Rev 2.5.2 和 v2rayN 7.24.9 处理订阅的源码读了一遍,又对照了开源面板 Xboard 生成订阅的代码。本站收录的机场各用什么面板,我没有逐家核实,下文说到服务器那头怎么处理,都以 Xboard 为例。
一次更新走哪条网络,两个客户端做法不同
Clash Verge Rev 的订阅卡片右键菜单里有更新和更新(代理)两项。点更新,它先直接连订阅服务器,失败了后台会自己换路重试,先借内核的代理,再借系统代理,三条路都不通才报错。换路成功的话,界面会提示使用 Clash 代理更新成功。单次请求默认等 20 秒,这个数在订阅的编辑信息里叫 HTTP 请求超时。更新失败时原来的配置原样保留,节点还能接着用。
v2rayN 不会自动换路,要自己选。订阅分组菜单里有四项,更新全部订阅和更新当前订阅各分不通过代理、通过代理两种。通过代理借的是 v2rayN 自己的 socks 端口,走不通会退回直连再试一次,每次请求最多等 15 秒。过程逐行打在主界面下方的信息栏里,顺利的话是这几行。
更新订阅开始
开始获取订阅内容
获取订阅内容成功
开始解析和处理订阅内容
更新订阅结束
停在哪一行,就是哪一步出了事。
两个客户端请求时都会在 User-Agent 里报上自己的名字和版本,Clash Verge Rev 写的是 clash-verge/v2.5.2,v2rayN 写的是 v2rayN/7.24.9。服务器靠这一行决定发哪种格式,后面好几个问题都和它有关。
九种报错原文,各自卡在下载还是解析
| 看到的报错 | 客户端 | 卡在哪一步 |
|---|---|---|
failed to fetch remote profile with status 403 Forbidden |
Clash Verge Rev | 下载,服务器拒绝了 |
| 信息栏里带 403 的英文报错,后面跟着无效的订阅内容 | v2rayN | 下载,服务器拒绝了 |
| 状态码是 404 | 两个都会有 | 下载,地址不对 |
failed to fetch remote profile,后面没有状态码 |
Clash Verge Rev | 下载,没连上服务器 |
invalid peer certificate: UnknownIssuer |
Clash Verge Rev | 下载,证书不被信任 |
the remote profile data is invalid yaml |
Clash Verge Rev | 解析,回来的不是 Clash 格式 |
profile does not contain `proxies` or `proxy-providers` |
Clash Verge Rev | 解析,配置里没有节点 |
| 获取订阅内容成功,紧跟着导入订阅内容失败 | v2rayN | 解析,内容认不出来 |
| 订阅配置校验失败,变更已撤销 | Clash Verge Rev | 内核校验,有节点或字段内核不认 |
404 最简单,链接复制错了,或者复制成了面板网页的地址,回用户中心用复制按钮重新拿一次。下面按剩下几类分开讲。
403 说明面板认出了请求,但不给节点
Xboard 返回 403 分两种情况。一种是链接里的 token 缺了或者对不上,响应正文分别写着 token is null 和 token is error,订阅被重置过的旧链接就落在这里。另一种是账户不可用,被封禁、已经到期、套餐额度为零,这时正文是空的。
所以看到 403,先登录用户中心看到期日,再确认手里的链接是不是最新的。自己或别人点过重置订阅,就重新复制一份,每台设备都要换。重置会同时换掉哪些东西,订阅链接为什么不能外传里对着源码讲过。
流量用完反而不会走到 403。Xboard 判断账户能不能拿订阅时,只看封禁、到期和额度,不看已经用掉多少,所以流量见底以后订阅照样能更新成功。节点服务器那边的判断更严,只放行已用量小于额度的账户,结果就是更新一切正常、节点全部超时。碰到这种情况,按连不上的排查顺序看一眼订阅卡片就明白了,流量怎么算的见流量倍率和重置日。
Clash Verge Rev 的常见问题里另有一条导入订阅报错 401,官方的办法是删掉配置目录里的所有文件再重启。这一步会清掉本地全部订阅和设置,设置页配置目录那一项的说明也要求先备份。同一条链接换个客户端能正常更新,才说明毛病在本地,这时再动手。
报错里没有状态码,请求没到服务器
没有状态码,意思是请求连服务器都没见着。订阅地址在当前网络下打不开就是这样。用 Clash Verge Rev 的话,它已经替你试过内核代理和系统代理,三条路都失败,说明手上也没有能用的节点。
先换网络。手机从 Wi-Fi 换到流量再更新,电脑连手机热点也行。
换了网络还不行,就找一台能打开订阅地址的设备把内容取下来,存成文件带回来导入。这里有个坑,用浏览器直接打开订阅地址,浏览器的 UA 不在 Xboard 认识的名单里,拿到的是分享链接格式。要给 Clash Verge Rev 用,得用文末那条 curl 命令带上它的 UA 去取。文件拿到以后,在订阅页点新建,类型选 Local,再选这个文件,官方文档写明 1.6.2 以后也能把文件直接拖进订阅页。v2rayN 认的是分享链接,把内容复制下来,在配置项菜单里点从剪贴板导入分享链接。这样导进来的内容不会自己更新,网络恢复以后换回订阅地址。
自己写配置、用 proxy-providers 引入节点的,mihomo 文档里给 proxy-providers 留了一个 proxy 字段,填上配置里已有的代理组名,更新节点时就经过这个代理去下载。
proxy-providers:
jichang:
type: http
url: "https://你的订阅地址"
interval: 86400
proxy: 节点选择
UnknownIssuer 这个报错单独说。它的意思是订阅服务器出示的证书,签发者不被信任。Clash Verge Rev 文档给的办法是在编辑信息里勾选允许无效证书(危险),勾上以后客户端不再核对证书,中间有人换掉内容也看不出来。我会先查两样东西。一是系统时间,证书有效期按时间判断,钟差太远会校验失败。二是杀毒软件的 HTTPS 扫描和公司网络的上网审计,它们会在中间解密再用自己的证书重新加密,签发者自然对不上。
内容下来了,却解析不出节点
这一步服务器已经回了 200,问题出在回来的东西和客户端要的对不上。
Xboard 决定发什么格式,先看链接里有没有 flag 参数,没有就看 User-Agent。UA 里带 verge、flclash、meta、clashmetaforandroid 或 nekobox 的,拿到 Clash Meta 的 YAML。带 v2rayn、v2rayng、passwall、ssrplus 或 sagernet 的,拿到分享链接。一个都不沾的,也按分享链接发。
从这张名单能推出两种失败。在 Clash Verge Rev 的编辑信息里改过 User Agent,填了个名单外的名字,回来的就是分享链接,客户端报 invalid yaml。清空那一栏,它会恢复默认的 clash-verge/v2.5.2。反过来,用 v2rayN 导入了带 flag=clash 一类参数的链接,拿到的是 YAML。v2rayN 7.24.9 不会为此报错,它把整份 Clash 配置当成一条自定义配置导进来交给 mihomo 内核跑,列表里只多出一行。想要一个个节点,回用户中心换通用订阅或标着 v2rayN 的那条。
还有一种是服务器回了一个网页。登录页、拦截页、要人点一下验证的页面都是 HTML。Clash Verge Rev 碰到它报 invalid yaml,v2rayN 7.24.9 会识别出这是网页,报导入订阅内容失败。
v2rayN 在这里有个细节。它在解析新内容之前,先把这条订阅下的旧节点删了,新内容解析不出来,列表就空了。下载失败时不会走到这一步,旧节点还在。Clash Verge Rev 在任何一步失败时都保留旧配置。所以同样是更新出错,v2rayN 用户可能会看到一个空列表,这不代表账户出了事。
有人会想用订阅转换把格式凑上。v2rayN 的订阅分组设置里有一栏订阅转换目标类型,填了它,v2rayN 会把你的订阅地址交给一个转换服务,没在设置里改过订阅转换网址的话,用的是内置列表里第一个公共服务 sub.xeton.dev。订阅地址就是账户凭据,交出去之前想清楚。
更新成功了,节点却少了一批
Xboard 会按客户端再筛一遍节点。每种输出格式有一张能装的协议清单,装不下的节点直接去掉。版本也要查,代码里写着给 v2rayN 的 Hysteria2 节点要求版本不低于 6.31,给 v2rayNG 的要求不低于 1.9.5,版本号取自 User-Agent。客户端太旧,或者 UA 里的版本号被改成了旧的,某一类节点就会整批消失。升级客户端,或者把自定义的 UA 清掉。
Clash Verge Rev 这边还有一道关。下载和解析都过了,内核还要把整份配置校验一遍,某个节点的协议或参数内核不认,就提示订阅配置校验失败,变更已撤销,后面附着错误详情。这时要升级的是客户端和它带的内核,订阅本身没问题。
自己请求一次,看服务器回了什么
想绕开客户端看服务器的原始回应,就自己发一次请求,User-Agent 照着客户端的写法填。Windows 里写 curl.exe,macOS 和 Linux 写 curl。
curl.exe -s -D - -o sub.txt -A "clash-verge/v2.5.2" "https://你的订阅地址"
-D - 把响应头打在屏幕上,-o sub.txt 把正文存进文件。先看第一行的状态码,200 以外的对照上面的表。再找 subscription-userinfo 这一行,Xboard 给 Clash 格式的回应里会带上它,upload 和 download 是已用的上传下载量,total 是总额度,expire 是到期时间的时间戳,Clash Verge Rev 订阅卡片上的流量和到期日就是从这里读的。
然后打开 sub.txt 看开头。有 proxies: 的是 Clash 的 YAML。一整段看不出意思的字母和数字,多半是 Base64 编码的分享链接。以 <!DOCTYPE html 或 <html 开头的是网页,要么订阅地址被拦了,要么复制成了面板的网址。把 -A 后面换成 v2rayN/7.24.9 再请求一次,就能看到同一条链接发给 v2rayN 的是什么。
sub.txt 里是全部节点和你的凭据,看完删掉。命令里带着完整的订阅地址,别截图外发。
常见问题
Clash Verge Rev 更新订阅提示 invalid yaml 是什么意思
服务器回了内容,但不是 Clash 能读的 YAML。常见的是回了一串分享链接,或者回了一个网页。先看订阅的编辑信息里 User Agent 有没有被改过,改过就清空。再用 curl 带上 clash-verge 的 UA 请求一次,打开存下来的文件看开头是什么。
v2rayN 更新订阅以后节点列表全空了
多半是内容下载下来了,却解析不出节点。v2rayN 7.24.9 在解析新内容之前会先删掉这条订阅下的旧节点,解析失败列表就空了。看信息栏,获取订阅内容成功后面跟着导入订阅内容失败,就是这种情况,回来的常常是网页。
为什么 v2rayN 导入订阅后只多出一条配置
它拿到的是 Clash 格式的 YAML。v2rayN 7.24.9 认不出分享链接时,会把整份 Clash 配置当成一条自定义配置导进来,交给 mihomo 内核运行。想看到一个个节点,回用户中心换通用订阅或标着 v2rayN 的那条链接。
订阅更新提示 403 Forbidden 怎么办
403 是服务器认出了请求但拒绝给内容。以 Xboard 面板为例,链接里的 token 不对,或者账户被封、到期、额度为零,都会返回 403。先看用户中心的到期日,再确认链接是不是重置之后的新链接,旧链接要全部换掉。
订阅能正常更新,节点却全部超时,是订阅坏了吗
订阅多半没坏,先看流量。Xboard 判断能不能拿订阅时不看已用流量,流量用完照样更新成功,而节点服务器只放行已用量小于额度的账户。订阅卡片上的已用流量追上了总量,就是这个原因,续流量或等重置日。
勾了允许无效证书以后能更新了,会有风险吗
有。勾上以后客户端不再核对订阅服务器的证书,有人在中间换掉内容也发现不了。先排查系统时间和杀毒软件的 HTTPS 扫描,这两样都会让证书校验失败。确实要勾,更新完找到原因再取消。
参考来源
- Clash Verge Rev 文档,订阅导入
- Clash Verge Rev 文档,其他问题
- Clash Verge Rev v2.5.2 源码,下载和校验订阅的 prfitem.rs
- Clash Verge Rev v2.5.2 源码,更新失败后换路重试的 profile.rs
- v2rayN 7.24.9 源码,SubscriptionHandler.cs
- v2rayN 7.24.9 源码,DownloadService.cs
- v2rayN 7.24.9 源码,ConfigHandler.cs 的批量导入
- v2rayN Wiki,订阅格式
- Xboard 源码,订阅请求的 token 校验
- Xboard 源码,ClientController.php
- Xboard 源码,按客户端筛节点的 AbstractProtocol.php
- Xboard 源码,ClashMeta.php 与 General.php
- Xboard 源码,节点服务器取用户的 ServerService.php
- mihomo 文档,proxy-providers
更新记录
- 首次发布