机场推荐网

订阅更新失败的几种原因,看报错原文就能分开

订阅更新失败先看卡在哪一步。服务器没给内容,查账户、链接和网络;给了内容却解析不出节点,多半是格式和客户端没对上。两类报错的原文长得不一样,对着看就能分开。

更新于 11 分钟读完作者 阿量参考了 14 份一手资料

点一下更新,客户端做的事分两步。先把订阅地址当成一个网址去下载,再把下回来的文字解析成节点。两步都可能出错,报出来的话也不一样。

我把 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 扫描,这两样都会让证书校验失败。确实要勾,更新完找到原因再取消。

参考来源

  1. Clash Verge Rev 文档,订阅导入
  2. Clash Verge Rev 文档,其他问题
  3. Clash Verge Rev v2.5.2 源码,下载和校验订阅的 prfitem.rs
  4. Clash Verge Rev v2.5.2 源码,更新失败后换路重试的 profile.rs
  5. v2rayN 7.24.9 源码,SubscriptionHandler.cs
  6. v2rayN 7.24.9 源码,DownloadService.cs
  7. v2rayN 7.24.9 源码,ConfigHandler.cs 的批量导入
  8. v2rayN Wiki,订阅格式
  9. Xboard 源码,订阅请求的 token 校验
  10. Xboard 源码,ClientController.php
  11. Xboard 源码,按客户端筛节点的 AbstractProtocol.php
  12. Xboard 源码,ClashMeta.php 与 General.php
  13. Xboard 源码,节点服务器取用户的 ServerService.php
  14. mihomo 文档,proxy-providers

更新记录

  • 首次发布