/
yeexzdev
/
frontiersystem
Обзор
Документация
Войти
/
yeexzdev
/
frontiersystem
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/vk_bot.py
121 строка
5 KB
yeexzdev
initial commit
15 май 2026, 20:25
15 май 2026, 20:25
bc97861
Код
Авторство
О чём код?
import vk_api from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType from vk_api.keyboard import VkKeyboard, VkKeyboardColor import hashlib import secrets import random import threading import logging from datetime import datetime logger = logging.getLogger(__name__) class RegistrationBot: def __init__(self, token, group_id, users_db, cards_db, admin_id): self.vk_session = vk_api.VkApi(token=token) self.vk = self.vk_session.get_api() self.longpoll = VkBotLongPoll(self.vk_session, group_id) self.users_db = users_db self.cards_db = cards_db self.admin_id = admin_id self.user_states = {} self.user_data_cache = {} self.cards_available = True def send_msg(self, user_id, text, keyboard=None): params = {'user_id': user_id, 'message': text, 'random_id': 0} if keyboard: params['keyboard'] = keyboard try: self.vk.messages.send(**params) except Exception as e: logger.error(f"Ошибка отправки сообщения в ВК: {e}") def get_role_keyboard(self): from config import DEPARTMENTS keyboard = VkKeyboard(one_time=True) for i, dept in enumerate(DEPARTMENTS): color = VkKeyboardColor.PRIMARY keyboard.add_button(dept, color=color) if (i + 1) % 2 == 0 and (i + 1) < len(DEPARTMENTS): keyboard.add_line() return keyboard.get_keyboard() def handle_registration(self, user_id, text): state = self.user_states.get(user_id) if state is None: self.send_msg(user_id, "Здравствуйте! Введите ФИО для регистрации:") self.user_states[user_id] = "wait_name" self.user_data_cache[user_id] = {} elif state == "wait_name": self.user_data_cache[user_id]["name"] = text self.send_msg(user_id, "Введите номер телефона в формате 89*********:") self.user_states[user_id] = "wait_phone" elif state == "wait_phone": self.user_data_cache[user_id]["phone"] = text self.send_msg(user_id, "Где вы работаете?", keyboard=self.get_role_keyboard()) self.user_states[user_id] = "wait_role1" elif state == "wait_role1": self.user_data_cache[user_id]["role1"] = text.lower() self.send_msg(user_id, "Введите вашу должность/специальность:") self.user_states[user_id] = "wait_role2" elif state == "wait_role2": self.user_data_cache[user_id]["role2"] = text.lower() self.finish_registration(user_id) def finish_registration(self, user_id): pin = str(secrets.randbelow(8999) + 1000) pin_hash = hashlib.sha256(pin.encode()).hexdigest() pool_id = self.cards_db.get_free_card_id() if pool_id: self.users_db.add_user( user_id, self.user_data_cache[user_id]['name'], self.user_data_cache[user_id]['phone'], self.user_data_cache[user_id]['role1'], self.user_data_cache[user_id]['role2'], pool_id, pin_hash ) msg = f"Регистрация успешна. Карта: {pool_id}. Ваш ПИН: {pin}. Сохраните его." self.send_msg(user_id, msg) admin_msg = f"Новый пользователь: {self.user_data_cache[user_id]['name']}. Карта: {pool_id}" self.send_msg(self.admin_id, admin_msg) self.user_states.pop(user_id, None) self.user_data_cache.pop(user_id, None) else: self.send_msg(user_id, "Свободных карт нет. Обратитесь к администратору.") self.cards_available = False def generate_2fa_code(self, vk_id): code = str(random.randint(1000, 9999)) self.send_msg(vk_id, f"🔐 Код подтверждения входа: {code}") return code def _run(self): logger.info("VK Bot запущен") for event in self.longpoll.listen(): if event.type == VkBotEventType.MESSAGE_NEW: uid = event.obj.message['from_id'] txt = event.obj.message['text'] if self.users_db.is_registered(uid): self.send_msg(uid, "Вы уже зарегистрированы в системе.") else: self.handle_registration(uid, txt) def run_bot(self): threading.Thread(target=self._run, daemon=True).start()