🚿 Лучшая сантехника для дома: рейтинг 2026

Выбрали 3 модели с лучшим соотношением цены, качества и дизайна. Без переплат — только проверенные варианты.
⚡️ Нажав на кнопку, вы перейдёте на сайт магазина с нашей партнёрской ссылкой. Это не увеличивает стоимость, а помогает нам делать новые обзоры.
Смеситель для кухни
🏆 ВЫБОР ЭКСПЕРТА
Смеситель Grohe Essence New ★★★★★ 4.9
от 8 990 ₽
Немецкое качество, керамический картридж, экономия воды до 40%, плавный ход. Идеален для кухни и ванны.

✅ Плюсы

  • Долговечность
  • Антиизвестковый аэратор
  • Лёгкий монтаж

⚠️ Нюансы

  • Выше среднего чека
  • Требует качественной воды
🔥 Смотреть цену и купить
Душевая стойка
💧 ЛУЧШАЯ ЦЕНА
Душевая стойка Kaiser H115 ★★★★☆ 4.7
от 6 490 ₽
Термостат, 3 режима струи, верхний душ 25 см. Отличный вариант для современной ванной комнаты.

✅ Плюсы

  • Стабильная температура
  • Простая чистка
  • Доступная цена

⚠️ Нюансы

  • Пластиковые элементы
  • Не подходит для низкого давления
💧 Выбрать душевую систему
Подвесной унитаз
✨ ПРЕМИУМ ДИЗАЙН
Унитаз подвесной Vitra Aventura ★★★★★ 4.8
от 21 900 ₽
Компактный, гладкая керамика, система антибактериального покрытия, инсталляция в комплекте.

✅ Плюсы

  • Лёгкая уборка
  • Экономия места
  • Микрооблив

⚠️ Нюансы

  • Сложный монтаж
  • Высокая цена
✨ Узнать цену
📌 Как мы выбирали — опирались на отзывы реальных покупателей, тесты на долговечность и соотношение цены и качества.
Все модели сертифицированы и подходят для установки в типовых квартирах и частных домах.
def get_items_keyboard(category_id, items): keyboard = [] for idx, item in enumerate(items): keyboard.append([InlineKeyboardButton(text=item["name"], callback_data=f"item_{category_id}_{idx}")]) keyboard.append([InlineKeyboardButton(text="🔙 Назад к категориям", callback_data="show_plumbing")]) keyboard.append([InlineKeyboardButton(text="◀️ Главное меню", callback_data="main_menu")]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_item_detail_keyboard(category_id, item_index): keyboard = [ [InlineKeyboardButton(text="🛒 Запросить цену", callback_data=f"request_price_{category_id}_{item_index}")], [InlineKeyboardButton(text="🔙 К списку", callback_data=f"cat_{category_id}")], [InlineKeyboardButton(text="◀️ Главное меню", callback_data="main_menu")] ] return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_back_to_design_keyboard(): return InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="🔙 К списку проектов", callback_data="show_design")], [InlineKeyboardButton(text="◀️ Главное меню", callback_data="main_menu")] ]) # --- ИНИЦИАЛИЗАЦИЯ БОТА --- logging.basicConfig(level=logging.INFO) bot = Bot(token=TOKEN) dp = Dispatcher() # --- ОБРАБОТЧИКИ --- @dp.message(Command("start")) async def start(message: types.Message): await message.answer_photo( photo="https://img.freepik.com/free-vector/modern-bathroom-interior_23-2147815398.jpg", # можно заменить на своё приветственное фото caption="Добро пожаловать!\n\nКаталог дизайна интерьеров и премиальной сантехники.\nВыберите раздел ниже:", parse_mode=ParseMode.HTML, reply_markup=main_menu ) @dp.callback_query(lambda c: c.data == "main_menu") async def main_menu_callback(callback: types.CallbackQuery): await callback.message.edit_caption( caption="Главное меню\n\nВыберите раздел:", parse_mode=ParseMode.HTML, reply_markup=main_menu ) await callback.answer() @dp.callback_query(lambda c: c.data == "show_design") async def show_design_list(callback: types.CallbackQuery): text = "🎨 Наши дизайн-проекты\n\nВыберите проект, чтобы увидеть фото и описание:" await callback.message.edit_caption( caption=text, parse_mode=ParseMode.HTML, reply_markup=get_design_keyboard() ) await callback.answer() @dp.callback_query(lambda c: c.data.startswith("design_")) async def show_design_detail(callback: types.CallbackQuery): project_id = callback.data.split("_")[1] proj = design_projects.get(project_id) if not proj: await callback.answer("Проект не найден") return caption = f"{proj['name']}\n\n{proj['desc']}" photo = proj["photo_path"] # Если фото — локальный файл try: if photo.startswith("http"): await callback.message.edit_caption(caption=caption, parse_mode=ParseMode.HTML, reply_markup=get_back_to_design_keyboard()) await bot.send_photo(callback.message.chat.id, photo=photo, caption=caption, parse_mode=ParseMode.HTML, reply_markup=get_back_to_design_keyboard()) await callback.message.delete() else: photo_file = FSInputFile(photo) await callback.message.delete() await bot.send_photo(callback.message.chat.id, photo=photo_file, caption=caption, parse_mode=ParseMode.HTML, reply_markup=get_back_to_design_keyboard()) except Exception as e: logging.error(f"Ошибка отправки фото: {e}") await callback.message.edit_text(caption, parse_mode=ParseMode.HTML, reply_markup=get_back_to_design_keyboard()) await callback.answer() @dp.callback_query(lambda c: c.data == "show_plumbing") async def show_plumbing_categories(callback: types.CallbackQuery): await callback.message.edit_caption( caption="🚿 Каталог сантехники\n\nВыберите категорию:", parse_mode=ParseMode.HTML, reply_markup=get_plumbing_categories() ) await callback.answer() @dp.callback_query(lambda c: c.data.startswith("cat_")) async def show_items_list(callback: types.CallbackQuery): category_id = callback.data.split("_")[1] category = plumbing_catalog.get(category_id) if not category: await callback.answer("Категория не найдена") return text = f"{category['name']}\n\nВыберите модель:" await callback.message.edit_caption( caption=text, parse_mode=ParseMode.HTML, reply_markup=get_items_keyboard(category_id, category["items"]) ) await callback.answer() @dp.callback_query(lambda c: c.data.startswith("item_")) async def show_item_detail(callback: types.CallbackQuery): _, category_id, idx_str = callback.data.split("_") idx = int(idx_str) category = plumbing_catalog.get(category_id) if not category or idx >= len(category["items"]): await callback.answer("Товар не найден") return item = category["items"][idx] caption = f"{item['name']}\n\n{item['desc']}\n\n💰 Цена: {item['price']}" photo = item["photo"] try: if photo.startswith("http"): await callback.message.edit_caption(caption=caption, parse_mode=ParseMode.HTML, reply_markup=get_item_detail_keyboard(category_id, idx)) await bot.send_photo(callback.message.chat.id, photo=photo, caption=caption, parse_mode=ParseMode.HTML, reply_markup=get_item_detail_keyboard(category_id, idx)) await callback.message.delete() else: photo_file = FSInputFile(photo) await callback.message.delete() await bot.send_photo(callback.message.chat.id, photo=photo_file, caption=caption, parse_mode=ParseMode.HTML, reply_markup=get_item_detail_keyboard(category_id, idx)) except Exception as e: logging.error(f"Ошибка: {e}") await callback.message.edit_text(caption, parse_mode=ParseMode.HTML, reply_markup=get_item_detail_keyboard(category_id, idx)) await callback.answer() @dp.callback_query(lambda c: c.data.startswith("request_price_")) async def request_price(callback: types.CallbackQuery): # Отправляем уведомление админу user = callback.from_user await bot.send_message( ADMIN_ID, f"🔔 Запрос цены от @{user.username or user.first_name}\n" f"ID: {user.id}\n" f"Товар: {callback.data}" ) await callback.answer("Запрос отправлен! Менеджер свяжется с вами.", show_alert=True) @dp.callback_query(lambda c: c.data == "contacts") async def contacts(callback: types.CallbackQuery): text = ( "📞 Контакты и заказ\n\n" "По вопросам дизайна и сантехники:\n" "📱 WhatsApp: +7 900 123-45-67\n" "📧 Email: info@designplumb.ru\n" "⏰ Режим работы: 10:00–20:00 МСК\n\n" "Или нажмите «Запросить цену» на карточке товара — мы свяжемся с вами." ) await callback.message.edit_caption( caption=text, parse_mode=ParseMode.HTML, reply_markup=InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="◀️ Главное меню", callback_data="main_menu")] ]) ) await callback.answer() # --- ЗАПУСК --- async def main(): await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main()) echo "# index.html" >> README.md git init git add README.md git commit -m "first commit" git branch -M main git remote add origin https://github.com/dint86-max/index.html.git git push -u origin main