Загрузка данных
@echo off
setlocal DisableDelayedExpansion
rem ==================================================
rem Gizmo API
rem ==================================================
set "API_BASE=https://192.168.88.50"
set "API_USER=admin"
set "API_PASSWORD=ВСТАВЬТЕ_НОВЫЙ_ПАРОЛЬ"
rem ==================================================
rem NetPing
rem ==================================================
set "NETPING_IP=192.168.88.236"
set "NETPING_USER=visor"
set "NETPING_PASSWORD=ВСТАВЬТЕ_ПАРОЛЬ_NETPING"
rem ==================================================
rem Gizmo console ID -> User ID -> NetPing relay
rem Замените 23 и 24 на номера консолей в Gizmo.
rem Для второй консоли укажите настоящий USER_ID.
rem ==================================================
set "GIZMO_SELECTED_USER_ID="
set "RELAY="
if "%~1"=="23" (
set "GIZMO_SELECTED_USER_ID=91580"
set "RELAY=1"
)
if "%~1"=="24" (
set "GIZMO_SELECTED_USER_ID=ВТОРОЙ_USER_ID"
set "RELAY=2"
)
if not defined GIZMO_SELECTED_USER_ID (
echo ERROR: Unknown Gizmo console ID: %~1
exit /b 2
)
if not defined RELAY (
echo ERROR: NetPing relay is not configured.
exit /b 3
)
rem ==================================================
rem Temporary files
rem ==================================================
set "GIZMO_RESPONSE_FILE=%TEMP%\gizmo_poweroff_%RANDOM%_%RANDOM%.json"
set "GIZMO_BALANCE_FILE=%TEMP%\gizmo_balance_%RANDOM%_%RANDOM%.txt"
set "BALANCE="
rem ==================================================
rem 1. Logout Gizmo user
rem ==================================================
curl.exe --insecure --silent --show-error --fail ^
--connect-timeout 5 --max-time 15 ^
--basic ^
--user "%API_USER%:%API_PASSWORD%" ^
--request POST ^
--data "" ^
--header "Accept: application/json" ^
"%API_BASE%/api/users/%GIZMO_SELECTED_USER_ID%/logout" ^
--output "%GIZMO_RESPONSE_FILE%"
if errorlevel 1 goto :logout_error
rem ==================================================
rem 2. Request user balance
rem ==================================================
curl.exe --insecure --silent --show-error --fail ^
--connect-timeout 5 --max-time 15 ^
--basic ^
--user "%API_USER%:%API_PASSWORD%" ^
--header "Accept: application/json" ^
"%API_BASE%/api/users/%GIZMO_SELECTED_USER_ID%/balance" ^
--output "%GIZMO_RESPONSE_FILE%"
if errorlevel 1 goto :balance_error
rem ==================================================
rem 3. Extract result.balance from JSON
rem Also verify that returned userId matches mapped user.
rem ==================================================
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^
"$j=Get-Content -Raw -LiteralPath $env:GIZMO_RESPONSE_FILE | ConvertFrom-Json;" ^
"if($null -ne $j.isError -and [bool]$j.isError){exit 2};" ^
"if($null -ne $j.result){$r=$j.result}else{$r=$j};" ^
"if($null -eq $r.userId -or [int]$r.userId -ne [int]$env:GIZMO_SELECTED_USER_ID){exit 3};" ^
"if($null -eq $r.balance){exit 4};" ^
"$b=[decimal]$r.balance;" ^
"if($b -lt 0){exit 5};" ^
"$s=$b.ToString('0.################',[Globalization.CultureInfo]::InvariantCulture);" ^
"[IO.File]::WriteAllText($env:GIZMO_BALANCE_FILE,$s);"
if errorlevel 1 goto :balance_parse_error
if not exist "%GIZMO_BALANCE_FILE%" goto :balance_parse_error
set /p "BALANCE="<"%GIZMO_BALANCE_FILE%"
if not defined BALANCE goto :balance_parse_error
echo User %GIZMO_SELECTED_USER_ID% balance: %BALANCE%
rem Zero balance does not need a withdrawal request
if "%BALANCE%"=="0" goto :power_off
rem ==================================================
rem 4. Withdraw the entire current balance
rem ==================================================
curl.exe --insecure --silent --show-error --fail ^
--connect-timeout 5 --max-time 15 ^
--basic ^
--user "%API_USER%:%API_PASSWORD%" ^
--request DELETE ^
--header "Accept: application/json" ^
"%API_BASE%/api/users/%GIZMO_SELECTED_USER_ID%/deposit/%BALANCE%" ^
--output "%GIZMO_RESPONSE_FILE%"
if errorlevel 1 goto :withdraw_error
rem ==================================================
rem 5. Request balance again and verify that it is zero
rem ==================================================
curl.exe --insecure --silent --show-error --fail ^
--connect-timeout 5 --max-time 15 ^
--basic ^
--user "%API_USER%:%API_PASSWORD%" ^
--header "Accept: application/json" ^
"%API_BASE%/api/users/%GIZMO_SELECTED_USER_ID%/balance" ^
--output "%GIZMO_RESPONSE_FILE%"
if errorlevel 1 goto :verification_error
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^
"$j=Get-Content -Raw -LiteralPath $env:GIZMO_RESPONSE_FILE | ConvertFrom-Json;" ^
"if($null -ne $j.isError -and [bool]$j.isError){exit 2};" ^
"if($null -ne $j.result){$r=$j.result}else{$r=$j};" ^
"if($null -eq $r.userId -or [int]$r.userId -ne [int]$env:GIZMO_SELECTED_USER_ID){exit 3};" ^
"if($null -eq $r.balance){exit 4};" ^
"if([decimal]$r.balance -ne 0){exit 5};"
if errorlevel 1 goto :verification_error
rem ==================================================
rem 6. Switch off the mapped NetPing outlet
rem ==================================================
:power_off
curl.exe --silent --show-error --fail --anyauth ^
--connect-timeout 5 --max-time 10 ^
--user "%NETPING_USER%:%NETPING_PASSWORD%" ^
"http://%NETPING_IP%/relay.cgi?r%RELAY%=0" ^
--output "%GIZMO_RESPONSE_FILE%"
if errorlevel 1 goto :netping_error
findstr /i /c:"error" "%GIZMO_RESPONSE_FILE%" >nul
if not errorlevel 1 goto :netping_rejected
findstr /i /c:"ok" "%GIZMO_RESPONSE_FILE%" >nul
if errorlevel 1 goto :netping_rejected
echo SUCCESS: User logged out, balance withdrawn and relay %RELAY% switched off.
goto :success
:logout_error
echo ERROR: Gizmo user logout failed.
set "EXIT_CODE=10"
goto :failed
:balance_error
echo ERROR: Could not request Gizmo user balance.
set "EXIT_CODE=11"
goto :failed
:balance_parse_error
echo ERROR: Could not parse or validate Gizmo user balance.
set "EXIT_CODE=12"
goto :failed
:withdraw_error
echo ERROR: Balance withdrawal failed.
set "EXIT_CODE=13"
goto :failed
:verification_error
echo ERROR: Balance was not confirmed as zero.
set "EXIT_CODE=14"
goto :failed
:netping_error
echo ERROR: Could not connect to NetPing.
set "EXIT_CODE=15"
goto :failed
:netping_rejected
echo ERROR: NetPing rejected the command.
set "EXIT_CODE=16"
goto :failed
:success
del "%GIZMO_RESPONSE_FILE%" 2>nul
del "%GIZMO_BALANCE_FILE%" 2>nul
exit /b 0
:failed
del "%GIZMO_RESPONSE_FILE%" 2>nul
del "%GIZMO_BALANCE_FILE%" 2>nul
exit /b %EXIT_CODE%