Skip to content

Instantly share code, notes, and snippets.

@log2c
Last active April 7, 2023 12:00
Show Gist options
  • Save log2c/6d2aab87dfe560fbcec3fd3b8c7830bd to your computer and use it in GitHub Desktop.
Save log2c/6d2aab87dfe560fbcec3fd3b8c7830bd to your computer and use it in GitHub Desktop.
一些关于clash及surge 的脚本
module.exports.parse = ({ content, name, url }, { yaml, axios, notify }) => {
const remove_names = new Set();
const allowList = [80, 8080, 443, 27833, 22]; // 待保留端口的节点
const fallbackProxy = ["DIRECT", "REJECT"]; // proxies为空时自动追加__"自动选择"
if (Array.isArray(content.proxies)) {
content.proxies = content.proxies
.filter((proxy => {
if (allowList.indexOf(proxy.port) === -1) {
remove_names.add(proxy.name);
return false;
} else {
return true;
}
}));
}
const groups = content['proxy-groups'] || [];
if (Array.isArray(groups)) {
groups.forEach((group) => {
const proxies = group.proxies
.filter((proxy) => !remove_names.has(proxy));
group.proxies = proxies;
// update 2022/4/8
if ((group.proxies || []).length === 0) {
group.proxies = [...fallbackProxy];
}
});
}
return content
}
@log2c
Copy link
Author

log2c commented Oct 29, 2021

昨晚找到了大神写的脚本用来筛选订阅的节点很好用,后来发现在ClashForWindows中之前几个订阅使用这段mixin脚本正确的筛选掉了节点,但后来发现有部分订阅一开启mixin就报错,提示could not switch to this profile! proxy group[2]: 'use' or 'proxies' missing,不同的订阅报错的group不一样,有的是group[2],有的是group[4],也有group[5]的,所有报错和没报错的配置用的都是同一套ACL4SSR_Online_Full_Netflix模板,所以分组也是一模一样,想贴配置文件上来发现字数不够就发个链接吧: https://subcon.dlj.tf/sub?target=clash&url=https%3A%2F%2Fraw.githubusercontent.com%2FAlvin9999%2Fpac2%2Fmaster%2Fclashfile%2F1&insert=true&fdn=true&config=https%3A%2F%2Fraw.githubusercontent.com%2FACL4SSR%2FACL4SSR%2Fmaster%2FClash%2Fconfig%2FACL4SSR_Online_Full_Netflix.ini 刚才突发奇想是不是过滤规则的问题又尝试了一下,结果发现用ACL4SSR_Online_Full系列的都不行,改成ACL4SSR_Online.ini突然就好了…… 请教有没有办法在使用ACL4SSR_Online_Full_Netflix.ini的情况下js脚本还是可以正常运行呢?

按理解来看,你应该确定 - 🇨🇳 台湾节点 之类的分组没有引用到你过滤掉的节点,如果有就要另外写判断了

@PaTTeeL
Copy link

PaTTeeL commented Apr 6, 2022

好像的确是因为过滤了443端口,导致过滤后的规则中如果有按地区分类的节点组(比如香港节点、台湾节点、狮城节点之类的)是空白,又被其他分组引用时(比如group[2]->自动选择),clash发现引用组的服务器是空白,所以报错了,而且因为clash for windows看不到内存中mixin后的配置文件,所以之前的报错也是要研究很久才能找到问题的。。。请教一下能否改进脚本避免出现报错的问题呢?
btw,查了一下函数indexOf,说是顺序检索,如果我仅填了443端口,类似4438和8443这样端口的节点是不是过滤之后还是会被保留在列表中呢?

@log2c
Copy link
Author

log2c commented Apr 8, 2022

好像的确是因为过滤了443端口,导致过滤后的规则中如果有按地区分类的节点组(比如香港节点、台湾节点、狮城节点之类的)是空白,又被其他分组引用时(比如group[2]->自动选择),clash发现引用组的服务器是空白,所以报错了,而且因为clash for windows看不到内存中mixin后的配置文件,所以之前的报错也是要研究很久才能找到问题的。。。请教一下能否改进脚本避免出现报错的问题呢? btw,查了一下函数indexOf,说是顺序检索,如果我仅填了443端口,类似4438和8443这样端口的节点是不是过滤之后还是会被保留在列表中呢?

更新了试试

@PaTTeeL
Copy link

PaTTeeL commented Apr 8, 2022

好像的确是因为过滤了443端口,导致过滤后的规则中如果有按地区分类的节点组(比如香港节点、台湾节点、狮城节点之类的)是空白,又被其他分组引用时(比如group[2]->自动选择),clash发现引用组的服务器是空白,所以报错了,而且因为clash for windows看不到内存中mixin后的配置文件,所以之前的报错也是要研究很久才能找到问题的。。。请教一下能否改进脚本避免出现报错的问题呢? btw,查了一下函数indexOf,说是顺序检索,如果我仅填了443端口,类似4438和8443这样端口的节点是不是过滤之后还是会被保留在列表中呢?

更新了试试

感谢大神!试过了果然有效,不再报错了。想有没有办法可以直接删除没有节点的地区分组吗?比如韩国节点筛选完没有443端口的,这一组直接去掉?暂时我修改了一下仅保留DIRECT在正常使用,只不过有点强迫症感觉挂在那里占空间。。。

@PaTTeeL
Copy link

PaTTeeL commented Apr 7, 2023

有了ChatGPT之后代码水平一日千里,分享一下从ChatGPT那里学来的代码:
const portList = [22,80,443,1080,8080,]; // 设置端口号匹配规则
const fallbackProxy = ['DIRECT','REJECT',]; // 分组无匹配结果的默认设置
content.proxies = content.proxies?.filter(proxy => portList.includes(proxy.port));
content['proxy-groups']?.forEach(group => {
group.proxies = group.proxies.filter( proxy =>
['DIRECT', 'REJECT', ...content.proxies?.map(proxy => proxy.name), ...content['proxy-groups'].map(group => group.name)].includes(proxy));
group.proxies = group.proxies.length ? group.proxies : fallbackProxy;
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment