import telebot from telebot import types import sqlite3 # Создаем экземпляр бота с указанием токена bot = telebot.TeleBot('7160826305:AAE034sFnCCmdh-KfSBUrvlvr_rmdBJHwXg') # Создаем глобальный словарь для хранения вопросов и вариантов ответов questions = { "question1": { "question": "Вопрос для темы 1", "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], "correct_option_id": 2 }, "question2": { "question": "Вопрос для темы 2", "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], "correct_option_id": 2 }, "question3": { "question": "Вопрос для темы 3", "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], "correct_option_id": 2 }, "question4": { "question": "Вопрос для темы 4", "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], "correct_option_id": 2 }, "question5": { "question": "Вопрос для темы 5", "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], "correct_option_id": 2 }, "question6": { "question": "Вопрос для темы 6", "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], "correct_option_id": 2 }, "question7": { "question": "Вопрос для темы 7", "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], "correct_option_id": 2 }, "question8": { "question": "Вопрос для темы 8", "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], "correct_option_id": 2 }, } links = { "https://telegra.ph/ONTOLOGIYA-KAK-UCHENIE-O-BYTII-04-13", "https://telegra.ph/Primenenie-ontologij-04-13", "https://telegra.ph/Sovremennaya-ontologiya-aktualnye-problemy-04-13", "https://telegra.ph/Filosofiya-nauki-i-konkretnye-nauki-04-13", "https://telegra.ph/FILOSOFSKIE-PROBLEMY-INFORMATIKI-04-13", "https://telegra.ph/Isklyuchitelnost-ponyatiya-informacii-04-13", "https://telegra.ph/Filosofskie-problemy-informatiki-i-informacionnyh-tehnologij-04-13", "https://telegra.ph/Filosofskie-problemy-informatiki-i-informacionnyh-tehnologij-04-13", } # Функция для обработки команды /start @bot.message_handler(commands=['start']) def handle_start(message): # Получаем информацию о пользователе username = message.from_user.first_name user_id = message.from_user.id chat_id = message.chat.id # Подключаемся к базе данных conn = sqlite3.connect('users.db') cursor = conn.cursor() # Проверяем, есть ли пользователь уже в базе данных cursor.execute("SELECT * FROM users WHERE chat_id=?", (chat_id,)) existing_user = cursor.fetchone() if existing_user: bot.reply_to(message, 'С возвращением!') else: bot.reply_to(message, 'Привет, {}! Я записал тебя в базу данных.'.format(username)) # Добавляем нового пользователя в базу данных cursor.execute("INSERT INTO users (username, user_id, chat_id, count) VALUES (?, ?, ?, 0)", (username, user_id, chat_id)) cursor.execute("INSERT INTO topics (chat_id, question1, question2, question3, question4, question5, question6, question7, question8) VALUES (?, 0, 0, 0, 0, 0, 0, 0, 0)", (chat_id,)) # Сохраняем изменения в базе данных conn.commit() # Закрываем соединение с базой данных conn.close() # Запрашиваем у пользователя выбор из меню bot.send_message(chat_id, "Пожалуйста, выбери один из пунктов меню:", reply_markup=create_menu_keyboard()) # Создаем клавиатуру с пунктами меню def create_menu_keyboard(): keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True) keyboard.add(types.KeyboardButton('Темы')) keyboard.add(types.KeyboardButton('Профиль')) keyboard.add(types.KeyboardButton('Рейтинг')) return keyboard # Функция для обработки выбора пользователя @bot.message_handler(func=lambda message: True) def handle_menu(message): if message.text == 'Темы': show_topics(message.chat.id) elif message.text == 'Профиль': show_profile(message.chat.id) elif message.text == 'Рейтинг': show_rating(message.chat.id) elif message.text == 'Вернуться к главному меню': bot.send_message(message.chat.id, "Пожалуйста, выбери один из пунктов меню:", reply_markup=create_menu_keyboard()) # Функция для отображения рейтинга пользователей def show_rating(chat_id): # Подключаемся к базе данных conn = sqlite3.connect('users.db') cursor = conn.cursor() # Получаем список пользователей, отсортированный по убыванию баллов (count) cursor.execute("SELECT username, count FROM users ORDER BY count DESC") rating = cursor.fetchall() # Формируем сообщение с рейтингом пользователей message = "Рейтинг пользователей:\n" for i, (username, count) in enumerate(rating, start=1): message += f"{i}. {username}: {count} баллов\n" # Отправляем сообщение с рейтингом bot.send_message(chat_id, message) # Закрываем соединение с базой данных conn.close() bot.send_message(chat_id, "Для возврата к главному меню нажмите кнопку ниже:", reply_markup=create_main_menu_keyboard()) # Функция для создания клавиатуры главного меню def create_main_menu_keyboard(): keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True) keyboard.add(types.KeyboardButton('Вернуться к главному меню')) return keyboard # Функция для отображения профиля пользователя def show_profile(chat_id): # Подключаемся к базе данных conn = sqlite3.connect('users.db') cursor = conn.cursor() # Получаем информацию о пользователе из таблицы users cursor.execute("SELECT username, count FROM users WHERE chat_id=?", (chat_id,)) user_data = cursor.fetchone() # Получаем информацию о темах, которые пользователь прошел из таблицы topics cursor.execute("SELECT * FROM topics WHERE chat_id=?", (chat_id,)) topics_data = cursor.fetchone() # Подсчитываем количество тем, которые пользователь прошел num_topics_passed = sum(topic_flag for topic_flag in topics_data[2:]) # Формируем сообщение с профилем пользователя if user_data: username, count = user_data message = f"Профиль пользователя {username}:\n" message += f"Баллов: {count}\n" message += f"Количество тем, которые прошел: {num_topics_passed} из 8" else: message = "Профиль пользователя не найден" # Отправляем сообщение с профилем пользователя bot.send_message(chat_id, message) keyboard = types.InlineKeyboardMarkup(row_width=1) keyboard.add(types.InlineKeyboardButton(text="Сбросить прогресс", callback_data="remove_progress")) bot.send_message(chat_id, 'Вы можете сбросить процесс прохождения ' 'всех тем, нажав на кнопку ниже (но учтите, что потеряете все баллы)', reply_markup=keyboard) # Закрываем соединение с базой данных conn.close() bot.send_message(chat_id, "Для возврата к главному меню нажмите кнопку ниже:", reply_markup=create_main_menu_keyboard()) # Функция для отображения клавиатуры с темами def show_topics(chat_id, page = 1): # Создаем клавиатуру с темами в зависимости от текущей страницы keyboard = create_topics_keyboard(page) # Отправляем сообщение с клавиатурой тем bot.send_message(chat_id, "Выберите тему:", reply_markup=keyboard) bot.send_message(chat_id, "Для возврата к главному меню нажмите кнопку ниже:", reply_markup=create_main_menu_keyboard()) def create_topics_keyboard(page): # Создаем клавиатуру с темами keyboard = types.InlineKeyboardMarkup(row_width=1) # Определяем диапазон тем для текущей страницы start_topic = (page - 1) * 4 + 1 end_topic = min(page * 4, 8) # Всего 8 тем if start_topic == 1: keyboard.add(types.InlineKeyboardButton(text="1.Онтология как учение о бытии", callback_data="topic1")) keyboard.add(types.InlineKeyboardButton(text="2.Применение онтологий", callback_data="topic2")) keyboard.add(types.InlineKeyboardButton(text="3.Современная онтология: актуальные проблемы", callback_data="topic3")) keyboard.add(types.InlineKeyboardButton(text="4.Философия науки и конкретные науки", callback_data="topic4")) elif start_topic == 5: keyboard.add(types.InlineKeyboardButton(text="5.Философские проблемы информатики", callback_data="topic5")) keyboard.add(types.InlineKeyboardButton(text="6.Исключительность понятия информации", callback_data="topic6")) keyboard.add(types.InlineKeyboardButton(text="7.Философские проблемы информатики и информационных технологий", callback_data="topic7")) keyboard.add(types.InlineKeyboardButton(text="8.Факты об онтологии", callback_data="topic8")) # Добавляем кнопки для перехода к следующей странице if end_topic < 8: keyboard.add(types.InlineKeyboardButton(text="Следующая страница ->", callback_data=f"next_page{page+1}")) # Добавляем кнопку для перехода к предыдущей странице (если не на первой странице) if page > 1: keyboard.add(types.InlineKeyboardButton(text="<- Предыдущая страница", callback_data=f"prev_page{page-1}")) return keyboard # Обработчик для нажатия на кнопку "Следующая страница" или "Предыдущая страница" @bot.callback_query_handler(func=lambda call: call.data.startswith(('next_page', 'prev_page'))) def handle_page_navigation(call): page = int(call.data.split('page')[-1]) # Удаляем предыдущее сообщение bot.delete_message(call.message.chat.id, call.message.message_id) bot.delete_message(call.message.chat.id, call.message.message_id + 1) # Показываем темы для новой страницы show_topics(call.message.chat.id, page) # Обработчик для нажатия на кнопку с темой @bot.callback_query_handler(func=lambda call: True) def handle_topic(call): topic = call.data chat_id = call.message.chat.id global questions # Отправляем сообщение с текстом по выбранной теме if topic == "remove_progress": conn = sqlite3.connect('users.db') cursor = conn.cursor() cursor.execute( "UPDATE topics SET question1 = 0 WHERE chat_id=?", (call.message.chat.id,)) cursor.execute("UPDATE users SET count = 0 WHERE user_id=?", (call.message.chat.id,)) bot.send_message(chat_id, 'Прогресс очищен') # Закрываем соединение с базой данных conn.commit() conn.close() elif topic == "topic1": keyboard = types.InlineKeyboardMarkup(row_width=1) test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question1") keyboard.add(test_button) # Отправляем ссылку на статью bot.send_message(chat_id, "https://telegra.ph/ONTOLOGIYA-KAK-UCHENIE-O-BYTII-04-13", reply_markup=keyboard) bot.delete_message(chat_id, call.message.message_id) bot.delete_message(chat_id, call.message.message_id + 1) bot.send_message(chat_id, "Для возврата к главному меню нажмите кнопку ниже:", reply_markup=create_main_menu_keyboard()) elif topic == "topic2": keyboard = types.InlineKeyboardMarkup(row_width=1) test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question2") keyboard.add(test_button) # Отправляем ссылку на статью bot.send_message(chat_id, "https://telegra.ph/Primenenie-ontologij-04-13", reply_markup=keyboard) bot.delete_message(chat_id, call.message.message_id) elif topic == "topic3": keyboard = types.InlineKeyboardMarkup(row_width=1) test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question3") keyboard.add(test_button) # Отправляем ссылку на статью bot.send_message(chat_id, "https://telegra.ph/Sovremennaya-ontologiya-aktualnye-problemy-04-13", reply_markup=keyboard) bot.delete_message(chat_id, call.message.message_id) elif topic == "topic4": keyboard = types.InlineKeyboardMarkup(row_width=1) test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question4") keyboard.add(test_button) # Отправляем ссылку на статью bot.send_message(chat_id, "https://telegra.ph/Filosofiya-nauki-i-konkretnye-nauki-04-13", reply_markup=keyboard) bot.delete_message(chat_id, call.message.message_id) elif topic == "topic5": keyboard = types.InlineKeyboardMarkup(row_width=1) test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question5") keyboard.add(test_button) # Отправляем ссылку на статью bot.send_message(chat_id, "https://telegra.ph/FILOSOFSKIE-PROBLEMY-INFORMATIKI-04-13", reply_markup=keyboard) bot.delete_message(chat_id, call.message.message_id) elif topic == "topic6": keyboard = types.InlineKeyboardMarkup(row_width=1) test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question6") keyboard.add(test_button) # Отправляем ссылку на статью bot.send_message(chat_id, "https://telegra.ph/Isklyuchitelnost-ponyatiya-informacii-04-13", reply_markup=keyboard) bot.delete_message(chat_id, call.message.message_id) elif topic == "topic7": keyboard = types.InlineKeyboardMarkup(row_width=1) test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question7") keyboard.add(test_button) # Отправляем ссылку на статью bot.send_message(chat_id, "https://telegra.ph/Filosofskie-problemy-informatiki-i-informacionnyh-tehnologij-04-13", reply_markup=keyboard) bot.delete_message(chat_id, call.message.message_id) elif topic == "topic8": keyboard = types.InlineKeyboardMarkup(row_width=1) test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question8") keyboard.add(test_button) # Отправляем ссылку на статью bot.send_message(chat_id, "https://telegra.ph/Filosofskie-problemy-informatiki-i-informacionnyh-tehnologij-04-13", reply_markup=keyboard) bot.delete_message(chat_id, call.message.message_id) elif topic in questions: conn = sqlite3.connect('users.db') cursor = conn.cursor() cursor.execute(f"SELECT {topic} FROM topics WHERE chat_id={call.message.chat.id}") result = cursor.fetchone() if result is not None: if result[0] == 0: # Проверяем, что first_flag равен 0 cursor.execute(f"UPDATE topics SET {topic} = 1 WHERE chat_id={call.message.chat.id}") conn.commit() question_data = questions[topic] question = question_data["question"] options = question_data["options"] correct = question_data["correct_option_id"] poll = bot.send_poll(call.message.chat.id, question, options, is_anonymous=False, type='quiz', open_period=30, correct_option_id=correct) else: bot.send_message(chat_id, "Жулик! Проходить тест можно только один раз!") else: bot.send_message(chat_id, "Вас нет в базе данных!") conn.close() # Обработка ответов на опросы @bot.poll_answer_handler(func=lambda poll_answer: True) def handle_poll_answer(poll_answer): chosen_option_id = poll_answer.option_ids # Проверяем, совпадает ли выбранный вариант с правильным if chosen_option_id[0] == 2: result_message = "Правильно! 🎉" right_answer(poll_answer.user.id) else: result_message = "Неправильно 😞" # Отправляем сообщение с результатом bot.send_message(poll_answer.user.id, result_message) def right_answer(user_id): conn = sqlite3.connect('users.db') cursor = conn.cursor() cursor.execute("UPDATE users SET count = count + 1 WHERE user_id=?", (user_id,)) conn.commit() conn.close() # Создаем таблицу пользователей в базе данных def create_table(): conn = sqlite3.connect('users.db') cursor = conn.cursor() cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, username VARCHAR, user_id VARCHAR, chat_id VARCHAR, count INTEGER)''') conn.commit() conn.close() def create_falg_table(): conn = sqlite3.connect('users.db') cursor = conn.cursor() cursor.execute('''CREATE TABLE IF NOT EXISTS topics ( id INTEGER PRIMARY KEY, chat_id VARCHAR, question1 INTEGER, question2 INTEGER, question3 INTEGER, question4 INTEGER, question5 INTEGER, question6 INTEGER, question7 INTEGER, question8 INTEGER )''') conn.commit() conn.close() # Вызываем функцию для создания таблицы пользователей create_table() create_falg_table() # Запускаем бота bot.polling()