Сообщество IT-специалистов
Ответы на любые вопросы об IT
Профессиональное развитие в IT
Удаленная работа для IT-специалистов
from aiogram import types, executor, Dispatcher, Bot from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, callback_query, ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove import yaml from time import sleep import sqlite3 as sql class Config(): def createConfig(self): pattern = """# Токен бота телеграмм token: <токен> # Настройка сообщений меню # Главное меню main_menu: | Добрый день! Я бот компании "TourVisor". Если вы собрались в путешествие, то я всегда к вашим услугам! Чего желаете? # Меню "Консультация эксперта" contacts_menu: | У нас есть замечательные менеджеры, которые всегда готовы прийти на помощь! Напишите нам Whatsapp <номер_телефона> и мы поможем подобрать для вас идеальный тур' """ with open("config.yaml", 'w', encoding="utf-8") as file: file.write(pattern) def getConfig(self): try: with open("config.yaml", "r", encoding="utf-8") as file: config = yaml.safe_load(file) return config except: print("Конфигурационный файл не найден.") self.createConfig() print("Конфигурационный файл создан в папке с программой.") print("Для продолжения работы настройте конфиг и перезапустите программу.") sleep(99999) class Menu(): citys=[ {'name': 'Актау', 'num': 74}, {'name': 'Актобе', 'num': 73}, {'name': 'Алматы', 'num': 60}, {'name': 'Атырау', 'num': 75}, {'name': 'Костанай', 'num': 68}, {'name': 'Кызылорда', 'num': 77}, {'name': 'Нур-Султан', 'num': 59}, {'name': 'Павлодар', 'num': 66}, {'name': 'Семей', 'num': 121}, {'name': 'Туркестан', 'num': 120}, {'name': 'Уральск', 'num': 84}, {'name': 'Усть-Каменогорск', 'num': 78}, {'name': 'Шымкент', 'num': 79} ] def getMainMenu(self): menu = InlineKeyboardMarkup() btn_1 = InlineKeyboardButton(" Найти тур", callback_data="find_tour") btn_2 = InlineKeyboardButton(" Консультация эксперта", callback_data="contacts") menu.add(btn_1) menu.add(btn_2) return menu def getSelectCityMenu(self): menu = InlineKeyboardMarkup() for city in self.citys: btn = InlineKeyboardButton(city['name'], callback_data=f"city_{city['num']}") menu.add(btn) return menu def getBackMenu(self): menu = ReplyKeyboardMarkup( keyboard=[[KeyboardButton(text="⬅️ Главное меню")]], resize_keyboard=True ) return menu def getSelectCountryMenu(countrys): menu = InlineKeyboardMarkup() for country in countrys: btn = InlineKeyboardButton(country['name'], callback_data=f"country_{country['num']}") menu.add(btn) return menu config = Config().getConfig() token = config['token'] bot = Bot(token=token) dp = Dispatcher(bot) main_menu = Menu().getMainMenu() select_city_menu = Menu().getSelectCityMenu() back_menu = Menu().getBackMenu() conn = sql.connect("users.db") cur = conn.cursor() cur.execute("""CREATE TABLE IF NOT EXISTS users( id INT PRIMARY KEY, city INT, country INT )""") @dp.message_handler(commands=['start']) async def begin(message: types.Message): await bot.send_sticker(message.chat.id, 'CAACAgIAAxkBAAMKYhs_EZ_YPorfkCFhMfdU2Cavk3YAAlQAA0G1Vgxqt_jHCI0B-iME') await bot.send_message(message.chat.id, config['main_menu'], reply_markup=Menu().getMainMenu()) @dp.message_handler(text="⬅️ Главное меню") async def text(message: types.Message): await bot.send_sticker(message.chat.id, 'CAACAgIAAxkBAAMKYhs_EZ_YPorfkCFhMfdU2Cavk3YAAlQAA0G1Vgxqt_jHCI0B-iME', reply_markup=ReplyKeyboardRemove()) await bot.send_message(message.chat.id, config['main_menu'], reply_markup=main_menu) @dp.callback_query_handler(lambda c: c.data == "find_tour") async def btn_reaction(call: types.callback_query): await bot.answer_callback_query(call.id) await bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=call.message.text, reply_markup=None) await bot.send_message(call.message.chat.id, "Я постараюсь подобрать для вас идеальный тур!") await bot.send_message(call.message.chat.id, "Из какого города вылетаем?", reply_markup=select_city_menu) @dp.callback_query_handler(lambda c: c.data == "contacts") async def btn_reaction(call: types.callback_query): await bot.answer_callback_query(call.id) await bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=call.message.text, reply_markup=None) await bot.send_message(call.message.chat.id, config['contacts_menu'], reply_markup=back_menu) @dp.callback_query_handler(lambda c: c.data[:4] == "city") async def btn_reaction(call: types.callback_query): await bot.answer_callback_query(call.id) await bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=call.message.text, reply_markup=None) num = call.data.split('_')[1] cur.execute(f"""INSERT INTO users(id, city) VALUES({call.message.chat.id}, {num}); """) conn.commit() for city in Menu().citys: if city['num'] == num: name = city['name'] await bot.send_message(call.message.chat.id, f"✈️Вылет будет из города {name}") await bot.send_message(call.message.chat.id, "Выберите страну", reply_markup=Menu().getSelectCountryMenu(countrys) @dp.callback_query_handler(lambda c: c.data[:7] == "country") async def btn_reaction(call: types.callback_query): await bot.answer_callback_query(call.id) await bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=call.message.text, reply_markup=None) num = call.data.split('_')[1] cur.execute(f"""INSERT INTO users(id, city) VALUES({call.message.chat.id}, {num}); """) conn.commit() executor.start_polling(dp, skip_updates=True)
В 143 строке условие