Загрузка данных
import asyncio
import os
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
from openai import AsyncOpenAI
# --- НАСТРОЙКИ КЛЮЧЕЙ И ТОКЕНОВ ---
TELEGRAM_TOKEN = "8397324522:AAHkSqnHN5pMT9loQGUWot0ls-9kdZVBPX8"
VSEGPT_KEY = "sk-or-vv-8740fb10821695225615171b1c18b967f1123e97de074d6c2ac98928994713e8"
# Инициализируем бота Telegram
bot = Bot(token=TELEGRAM_TOKEN)
dp = Dispatcher()
# Инициализируем клиента ИИ строго по регламенту VseGPT
ai_client = AsyncOpenAI(
api_key=VSEGPT_KEY,
base_url="https://vsegpt.ru"
)
# Шаги нашего опроса (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)
# ФИНАЛЬНЫЙ ШАГ: отправляем запрос в ИИ и генерируем Word
@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. Краткую рекомендацию для продавца/покупателя по цене сделки.
Пиши строго в деловом, аналитическом стиле, без лишних приветствий. Текст должен быть готов для вставки в документ.
"""
ai_analysis = ""
try:
# Отправляем стандартный запрос к модели через официальную библиотеку
response = await ai_client.chat.completions.create(
model="openai/gpt-4o-mini",
messages=[{"role": "user", "content": prompt_text}],
extra_headers={"X-Title": "Auto Eval Bot"}
)
# ИСПРАВЛЕНО: Безопасное извлечение текста ответа (проверяем тип данных от VseGPT)
if isinstance(response, str):
ai_analysis = response
elif hasattr(response, 'choices') and len(response.choices) > 0:
ai_analysis = response.choices.message.content
else:
ai_analysis = str(response)
except Exception as e:
print(f"Ошибка при запросе к ИИ: {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)
# Вставляем сгенерированный ИИ текст прямо в документ Word
doc.add_paragraph(ai_analysis)
# Формируем имя файла
safe_model_name = user_data['model'].replace(' ', '_')
file_name = f"Ocenka_{safe_model_name}.docx"
# Сохраняем файл на компьютер
doc.save(file_name)
# --- КОНЕЦ СОЗДАНИЯ WORD ---
# Отправляем файл пользователю в 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("Бот запущен с умным разбором текстовых ответов. Жду финальный тест...")
await dp.start_polling(bot)
# Запуск программы
if __name__ == "__main__":
asyncio.run(main())