-
Notifications
You must be signed in to change notification settings - Fork 4
Config Scripts ru
Скрипт конфига — небольшой кусок JavaScript, который переписывает конфигурацию профиля до того, как её загрузит ядро. Позволяет менять в конфиге что угодно — DNS, правила, группы прокси — не редактируя YAML, и ваши изменения переживают каждое обновление подписки.
Открывается: Профили → ⋮ на профиле → Скрипт конфига.
Скрипт объявляет одну функцию:
function main(config) {
// меняем что угодно
return config
}config — это вся конфигурация обычным объектом JavaScript, ровно в том виде, в каком её получило бы ядро. То, что вы вернёте, её заменит.
Обязательно return config. Скрипт, который изменил объект, но забыл его вернуть, не сохранит ничего.
Это та же сигнатура, что используют другие Clash-клиенты, поэтому скрипты, написанные для них, обычно работают здесь без переделки.
Нажмите Вставить шаблон — подставится рабочая заготовка, которую можно сохранить как есть:
function main(config) {
// config.dns.enable = true
// config.rules.unshift("DOMAIN-SUFFIX,example.com,DIRECT")
return config
}Затем нажмите Проверить. Это не подсветка синтаксиса — скрипт реально выполняется на вашем конфиге, поэтому ловятся и те ошибки, которые вылезают только на вашей подписке.
Сохранить запишет скрипт и сразу пересоберёт конфиг. Если скрипт не работает, не сохранится ничего — приложение не даст профилю носить сломанный скрипт.
Переключатель Выполнять скрипт отключает его, не удаляя текст.
Принудительно включить DNS
function main(config) {
config.dns = config.dns || {}
config.dns.enable = true
return config
}Пустить домен напрямую, впереди всех правил
function main(config) {
config.rules = config.rules || []
config.rules.unshift("DOMAIN-SUFFIX,bank.example,DIRECT")
return config
}Выбросить ноды, которыми не пользуетесь
function main(config) {
config.proxies = (config.proxies || []).filter(p => !/test|expired/i.test(p.name))
return config
}Увеличить интервал автопроверки во всех url-test группах
function main(config) {
for (const group of config["proxy-groups"] || []) {
if (group.type === "url-test") group.interval = 600
}
return config
}Трогать только один профиль — имя профиля приходит вторым аргументом:
function main(config, profileName) {
if (profileName === "Работа") config.mode = "global"
return config
}Скрипт видит конфиг и больше ничего. Нет доступа к файлам, нет сети, нет require, нет таймеров — fetch, process и подобные просто не определены. Скачать список правил или отправить что-то наружу он не может.
Он также не может ослабить защиту самого приложения: ClashFest применяет свои проверки безопасности после вашего скрипта, поэтому скрипт не переоткроет локальные слушатели, которые приложение закрывает, и не обойдёт очистку URL.
Скрипт, работающий дольше 3 секунд, останавливается. Преобразование конфига — это перекладывание объектов; всё, что медленнее, — бесконечный цикл.
Если скрипт перестал работать позже — например, обновление подписки убрало ключ, на который он рассчитывал, — приложение не ломается вместе с ним. Оно молча пересобирает конфиг без скрипта и продолжает работать, поэтому обновление по расписанию в 3 ночи никогда не оставит вас без туннеля. Откройте редактор и нажмите Проверить, чтобы увидеть причину.
У ошибок стабильные коды:
| Код | Что означает |
|---|---|
E-60 |
Синтаксическая ошибка — скрипт не разобран |
E-61 |
Нет main — скрипт должен объявлять function main(config)
|
E-62 |
Скрипт завершился с ошибкой при выполнении |
E-63 |
main() ничего не вернул или вернул не объект конфига |
E-64 |
Скрипт работал слишком долго и был остановлен (почти всегда бесконечный цикл) |
E-65 |
Скрипт выдал неправдоподобно большой конфиг |
Полный список кодов — в Устранении неполадок.
Скрипт хранится вместе с остальными правками профиля, поэтому переживает обновления подписки и выполняется заново при каждой пересборке конфига — при обновлении, при запуске VPN и при сохранении.
После выполнения скрипта конфиг сериализуется заново, поэтому в config.yaml ключи могут оказаться в другом порядке, а комментарии пропасть. Это нормально: ядро читает значения, а не форматирование. Исходная подписка при этом хранится рядом нетронутой.
Если вы держите панель и не хотите, чтобы пользователи переписывали выдаваемый вами конфиг, отдавайте:
X-Brand-Lock-Config-Script: true
Редактор станет только для чтения, а уже сохранённый на профиле скрипт перестанет выполняться. Запрет срабатывает при сборке конфига, а не только в интерфейсе, поэтому скрипт, сохранённый до включения флага, тоже остановится.
Как и остальные политики, работает без X-Branding-Enabled и переживает отключение брендинга. См. Справочник заголовков.
📱 User Guide
- Getting Started
- Profiles & Nodes
- Routing & Rules
- Settings
- Deep Links
- Encrypted Subscriptions
- Config Scripts
- Troubleshooting
🏢 Operator API
📺 Companion