feat: add one-click installers and Windows launcher

This commit is contained in:
Alex
2026-05-24 23:07:03 +03:00
parent 186139f796
commit a70439194e
18 changed files with 870 additions and 720 deletions
+98 -190
View File
@@ -1,259 +1,167 @@
@echo off
:: ==============================================================================
:: miband-bot Smart Setup Script for Windows (100% Flat robust version)
:: ==============================================================================
chcp 65001 > nul
set AUTO_START=0
if /i "%~1"=="--start" set AUTO_START=1
if /i "%MIBAND_BOT_AUTO_START%"=="1" set AUTO_START=1
cls
echo ======================================================================
echo 🚀 УМНЫЙ ЗАПУСК И НАСТРОЙКА miband-bot 🚀
echo ======================================================================
echo Этот скрипт поможет вам быстро развернуть личного Telegram-бота
echo для сбора данных Xiaomi Fitness / Mi Band.
echo.
:: ------------------------------------------------------------------------------
:: Шаг 1. Выбор метода установки
:: ------------------------------------------------------------------------------
echo Как вы хотите запустить бота?
echo 1] Напрямую на Python (Рекомендуется. Потребляет минимум памяти)
echo 2] В Docker контейнерах (Всё работает в фоне)
echo miband-bot
echo.
:CHOOSE_MODE
if "%AUTO_START%"=="1" if exist secrets.env goto MODE_PYTHON
set install_mode=1
set /p install_mode="Выберите вариант (1 или 2) [1]: "
set /p install_mode=" [1] Python (рек.) [2] Docker Выбор [1]: "
if "%install_mode%"=="1" goto MODE_PYTHON
if "%install_mode%"=="2" goto MODE_DOCKER
echo Неверный ввод. Пожалуйста, введите 1 или 2.
echo.
goto CHOOSE_MODE
:: ------------------------------------------------------------------------------
:: Шаг 2. Проверка требований
:: ------------------------------------------------------------------------------
:MODE_DOCKER
echo.
echo [1/3] Проверка окружения Docker...
where docker >nul 2>nul
if errorlevel 1 (
echo ❌ Docker CLI не найден. Пожалуйста, установите Docker Desktop или настройте WSL 2.
pause
exit /b 1
)
if errorlevel 1 ( echo ! Docker не найден. Установите Docker Desktop. & pause & exit /b 1 )
docker info >nul 2>nul
if errorlevel 1 (
echo ❌ Демон Docker не запущен. Пожалуйста, запустите Docker и перезапустите скрипт.
pause
exit /b 1
)
echo ✓ Движок Docker активен и готов к работе!
if errorlevel 1 ( echo ! Docker не запущен. Запустите Docker Desktop. & pause & exit /b 1 )
echo OK Docker готов
set DOCKER_ACTIVE=1
goto SETUP_ENV
:MODE_PYTHON
echo.
echo [1/3] Проверка окружения Python...
python --version >nul 2>nul
if not errorlevel 1 goto PYTHON_OK
echo Python не найден или не настроен в вашей системе.
echo Вы можете скачать его вручную по ссылке: https://www.python.org/downloads/
echo ! Python не найден: https://www.python.org/downloads/
echo.
set install_python=y
set /p install_python="Хотите, чтобы я автоматически скачал и установил Python 3.11? [Y/n]: "
if /i not "%install_python%"=="y" (
echo Установка отменена. Пожалуйста, установите Python вручную.
pause
exit /b 1
)
set /p install_python=" Установить Python 3.11 автоматически? [Y/n]: "
if /i not "%install_python%"=="y" ( echo Установите Python вручную и повторите. & pause & exit /b 1 )
echo.
echo Скачивание установщика Python 3.11.9...
powershell -Command "Invoke-WebRequest -Uri 'https://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe' -OutFile 'python_installer.exe'"
echo Установка Python (это займет около минуты, пожалуйста, подождите)...
echo Скачивание Python 3.11.9...
powershell -Command "$ProgressPreference='SilentlyContinue'; Invoke-WebRequest -Uri 'https://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe' -OutFile 'python_installer.exe'"
echo Установка...
python_installer.exe /quiet InstallAllUsers=0 PrependPath=1 Include_test=0
del python_installer.exe
:: Добавляем установленный Python в PATH текущей сессии
set "PATH=%LocalAppData%\Programs\Python\Python311;%LocalAppData%\Programs\Python\Python311\Scripts;%PATH%"
python --version >nul 2>nul
if errorlevel 1 (
echo ❌ Не удалось автоматически установить Python или добавить его в PATH.
echo Пожалуйста, установите Python вручную по ссылке: https://www.python.org/downloads/
pause
exit /b 1
)
if errorlevel 1 ( echo ! Не удалось установить Python. & pause & exit /b 1 )
:PYTHON_OK
echo Python найден!
echo OK Python готов
set DOCKER_ACTIVE=0
goto SETUP_ENV
:: ------------------------------------------------------------------------------
:: Шаг 3. Настройка secrets.env
:: ------------------------------------------------------------------------------
:SETUP_ENV
echo.
echo [2/3] Конфигурация параметров бота (secrets.env)...
if not exist secrets.env goto INPUT_ENV_VALUES
echo Файл конфигурации secrets.env уже существует.
if "%AUTO_START%"=="1" goto LAUNCH_PHASE
set overwrite_env=n
set /p overwrite_env="Хотите перезаписать его и настроить заново? [y/N]: "
if /i not "%overwrite_env%"=="y" (
echo ✓ Сохраняем существующий secrets.env.
goto LAUNCH_PHASE
)
set /p overwrite_env=" Конфигурация уже есть. Перенастроить? [y/N]: "
if /i not "%overwrite_env%"=="y" goto LAUNCH_PHASE
:INPUT_ENV_VALUES
echo.
echo Сейчас мы настроим основные параметры безопасности.
echo.
echo Токен бота от @BotFather в Telegram:
:INPUT_TOKEN
echo 🔑 Шаг 1. Получение Telegram Bot Token
echo Для работы бота необходим токен. Его можно получить бесплатно за 1 минуту:
echo 1. Откройте Telegram и перейдите к официальному боту @BotFather.
echo 2. Отправьте ему команду /newbot.
echo 3. Введите название для бота (например, Мой Mi Band Бот).
echo 4. Введите уникальное имя пользователя (username) на английском,
echo заканчивающееся на bot (например, my_miband_sync_bot).
echo 5. Скопируйте полученный токен (выглядит как 123456789:ABC-DEF...).
echo.
set /p bot_token="Вставьте ваш Telegram Bot Token: "
if "%bot_token%"=="" (
echo Ошибка: Токен не может быть пустым.
echo.
goto INPUT_TOKEN
)
echo %bot_token% | findstr /c:":" >nul
if errorlevel 1 (
echo Ошибка: Токен должен содержать символ ":"
echo.
goto INPUT_TOKEN
)
echo.
set bot_token=
set /p bot_token=" Токен: "
if "%bot_token%"=="" goto TOKEN_EMPTY
echo %bot_token% | find ":" >nul 2>nul
if errorlevel 1 goto TOKEN_INVALID
goto TOKEN_OK
echo 🔒 Шаг 2. Автоматическая привязка владельца (Whitelist ID)
echo Вам НЕ НУЖНО вручную искать и вводить ваш Telegram User ID!
echo Сразу после запуска бота откройте его в Telegram и отправьте команду /start.
echo Бот автоматически распознает ваш ID, запишет его в белый список
echo и заблокирует доступ для всех остальных пользователей.
echo.
:TOKEN_EMPTY
echo Токен не может быть пустым.
goto INPUT_TOKEN
:: Создание secrets.env (запись построчно во избежание багов парсера скобок)
echo # ============================================================================== > secrets.env
echo # Конфигурация secrets.env для miband-bot >> secrets.env
echo # ============================================================================== >> secrets.env
echo. >> secrets.env
echo # Токен вашего Telegram-бота (полученный от @BotFather) >> secrets.env
echo TELEGRAM_BOT_TOKEN=%bot_token% >> secrets.env
echo. >> secrets.env
echo # Единственный разрешенный Telegram User ID (для безопасности данных) >> secrets.env
echo # Оставьте пустым - бот автоматически привяжется к первому, кто напишет /start! >> secrets.env
echo TELEGRAM_ALLOWED_USER_ID= >> secrets.env
echo. >> secrets.env
echo # Интервал фоновой синхронизации данных из облака Xiaomi Fitness (в секундах) >> secrets.env
echo SYNC_INTERVAL=900 >> secrets.env
echo. >> secrets.env
echo # Глубина запроса при автоматической синхронизации (в днях) >> secrets.env
echo QUERY_DURATION=2 >> secrets.env
echo. >> secrets.env
echo # Загружать детальные ночные данные о сне (FDS) >> secrets.env
echo ENABLE_FDS_SLEEP_DETAILS=true >> secrets.env
:TOKEN_INVALID
echo Неверный формат - токен должен содержать двоеточие.
goto INPUT_TOKEN
echo ✓ Файл secrets.env успешно создан!
echo.
:TOKEN_OK
(
echo # miband-bot config
echo TELEGRAM_BOT_TOKEN=%bot_token%
echo TELEGRAM_ALLOWED_USER_ID=
echo SYNC_INTERVAL=900
echo QUERY_DURATION=2
echo ENABLE_FDS_SLEEP_DETAILS=true
) > secrets.env
echo OK Конфигурация сохранена
:: ------------------------------------------------------------------------------
:: Шаг 4. Установка зависимостей и запуск
:: ------------------------------------------------------------------------------
:LAUNCH_PHASE
echo [3/3] Подготовка среды выполнения...
echo.
if not "%DOCKER_ACTIVE%"=="1" goto PYTHON_LAUNCH
:DOCKER_LAUNCH
set launch_now=y
set /p launch_now="Хотите запустить miband-bot в Docker прямо сейчас? [Y/n]: "
if /i not "%launch_now%"=="y" (
echo.
echo Бот настроен, но не запущен.
echo Запустите вручную командой: docker compose up -d --build
goto END_LAUNCH
)
echo Сборка и запуск контейнеров...
set /p launch_now=" Запустить в Docker сейчас? [Y/n]: "
if /i not "%launch_now%"=="y" ( echo Запуск вручную: docker compose up -d --build & goto END_LAUNCH )
docker compose up -d --build
if not errorlevel 1 (
echo.
echo ======================================================================
echo 🎉 miband-bot УСПЕШНО НАСТРОЕН И ЗАПУЩЕН В DOCKER! 🎉
echo ======================================================================
echo Теперь откройте бота в Telegram и отправьте команду /start.
echo.
echo Логи: docker compose logs -f fitness-bot
echo Стоп: docker compose down
echo ======================================================================
echo OK Бот запущен в Docker. Отправьте /start в Telegram.
echo Логи: docker compose logs -f fitness-bot
) else (
echo Ошибка при сборке или запуске Docker Compose.
echo ! Ошибка запуска Docker.
)
goto END_LAUNCH
:PYTHON_LAUNCH
echo Создаем виртуальное окружение .venv и устанавливаем зависимости...
if not exist .venv (
python -m venv .venv
)
echo Подготовка...
if not exist .venv ( python -m venv .venv >nul 2>nul )
call .venv\Scripts\activate
echo Установка библиотек...
pip install -r requirements.txt -e mi-fitness-python
pip install -r requirements.txt -e mi-fitness-python > pip_install.log 2>&1
if not errorlevel 1 (
del pip_install.log >nul 2>nul
echo OK Готово
) else (
echo ! Ошибка установки зависимостей:
type pip_install.log
del pip_install.log >nul 2>nul
pause & exit /b 1
)
:: Записываем рабочий запуск в run_local.bat построчно (полностью без скобочных блоков)
echo @echo off > run_local.bat
echo chcp 65001 ^> nul >> run_local.bat
echo cd /d "%%~dp0" >> run_local.bat
echo if not exist .venv ^( >> run_local.bat
echo echo Ошибка: Виртуальное окружение .venv не найдено. Запустите setup.bat сначала. >> run_local.bat
echo pause >> run_local.bat
echo exit /b 1 >> run_local.bat
echo ^) >> run_local.bat
echo. >> run_local.bat
echo :: Загрузка переменных из secrets.env >> run_local.bat
echo if exist secrets.env ^( >> run_local.bat
echo for /f "usebackq delims=" %%%%x in ^("secrets.env"^) do ^( >> run_local.bat
echo echo %%%%x ^| findstr /r "^#" ^>nul >> run_local.bat
echo if errorlevel 1 ^( >> run_local.bat
echo set %%%%x >> run_local.bat
echo ^) >> run_local.bat
echo ^) >> run_local.bat
echo ^) >> run_local.bat
echo. >> run_local.bat
echo :: Настройка локальных путей к папке data >> run_local.bat
echo set DATA_DIR=.\data >> run_local.bat
echo set DB_PATH=.\data\miband_%%TELEGRAM_ALLOWED_USER_ID%%.db >> run_local.bat
echo set STATUS_PATH=.\data\status_%%TELEGRAM_ALLOWED_USER_ID%%.json >> run_local.bat
echo set BOT_STATE_DB_PATH=.\data\fitness_bot_state.db >> run_local.bat
echo. >> run_local.bat
echo call .venv\Scripts\activate >> run_local.bat
echo === Запуск miband-bot локально ^(без Docker^) === >> run_local.bat
echo Для завершения работы закройте это окно консоли. >> run_local.bat
echo. >> run_local.bat
echo Запуск синхронизатора и Telegram-бота... >> run_local.bat
echo. >> run_local.bat
echo [Запуск фонового синхронизатора...] >> run_local.bat
echo start /b python -u miband_sync.py >> run_local.bat
echo [Запуск бота...] >> run_local.bat
echo python -u fitness_bot.py >> run_local.bat
>run_local.bat echo @echo off
>>run_local.bat echo chcp 65001 ^> nul
>>run_local.bat echo cd /d "%%~dp0"
>>run_local.bat echo if not exist .venv ^(
>>run_local.bat echo echo ! .venv не найдено. Запустите setup.bat заново.
>>run_local.bat echo pause
>>run_local.bat echo exit /b 1
>>run_local.bat echo ^)
>>run_local.bat echo if not exist run.py ^(
>>run_local.bat echo echo ! run.py не найден. Обновите проект и запустите setup.bat заново.
>>run_local.bat echo pause
>>run_local.bat echo exit /b 1
>>run_local.bat echo ^)
>>run_local.bat echo call .venv\Scripts\activate
>>run_local.bat echo set PYTHONUTF8=1
>>run_local.bat echo set PYTHONIOENCODING=utf-8
>>run_local.bat echo md data 2^>nul
>>run_local.bat echo cls
>>run_local.bat echo echo.
>>run_local.bat echo echo miband-bot
>>run_local.bat echo echo.
>>run_local.bat echo echo OK Бот запущен. Не закрывайте это окно.
>>run_local.bat echo echo Логи: data\bot.log / data\sync.log
>>run_local.bat echo echo.
>>run_local.bat echo python -u run.py
>>run_local.bat echo echo.
>>run_local.bat echo echo Бот остановлен. Можно закрыть окно.
>>run_local.bat echo echo.
>>run_local.bat echo pause
if "%AUTO_START%"=="1" goto RUN_LOCAL_NOW
echo ✓ Создан удобный скрипт запуска: run_local.bat
echo.
set launch_now=y
set /p launch_now="Хотите запустить бота локально прямо сейчас? [Y/n]: "
if /i "%launch_now%"=="y" (
call run_local.bat
)
set /p launch_now=" Запустить бота сейчас? [Y/n]: "
if /i "%launch_now%"=="y" ( call run_local.bat )
goto END_LAUNCH
:RUN_LOCAL_NOW
call run_local.bat
:END_LAUNCH
echo.