60 lines
1.9 KiB
PowerShell
60 lines
1.9 KiB
PowerShell
# ================= CONFIG =================
|
|
$API_URL = "http://127.0.0.1:9090"
|
|
$SECRET = "8130899"
|
|
$GROUP = "Rotate"
|
|
# ==========================================
|
|
|
|
# 1. Force UTF-8 Output
|
|
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
|
|
|
Write-Host "1. Connecting to Clash..." -ForegroundColor Cyan
|
|
|
|
# Use WebClient (Stable & Fixes Encoding)
|
|
$wc = New-Object System.Net.WebClient
|
|
$wc.Encoding = [System.Text.Encoding]::UTF8
|
|
|
|
try {
|
|
# URL
|
|
$ListUrl = "$API_URL/proxies/$GROUP"
|
|
|
|
# === Step A: Get List ===
|
|
# Add Auth Header
|
|
if ($SECRET -ne "") { $wc.Headers.Add("Authorization", "Bearer $SECRET") }
|
|
|
|
$JsonContent = $wc.DownloadString($ListUrl)
|
|
|
|
$JsonObj = $JsonContent | ConvertFrom-Json
|
|
$NodeList = $JsonObj.all
|
|
|
|
if (!$NodeList -or $NodeList.Count -eq 0) {
|
|
throw "Error: Group [$GROUP] is empty!"
|
|
}
|
|
Write-Host " > Found $($NodeList.Count) nodes." -ForegroundColor Green
|
|
|
|
# === Step B: Pick Random ===
|
|
$Target = $NodeList | Get-Random
|
|
Write-Host "2. Switching to: $Target" -ForegroundColor Cyan
|
|
|
|
# === Step C: Send Switch Command ===
|
|
$Payload = @{ name = $Target } | ConvertTo-Json -Compress
|
|
|
|
# 【Critical Fix】Clear headers to remove old Auth, preventing duplicate headers
|
|
$wc.Headers.Clear()
|
|
|
|
# Re-add Headers correctly
|
|
$wc.Headers.Add("Content-Type", "application/json")
|
|
if ($SECRET -ne "") { $wc.Headers.Add("Authorization", "Bearer $SECRET") }
|
|
|
|
# Send PUT
|
|
$Response = $wc.UploadString($ListUrl, "PUT", $Payload)
|
|
|
|
Write-Host "3. [SUCCESS] Switched to: $Target" -ForegroundColor Green
|
|
|
|
} catch {
|
|
Write-Host "==== ERROR ====" -ForegroundColor Red
|
|
Write-Host $_.Exception.Message -ForegroundColor Yellow
|
|
if ($_.Exception.InnerException) {
|
|
Write-Host "Detail: $($_.Exception.InnerException.Message)" -ForegroundColor Yellow
|
|
}
|
|
exit 1
|
|
} |