From b26182cb085f81c915a3864211b576dec9335997 Mon Sep 17 00:00:00 2001 From: mirivlad Date: Wed, 25 Feb 2026 00:52:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=83=D0=BD=D0=B8=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=81=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2=D1=89=D0=B8=D0=BA=20=D1=81=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=BE=D0=B9=20qwen-c?= =?UTF-8?q?ode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - install.sh — автоматическая установка всех зависимостей - Проверка Python, pip, Node.js, npm - Установка qwen-code через npm (глобально) - Создание venv и установка pip зависимостей - Определение: новая установка или обновление - Сохранение версии в .installed - run.sh — только запуск бота (без установки) - Проверка наличия venv - Проверка .env и токена - Запуск bot.py - install.sh делает: 1. Проверяет системные требования 2. Устанавливает Node.js (если нет) 3. Устанавливает qwen-code (npm install -g) 4. Создаёт venv и ставит pip зависимости 5. Создаёт .env из .env.example 6. Сохраняет версию Version: 0.6.0 Co-authored-by: Qwen-Coder --- install.sh | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++++ run.sh | 123 ++++++++----------------- 2 files changed, 293 insertions(+), 87 deletions(-) create mode 100755 install.sh diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..f3030e8 --- /dev/null +++ b/install.sh @@ -0,0 +1,257 @@ +#!/bin/bash +# Универсальный установщик Telegram CLI Bot +# Автоматически устанавливает зависимости (npm + pip) и qwen-code + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +# Цвета для вывода +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Функции вывода +info() { echo -e "${BLUE}ℹ️ $1${NC}"; } +success() { echo -e "${GREEN}✅ $1${NC}"; } +warning() { echo -e "${YELLOW}⚠️ $1${NC}"; } +error() { echo -e "${RED}❌ $1${NC}"; } + +# Проверка: новая установка или обновление +if [ -f "$SCRIPT_DIR/.installed" ]; then + INSTALL_TYPE="update" + INSTALLED_VERSION=$(cat "$SCRIPT_DIR/.installed" 2>/dev/null || echo "unknown") + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "🔄 Обновление Telegram CLI Bot" + echo "📦 Текущая версия: $INSTALLED_VERSION" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" +else + INSTALL_TYPE="install" + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "🚀 Установка Telegram CLI Bot" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" +fi + +# ============================================================================ +# Проверка системных требований +# ============================================================================ +echo "📋 Проверка системных требований..." + +# Проверка Python +if command -v python3 &> /dev/null; then + PYTHON_VERSION=$(python3 --version 2>&1 | awk '{print $2}') + success "Python: $PYTHON_VERSION" +else + error "Python3 не найден!" + echo "Установите Python 3.10 или выше:" + echo " Ubuntu/Debian: sudo apt install python3 python3-pip python3-venv" + echo " Fedora: sudo dnf install python3 python3-pip" + exit 1 +fi + +# Проверка pip +if command -v pip3 &> /dev/null || command -v pip &> /dev/null; then + PIP_CMD=$(command -v pip3 2>/dev/null || command -v pip 2>/dev/null) + success "pip: $(pip3 --version 2>&1 | head -1 || pip --version 2>&1 | head -1)" +else + error "pip не найден!" + echo "Установите pip:" + echo " Ubuntu/Debian: sudo apt install python3-pip" + exit 1 +fi + +# Проверка Node.js и npm +if command -v node &> /dev/null; then + NODE_VERSION=$(node --version) + success "Node.js: $NODE_VERSION" +else + warning "Node.js не найден" + echo "Node.js требуется для qwen-code (ИИ-агент)." + echo "Установить Node.js?" + read -p "y/n: " INSTALL_NODE + if [[ "$INSTALL_NODE" =~ ^[Yy]$ ]]; then + # Установка Node.js + if [ -f /etc/debian_version ]; then + curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - + sudo apt-get install -y nodejs + elif [ -f /etc/redhat-release ]; then + curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - + sudo yum install -y nodejs + else + echo "Установите Node.js вручную: https://nodejs.org/" + exit 1 + fi + success "Node.js установлен" + else + warning "Пропущена установка Node.js (qwen-code не будет работать)" + fi +fi + +# Проверка npm +if command -v npm &> /dev/null; then + NPM_VERSION=$(npm --version) + success "npm: $NPM_VERSION" +else + warning "npm не найден (qwen-code не будет работать)" +fi + +# ============================================================================ +# Установка qwen-code через npm +# ============================================================================ +if command -v npm &> /dev/null; then + echo "" + echo "📦 Установка qwen-code..." + + # Проверяем установлен ли уже qwen-code + if npm list -g @qwen-code/qwen-code &> /dev/null; then + info "qwen-code уже установлен, проверяем обновления..." + npm update -g @qwen-code/qwen-code + success "qwen-code обновлён" + else + info "Установка qwen-code глобально..." + npm install -g @qwen-code/qwen-code + success "qwen-code установлен" + fi + + # Проверка установки + if command -v qwen &> /dev/null; then + QWEN_VERSION=$(qwen --version 2>&1 | head -1 || echo "unknown") + success "qwen: $QWEN_VERSION" + else + warning "qwen не найден в PATH, пробуем добавить..." + # Пробуем найти qwen в глобальных npm + QWEN_PATH=$(npm root -g)/@qwen-code/qwen-code/cli.js + if [ -f "$QWEN_PATH" ]; then + export PATH="$PATH:$(npm root -g)/@qwen-code/qwen-code" + success "qwen добавлен в PATH" + fi + fi +else + warning "npm не найден — qwen-code не установлен" + echo "Для работы ИИ-агента установите npm и выполните:" + echo " npm install -g @qwen-code/qwen-code" +fi + +# ============================================================================ +# Создание/обновление виртуального окружения Python +# ============================================================================ +echo "" +echo "🐍 Настройка Python окружения..." + +if [ ! -d "venv" ]; then + info "Создание виртуального окружения..." + python3 -m venv venv + success "Виртуальное окружение создано" +else + info "Виртуальное окружение найдено" +fi + +# Активация виртуального окружения +source venv/bin/activate + +# Обновление pip +info "Обновление pip..." +pip install -q --upgrade pip + +# Установка зависимостей +echo "" +echo "📦 Установка Python зависимостей..." +if [ -f "requirements.txt" ]; then + pip install -q -r requirements.txt + success "Зависимости установлены" +else + error "requirements.txt не найден!" + exit 1 +fi + +# ============================================================================ +# Настройка .env файла +# ============================================================================ +echo "" +echo "⚙️ Настройка конфигурации..." + +if [ ! -f ".env" ]; then + if [ -f ".env.example" ]; then + info "Создание .env из .env.example..." + cp .env.example .env + warning "Требуется настроить .env файл!" + echo "" + echo "Отредактируйте .env и укажите:" + echo " 1. TELEGRAM_BOT_TOKEN — токен от @BotFather" + echo " 2. ALLOWED_USERS — ваш Telegram ID" + echo " 3. SERVERS — SSH серверы (опционально)" + echo "" + echo "Или запустите ./run.sh для интерактивной настройки" + fi +else + info ".env файл найден" +fi + +# ============================================================================ +# Сохранение версии +# ============================================================================ +# Получаем версию из git или создаём timestamp +if command -v git &> /dev/null && [ -d ".git" ]; then + VERSION=$(git describe --tags --always 2>/dev/null || git rev-parse --short HEAD) +else + VERSION=$(date +%Y%m%d-%H%M%S) +fi + +echo "$VERSION" > "$SCRIPT_DIR/.installed" +success "Версия: $VERSION" + +# ============================================================================ +# Итоги +# ============================================================================ +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +if [ "$INSTALL_TYPE" = "update" ]; then + success "Обновление завершено!" +else + success "Установка завершена!" +fi +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" +echo "📁 Директория: $SCRIPT_DIR" +echo "📦 Версия: $VERSION" +echo "" + +# Проверка готовности +READY=true + +if [ ! -f ".env" ]; then + warning "Не настроен .env файл" + READY=false +fi + +if ! grep -q "^TELEGRAM_BOT_TOKEN=" .env 2>/dev/null || grep -q "TELEGRAM_BOT_TOKEN=123456789" .env 2>/dev/null; then + warning "Не установлен TELEGRAM_BOT_TOKEN в .env" + READY=false +fi + +if [ "$READY" = true ]; then + echo "✅ Бот готов к запуску!" + echo "" + echo "Запуск:" + echo " ./run.sh" + echo "" + echo "Или в фоновом режиме:" + echo " nohup ./run.sh > bot.log 2>&1 &" +else + echo "⚠️ Требуется настройка перед запуском:" + echo " 1. Отредактируйте .env" + echo " 2. Установите TELEGRAM_BOT_TOKEN" + echo " 3. Настройте ALLOWED_USERS" + echo "" + echo "Затем запустите:" + echo " ./run.sh" +fi + +echo "" diff --git a/run.sh b/run.sh index d5f2022..d8ab2cf 100755 --- a/run.sh +++ b/run.sh @@ -1,5 +1,6 @@ #!/bin/bash # Скрипт запуска Telegram CLI Bot +# Предполагается что зависимости уже установлены через install.sh set -e @@ -8,107 +9,55 @@ cd "$SCRIPT_DIR" ENV_FILE="$SCRIPT_DIR/.env" -# Функция для установки значения в .env -set_env_value() { - local key="$1" - local value="$2" - - if [ -f "$ENV_FILE" ]; then - # Если ключ существует - обновляем - if grep -q "^$key=" "$ENV_FILE"; then - sed -i "s|^$key=.*|$key=$value|" "$ENV_FILE" - else - # Иначе добавляем - echo "$key=$value" >> "$ENV_FILE" - fi - else - # Создаём файл - echo "$key=$value" > "$ENV_FILE" - fi -} +# Цвета для вывода +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +echo -e "${GREEN}🤖 Запуск Telegram CLI Bot...${NC}" # Проверка виртуального окружения if [ ! -d "venv" ]; then - echo "📦 Виртуальное окружение не найдено. Создаю..." - python3 -m venv venv - echo "✅ Виртуальное окружение создано" -fi - -# Активация виртуального окружения (проверяем что файл существует) -if [ -f "venv/bin/activate" ]; then - source venv/bin/activate -else - echo "❌ Ошибка: venv/bin/activate не найден" - echo "Попробуйте удалить venv и запустить скрипт заново" + echo -e "${YELLOW}⚠️ Виртуальное окружение не найдено${NC}" + echo "Запустите установку: ./install.sh" exit 1 fi -# Установка зависимостей -echo "📦 Установка зависимостей..." -pip install -q --upgrade pip -pip install -q -r requirements.txt - -# Работа с токеном -TOKEN="" - -# 1. Проверяем .env файл -if [ -f "$ENV_FILE" ]; then - TOKEN=$(grep "^TELEGRAM_BOT_TOKEN=" "$ENV_FILE" | cut -d'=' -f2) - if [ -n "$TOKEN" ]; then - echo "✅ Токен получен из .env" - fi +# Активация виртуального окружения +if [ -f "venv/bin/activate" ]; then + source venv/bin/activate +else + echo -e "${YELLOW}❌ Ошибка: venv/bin/activate не найден${NC}" + echo "Запустите установку: ./install.sh" + exit 1 fi -# 2. Проверяем переменную окружения (имеет приоритет над .env) -if [ -n "$TELEGRAM_BOT_TOKEN" ]; then - TOKEN="$TELEGRAM_BOT_TOKEN" - echo "✅ Токен получен из переменной окружения" +# Проверка .env файла +if [ ! -f "$ENV_FILE" ]; then + echo -e "${YELLOW}⚠️ Файл .env не найден${NC}" + echo "Скопируйте .env.example в .env и настройте его" + exit 1 fi -# 3. Если токена нет нигде, запрашиваем у пользователя -if [ -z "$TOKEN" ]; then - echo "" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - echo "🔑 Настройка Telegram Bot" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - echo "" - echo "Для работы бота необходим токен от @BotFather" - echo "" - echo "Как получить токен:" - echo " 1. Откройте @BotFather в Telegram" - echo " 2. Отправьте команду /newbot" - echo " 3. Введите имя бота (например: My CLI Bot)" - echo " 4. Введите username бота (должен заканчиваться на 'bot')" - echo " 5. Скопируйте полученный токен" - echo "" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - echo "" - - # Запрос токена с подтверждением - while true; do - read -p "📋 Вставьте токен бота: " TOKEN - - # Проверка формата токена (примерно 46 символов, содержит : и _) - if [[ "$TOKEN" =~ ^[0-9]+:[A-Za-z0-9_-]+$ ]]; then - echo "" - read -p "💾 Сохранить токен в .env? (y/n): " SAVE - if [[ "$SAVE" =~ ^[Yy]$ ]]; then - set_env_value "TELEGRAM_BOT_TOKEN" "$TOKEN" - echo "✅ Токен сохранён в $ENV_FILE" - fi - break - else - echo "❌ Неверный формат токена. Токен должен выглядеть как: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz" - echo "" - fi - done +# Проверка токена +TOKEN=$(grep "^TELEGRAM_BOT_TOKEN=" "$ENV_FILE" | cut -d'=' -f2) +if [ -z "$TOKEN" ] || [ "$TOKEN" = "123456789:ABCdefGHIjklMNOpqrsTUVwxyz" ]; then + echo -e "${YELLOW}⚠️ TELEGRAM_BOT_TOKEN не установлен в .env${NC}" + echo "Отредактируйте .env и укажите токен от @BotFather" + exit 1 fi -# Экспорт токена для бота +# Экспорт токена export TELEGRAM_BOT_TOKEN="$TOKEN" +# Проверка qwen-code (опционально) +if command -v qwen &> /dev/null; then + echo -e "${GREEN}✅ qwen-code: $(qwen --version 2>&1 | head -1)${NC}" +else + echo -e "${YELLOW}⚠️ qwen-code не найден (ИИ-чат не будет работать)${NC}" + echo "Установите: npm install -g @qwen-code/qwen-code" +fi + # Запуск бота echo "" -echo "🤖 Запуск Telegram CLI Bot..." -echo "" python bot.py