Загрузка данных


import asyncio
import os
import json
import urllib.request
import urllib.error
from aiogram import Bot, Dispatcher, types, F
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.types import FSInputFile
from docx import Document

# --- НАСТРОЙКИ КЛЮЧЕЙ И ТОКЕНОВ ---
TELEGRAM_TOKEN = "8397324522:AAHkSqnHN5pMT9loQGUWot0ls-9kdZVBPX8"
VSEGPT_KEY = "sk-or-vv-8740fb10821695225615171b1c18b967f1123e97de074d6c2ac98928994713e8"

# Инициализируем бота Telegram
bot = Bot(token=TELEGRAM_TOKEN)
dp = Dispatcher()

# Шаги опроса (FSM)
class CarEvaluation(StatesGroup):
    waiting_for_model = State()     
    waiting_for_year = State()      
    waiting_for_engine = State()    
    waiting_for_mileage = State()   

# Команда /start запускает опрос
@dp.message(Command("start"))
async def cmd_start(message: types.Message, state: FSMContext):
    await message.answer(
        "Привет! Я помогу оценить стоимость автомобиля в Беларуси.\n"
        "Давай соберем данные. Напиши **марку и модель** автомобиля (например: Volkswagen Golf):"
    )
    await state.set_state(CarEvaluation.waiting_for_model)

@dp.message(CarEvaluation.waiting_for_model)
async def process_model(message: types.Message, state: FSMContext):
    await state.update_data(model=message.text)
    await message.answer("Отлично! Теперь введи **год выпуска** (например: 2015):")
    await state.set_state(CarEvaluation.waiting_for_year)

@dp.message(CarEvaluation.waiting_for_year)
async def process_year(message: types.Message, state: FSMContext):
    await state.update_data(year=message.text)
    await message.answer("Укажи **объем двигателя** в литрах (например: 1.4):")
    await state.set_state(CarEvaluation.waiting_for_engine)

@dp.message(CarEvaluation.waiting_for_engine)
async def process_engine(message: types.Message, state: FSMContext):
    await state.update_data(engine=message.text)
    await message.answer("И последнее: укажи **пробег** автомобиля в километрах (например: 175000):")
    await state.set_state(CarEvaluation.waiting_for_mileage)

# ФИНАЛЬНЫЙ ШАГ
@dp.message(CarEvaluation.waiting_for_mileage)
async def process_mileage(message: types.Message, state: FSMContext):
    await state.update_data(mileage=message.text)
    user_data = await state.get_data()
    
    await message.answer("Данные приняты! ИИ анализирует автомобильный рынок Беларуси, подождите несколько секунд...")
    
    prompt_text = f"""
    Ты — профессиональный автомобильный эксперт-оценщик на рынке Беларуси.
    Сделай подробный, структурированный и качественный анализ рыночной стоимости для автомобиля:
    • Марка и модель: {user_data['model']}
    • Год выпуска: {user_data['year']} год
    • Объем двигателя: {user_data['engine']} л.
    • Пробег: {user_data['mileage']} км
    
    Используя свои глубокие знания об авторынке Республики Беларусь, обязательно укажи в тексте отчета:
    1. Примерный диапазон цен (минимальная, средняя, максимальная стоимость в USD) на эту модель на белорусских площадках (av.by, kufar.by).
    2. Факторы ликвидности: насколько эта машина востребована в РБ, легко ли её продать, какие особенности этого мотора/коробки влияют на цену.
    3. Краткую рекомендацию для продавца по цене быстрой продажи и цене максимальной выгоды.
    
    Пиши строго в деловом, аналитическом стиле, разбивая текст на абзацы. Без лишних приветствий. Текст должен быть полностью на русском языке.
    """
    
    # Жесткий фикс адреса: отправляем строго на технический адрес API
    url = "https://vsegpt.ru"
    headers = {
        "Authorization": f"Bearer {VSEGPT_KEY}",
        "Content-Type": "application/json",
        "X-Title": "Auto Eval Bot"
    }
    payload = {
        "model": "openai/gpt-4o-mini",
        "messages": [{"role": "user", "content": prompt_text}],
        "temperature": 0.7
    }
    
    ai_analysis = ""
    
    # Отправляем через встроенный в Python urllib, который работает без сбоев на любом тарифе
    try:
        data = json.dumps(payload).encode("utf-8")
        req = urllib.request.Request(url, data=data, headers=headers, method="POST")
        
        # Отключаем строгую проверку SSL для домашних ПК
        import ssl
        ctx = ssl.create_default_context()
        ctx.check_hostname = False
        ctx.verify_mode = ssl.CERT_NONE
        
        # Выполняем запрос
        with urllib.request.urlopen(req, context=ctx, timeout=30) as response:
            res_data = response.read().decode("utf-8")
            result = json.loads(res_data)
            
            if isinstance(result, dict) and 'choices' in result:
                ai_analysis = result['choices'][0]['message']['content']
            else:
                ai_analysis = str(result)
                
    except urllib.error.HTTPError as e:
        error_body = e.read().decode("utf-8")
        ai_analysis = f"Ошибка сервера VseGPT. Статус: {e.code}. Ответ: {error_body}"
    except Exception as e:
        ai_analysis = f"Не удалось отправить запрос к ИИ. Ошибка: {e}"

    # --- НАЧАЛО СОЗДАНИЯ WORD ---
    doc = Document()
    doc.add_heading("ЭКСПЕРТНЫЙ ОТЧЕТ ОБ ОЦЕНКЕ АВТОМОБИЛЯ", level=0)
    
    doc.add_heading("1. Технические характеристики объекта:", level=1)
    doc.add_paragraph(f"• Марка и модель: {user_data['model']}")
    doc.add_paragraph(f"• Год выпуска: {user_data['year']} г.")
    doc.add_paragraph(f"• Объем двигателя: {user_data['engine']} л.")
    doc.add_paragraph(f"• Пробег: {user_data['mileage']} км")
    
    doc.add_heading("2. Методология оценки:", level=1)
    doc.add_paragraph(
        "Анализ проведен интеллектуальной системой оценки на основе агрегированных исторических данных "
        "крупнейших автомобильных классифайдов Республики Беларусь (av.by, kufar.by)."
    )
    
    doc.add_heading("3. Экспертное заключение ИИ по рынку РБ:", level=1)
    doc.add_paragraph(ai_analysis)
    
    # Сохраняем файл на компьютер
    safe_model_name = user_data['model'].replace(' ', '_')
    file_name = f"Ocenka_{safe_model_name}.docx"
    doc.save(file_name)
    
    # Отправляем файл пользователю в Telegram чат
    word_file = FSInputFile(file_name)
    await message.answer_document(word_file, caption=f"Ваш отчет для {user_data['model']} успешно сформирован!")
    
    if os.path.exists(file_name):
        os.remove(file_name)
        
    await state.clear()

async def main():
    print("Бот успешно запущен на прямой доставке данных. Жду тест в Telegram...")
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())