import logging import sqlite3 import asyncio from aiogram import Bot, Dispatcher, types from aiogram.contrib.middlewares.logging import LoggingMiddleware from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton # Устанавливаем уровень логов logging.basicConfig(level=logging.INFO) # Подключаемся к базе данных SQLite conn = sqlite3.connect("answers.db") cursor = conn.cursor() # Создание таблицы для хранения ответов cursor.execute(""" CREATE TABLE IF NOT EXISTS answers ( user_id INTEGER, question_id INTEGER, answer TEXT ) """) conn.commit() # Заменить на свой токен API_TOKEN = '7472030348:AAGI53nX-ON-WBmEhd_qBC6EnZsHOqp_2kE' GROUP_ID = '-1001961537659' # Инициализация бота и диспетчера bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) dp.middleware.setup(LoggingMiddleware()) # Клавиатура для подтверждения ответов confirm_keyboard = ReplyKeyboardMarkup(resize_keyboard=True).add(KeyboardButton('Подтвердить')) # Словарь для хранения вопросов и ответов questions = { 1: "Как вас зовут?", 2: "Укажите номер телефона дл связи", 3: "Укажите район, улицу дом", 4: "Какая уборка нужна, влажная ли сухая?", 5: "На какое время?", 6: "Оплата наличными или картой?" } # Обработчик команды /start @dp.message_handler(commands=['start']) async def start(message: types.Message): await message.answer("Привет! Я задам тебе 6 вопросов. Давай начнем.") await ask_question(message.chat.id, 1) # Функция для задания вопроса async def ask_question(user_id, question_id): #question_text = questions[question_id] #await bot.send_message(user_id, text=question_text, reply_markup=confirm_keyboard) if question_id == 4: keyboard = InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton(text="Влажная", callback_data="wet_cleaning"), InlineKeyboardButton(text="Сухая", callback_data="dry_cleaning") ] ]) question_text = questions[question_id] await bot.send_message(user_id, text=question_text, reply_markup=keyboard) elif question_id == 5: keyboard = InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton(text="Утро", callback_data="morning_time"), InlineKeyboardButton(text="День", callback_data="day_time"), InlineKeyboardButton(text="Вечер", callback_data="evening_time") ] ]) question_text = questions[question_id] await bot.send_message(user_id, text=question_text, reply_markup=keyboard) elif question_id == 6: keyboard = InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton(text="Наличные", callback_data="cash_payment"), InlineKeyboardButton(text="Карта", callback_data="card_payment") ] ]) question_text = questions[question_id] await bot.send_message(user_id, text=question_text, reply_markup=keyboard) else: question_text = questions[question_id] await bot.send_message(user_id, text=question_text, reply_markup=confirm_keyboard) # Обработчик callback-кнопок @dp.callback_query_handler(lambda query: query.data in ['wet_cleaning', 'dry_cleaning', 'morning_time', 'day_time', 'evening_time', 'cash_payment', 'card_payment']) async def handle_callback_answer(query: types.CallbackQuery): answer = { 'wet_cleaning': 'Влажная уборка', 'dry_cleaning': 'Сухая уборка', 'morning_time': 'Утро', 'day_time': 'День', 'evening_time': 'Вечер', 'cash_payment': 'Наличные', 'card_payment': 'Карта' } await save_answer(query.from_user.id, answer[query.data]) await ask_question(query.from_user.id, query.message.message_id + 1) # Функция для сохранения ответа в базе данных async def save_answer(user_id, answer): cursor.execute("INSERT INTO answers (user_id, question_id, answer) VALUES (?, ?, ?)", (user_id, cursor.rowcount + 1, answer)) conn.commit() # Обработчик ответов с текстовым полем @dp.message_handler(lambda message: message.text != 'Подтвердить') async def handle_text_answer(message: types.Message): user_id = message.chat.id cursor.execute("SELECT MAX(question_id) FROM answers WHERE user_id=?", (user_id,)) prev_question_id = cursor.fetchone()[0] if prev_question_id is None: question_id = 1 else: question_id = prev_question_id + 1 answer = message.text cursor.execute("INSERT INTO answers (user_id, question_id, answer) VALUES (?, ?, ?)", (user_id, question_id, answer)) conn.commit() if question_id < 6: await ask_question(user_id, question_id + 1) else: await bot.send_message(user_id, "Ответы записаны. Подтверди перед отправкой.", reply_markup=confirm_keyboard) # Обработчик ответов с inline кнопкой @dp.callback_query_handler() async def handle_callback_answer(query: types.CallbackQuery): user_id = query.from_user.id answer = query.data cursor.execute("SELECT MAX(question_id) FROM answers WHERE user_id=?", (user_id,)) prev_question_id = cursor.fetchone()[0] if prev_question_id is None: question_id = 1 else: question_id = prev_question_id + 1 cursor.execute("INSERT INTO answers (user_id, question_id, answer) VALUES (?, ?, ?)", (user_id, question_id, answer)) conn.commit() if question_id < 6: await ask_question(user_id, question_id + 1) else: await bot.send_message(user_id, "Ответы записаны. Подтверди перед отправкой.", reply_markup=confirm_keyboard) # Функция для подтверждения ответов и отправки в группу @dp.message_handler(lambda message: message.text == 'Подтвердить') async def confirm_answers(message: types.Message): user_id = message.chat.id cursor.execute("SELECT * FROM answers WHERE user_id=?", (user_id,)) answers = cursor.fetchall() if answers: group_id = GROUP_ID # Заменить на ID вашей группы answer_text = '\n'.join([f"{questions[ans[1]]}: {ans[2]}" for ans in answers]) # Очищаем таблицу с ответами cursor.execute("DELETE FROM answers WHERE user_id=?", (user_id,)) conn.commit() # Отправляем ответы в группу с помощью реплая sent_message = await bot.send_message(group_id, answer_text) await bot.send_message(user_id, f"Ответы отправлены в группу. Можете посмотреть их [здесь](https://t.me/{sent_message.chat.username}/{sent_message.message_id})", parse_mode='Markdown') else: await bot.send_message(user_id, "Ответов нет") if __name__ == '__main__': loop = asyncio.get_event_loop() try: loop.create_task(dp.start_polling()) loop.run_forever() except KeyboardInterrupt: pass finally: conn.close()