From 60ef76024ec7a733a9b6019663e10f3b757da676 Mon Sep 17 00:00:00 2001 From: Kenik Date: Thu, 25 Jun 2026 09:00:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BA?= =?UTF-8?q?=D0=BD=D0=BE=D0=BF=D0=BE=D0=BA=20+=20VK-=D0=B8=D0=BC=D1=8F=20?= =?UTF-8?q?=D0=B2=20=D1=83=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BE=20=D0=B7=D0=B0=D1=8F=D0=B2=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Админка — всегда зелёная (POSITIVE). - Меню изменения данных: «Назад к проверке» — красная. - Возвращающийся клиент: «Да/Сменить имя/телефон/Заполнить заново/Отмена» — инлайн-кнопки под сообщением. - Уведомление оператору: добавлено реальное имя из VK с флагом «не совпадает с введённым» — помогает отсеивать рандомные/фейковые данные (профиль VK уже был). Co-Authored-By: Claude Opus 4.8 --- bot.py | 27 ++++++++++++++++++++++++++- keyboards.py | 9 +++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/bot.py b/bot.py index 2d5dac5..c51e63f 100644 --- a/bot.py +++ b/bot.py @@ -143,6 +143,20 @@ class VKBotApplication: for op_id in self._operator_ids(): self.send_message(op_id, message) + def _vk_name(self, user_id: int) -> Optional[str]: + """Реальное имя пользователя из VK (для сверки с введёнными данными).""" + if not self.vk or user_id <= 0: + return None + try: + info = self.vk.users.get(user_ids=user_id) + if info: + u = info[0] + full = f"{u.get('first_name', '')} {u.get('last_name', '')}".strip() + return full or None + except Exception as e: + logger.error(f"Не удалось получить имя VK для {user_id}: {e}") + return None + @staticmethod def _progress_bar(step: int, total: int = 3) -> str: """Визуальный прогресс шага формы: ▰▰▱ Шаг 2 из 3.""" @@ -1761,9 +1775,20 @@ class VKBotApplication: consent_3 = user_data.get("consent_3", "Согласен") promo_line = f"🎁 Промокод клиента: {promo}\n" if promo else "" + # Реальное имя из VK + флаг несовпадения (помогает отсеять «рандомные» данные) + vk_name = self._vk_name(user_id) + if vk_name: + mismatch = "" + if name and name.strip().lower() not in vk_name.lower() and vk_name.lower() not in name.strip().lower(): + mismatch = " ⚠️ не совпадает с введённым!" + vk_name_line = f"🪪 Имя в VK: {vk_name}{mismatch}\n" + else: + vk_name_line = "" + operator_msg = ( f"⚡ Получена новая заявка!\n\n" - f"👤 Имя: {name}\n" + f"👤 Имя (введено): {name}\n" + f"{vk_name_line}" f"📞 Телефон: {format_phone_display(phone)}\n" f"🎯 Выбранная услуга: {question}\n" f"🕒 Удобное время звонка: {call_time}\n" diff --git a/keyboards.py b/keyboards.py index c9b3090..f98d2dd 100644 --- a/keyboards.py +++ b/keyboards.py @@ -22,7 +22,7 @@ def get_main_keyboard(is_admin: bool = False) -> str: # Кнопка админ-панели — только для администраторов (отдельной строкой) if is_admin: keyboard.add_line() - keyboard.add_button("Админка ⚙️", color=VkKeyboardColor.SECONDARY) + keyboard.add_button("Админка ⚙️", color=VkKeyboardColor.POSITIVE) return keyboard.get_keyboard() @@ -210,14 +210,15 @@ def get_binary_keyboard(show_skip: bool = False) -> str: def get_returning_keyboard() -> str: - """Клавиатура для возвращающегося клиента, чьи данные уже известны.""" - keyboard = VkKeyboard(one_time=False) + """Инлайн-клавиатура для возвращающегося клиента (под сообщением).""" + keyboard = VkKeyboard(inline=True) keyboard.add_button("Да, всё верно ✅", color=VkKeyboardColor.PRIMARY) keyboard.add_line() keyboard.add_button("Сменить имя 👤", color=VkKeyboardColor.SECONDARY) keyboard.add_button("Сменить телефон 📞", color=VkKeyboardColor.SECONDARY) keyboard.add_line() keyboard.add_button("Заполнить заново 🔄", color=VkKeyboardColor.SECONDARY) + keyboard.add_line() keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE) return keyboard.get_keyboard() @@ -308,7 +309,7 @@ def get_edit_menu_keyboard() -> str: keyboard.add_button("Изменить Услугу 🎮", color=VkKeyboardColor.SECONDARY) keyboard.add_button("Изменить Время 🕒", color=VkKeyboardColor.SECONDARY) keyboard.add_line() - keyboard.add_button("Назад к проверке ↩️", color=VkKeyboardColor.SECONDARY) + keyboard.add_button("Назад к проверке ↩️", color=VkKeyboardColor.NEGATIVE) return keyboard.get_keyboard()