Загрузка данных
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"
bot = Bot(token=TELEGRAM_TOKEN)
dp = Dispatcher()
class CarEvaluation(StatesGroup):
waiting_for_model = State()
waiting_for_year = State()
waiting_for_engine = State()
waiting_for_mileage = State()
@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']} км. Укажи цену в USD, ликвидность и совет продавцу. Пиши строго по делу на русском языке."
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 = ""
try:
data = json.dumps(payload).encode("utf-8")
req = urllib.request.Request(url, data=data, headers=headers, method="POST")
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", errors="ignore")
result = json.loads(res_data)
if isinstance(result, dict) and 'choices' in result:
ai_analysis = result['choices']['message']['content']
else:
ai_analysis = str(result)
except urllib.error.HTTPError as e:
error_body = e.read().decode("utf-8", errors="ignore")
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_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("Заключение ИИ по рынку РБ:", 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)
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())