clash-for-linux/scripts/clash_proxy-selector.sh
2023-11-08 14:20:08 +08:00

109 lines
2.9 KiB
Bash

#!/bin/bash
# Clash API地址
api_url="http://localhost:9090"
Secret="填写Clash Secret"
# 获取Clash代理节点列表
get_proxy_list() {
# 使用您的命令获取代理节点列表
proxies=$(curl -s -XGET -H "Content-Type: application/json" -H "Authorization: Bearer ${Secret}" $api_url/proxies | jq -r '.proxies.Proxy.all[]')
}
# 获取Clash代理模式列表
get_mode_list() {
# 使用您的命令获取代理模式列表,例如:
# modes=$(your_command_to_get_mode_list)
# 将代理模式列表保存到变量modes中
modes=("Global" "Rule")
}
# 显示菜单选项
show_menu() {
echo "========== Clash代理配置 =========="
echo "1. 选择代理模式"
echo "2. 选择代理节点"
echo "3. 退出"
echo "==================================="
}
# 选择代理节点
select_proxy() {
local mode=$1
if [ -z $mode ]; then
mode="Proxy"
fi
get_proxy_list
echo "========== 代理节点列表 =========="
i=1
for proxy in $proxies; do
echo "$i. $proxy"
i=$((i+1))
done
echo "==================================="
read -p "请选择代理节点(输入编号):" proxy_index
proxy=$(echo "$proxies" | sed -n "${proxy_index}p")
if [[ -n $proxy ]]; then
# 更新Clash的代理节点设置
curl -X PUT -s "$api_url/proxies/$mode" -H "Content-Type: application/json" -H "Authorization: Bearer ${Secret}" --data "{\"name\":\"$proxy\"}" > /dev/null
echo "代理节点已更新为:$proxy"
else
echo "无效的选择!"
fi
}
# 选择代理模式
select_mode() {
get_mode_list
echo "========== 代理模式列表 =========="
i=1
#for mode in $modes; do
for mode in ${modes[@]}; do
echo "$i. $mode"
i=$((i+1))
done
echo "==================================="
read -p "请选择代理模式(输入编号):" mode_index
mode=$(echo "${modes[$(($mode_index -1))]}")
if [[ -n $mode ]]; then
# 更新Clash的代理模式设置
curl -XPATCH -s "$api_url/configs" -H "Content-Type: application/json" -H "Authorization: Bearer ${Secret}" -d '{"mode":"'"${mode}"'"}' > /dev/null
echo "代理模式已更新为:$mode"
# 根据新的代理模式更新节点配置
update_nodes "$mode"
else
echo "无效的选择!"
fi
}
update_nodes() {
local mode=$1
if [ $mode == "Rule" ]; then
mode=Proxy
select_proxy $mode
fi
if [ $mode == "Global" ]; then
mode=GLOBAL
select_proxy $mode
fi
# 根据代理模式更新节点配置
# TODO: 根据实际需求进行更新节点配置的操作
echo "已根据代理模式 $mode 更新节点配置"
}
# 主程序
while true; do
show_menu
read -p "请选择操作(输入编号):" choice
case $choice in
1) select_mode;;
2) select_proxy;;
3) break;;
*) echo "无效的选择!";;
esac
echo
done