网站订阅中增加对新版clash的支持,同时支持旧版本

写在前面

前不久clash软件升级了内核,官方支持s-s/r,算是可喜的事情,但clash作者并没有向下兼容旧版clash,也就是说新旧版clash软件需要不同的订阅链接,否则无法使用。据作者所说,这是为了减少开发成本。s-s/panel目前也没有更新已兼容新版clash。
适用环境:本文基于Ma/li/o,自行修改可适配其他程序
方案:我们在网站中添加一个新的订阅按钮,来支持新版软件

2020年9月更新,实际操作中有一些问题,内容来源网络。文章内容仅供参考,可以提供一些思路。有机会我再完善文章

正文

一、找到配置文件
clash配置模板在网站根目录下的resources/conf/clash.tpl,创建一个副本clash_new.tpl并打开副本文件
打开后定位59行:

Proxy:

修改为:

proxies:

定位到64行:

Proxy Group:

修改为:

proxy-groups:

定位到73行(倒数第二行):

{include file='rule/lhie1_Rule.yaml'}

修改为:

{include file='rule/lhie1_New_Rule.yaml'}

二、修改规则文件

订阅和节点都没问题,测试延迟也有但就是无法上网。
定位到 resources/conf/rule 目录,找到 lhie1_Rule.yaml 文件,并创建副本重命名为lhie1_New_Rule.yaml

定位到第一行:

Rule:

修改为:

rules:

三、修改控制文件

控制文件在网站根目录/app/Utils/AppURI.php,打开这个文件

174行在有一个叫做getClashURI的函数,复制这个函数体并命名新函数为getNewClashURI。也就是复制174到290行在下面粘贴并命名getNewClashURI

在粘贴后应该在356行

$return = [
    'name' => $item['remark'],
    'type' => 'ssr',
    'server' => $item['address'],
    'port' => $item['port'],
    'cipher' => $item['method'],
    'password' => $item['passwd'],
    'protocol' => $item['protocol'],
    'protocolparam' => $item['protocol_param'],
    'obfs' => $item['obfs'],
    'obfsparam' => $item['obfs_param']
];
break;

修改为:

$return = [
     'name' => $item['remark'],
     'type' => 'ssr', 'server' => $item['address'],
     'port' => $item['port'],
     'cipher' => $item['method'],
     'password' => $item['passwd'],
     'protocol' => $item['protocol'],
     'protocol-param' => $item['protocol_param'],
     'obfs' => $item['obfs'],
     'obfs-param' => $item['obfs_param']
];
break;

四、检查是否生效

当然你也可以不检查,自信一点!
找到文件:app/Controllers/LinkController.php,找到名为getClash的函数,判断订阅链接有没有new参数,有就表示请求的是新版订阅,返回上面三处修改的文件或函数。

最后找到用户首页的视图文件,参考其他订阅代码照猫画虎加上新版clash订阅代码,复制的内容就是原版订阅+“&new=1”。

五、未整理内容

找到/resources/views/malio/user目录打开index文件

找到在344行

{$i18n->get('import-clash-config')}
在其下增加一行
(新版)一键导入 ClashX / CFW / CFA 配置
通过查找function importSublink(client) { 定位到代码块下,找到下面内容

  if (client == 'clash') {
    oneclickImport('clash','{$subInfo["clash"]}')
  };

在其下方增加如下内容

  if (client == 'clash2') {
    oneclickImport('clash','{$subInfo["clash"]}')
  };    

完工了。

发表新评论