def days_in_calendar(message, quantity_days): days = ['0' + str(x) if x in [1, 2, 3, 4, 5, 6, 7, 8, 9] else str(x) for x in range(1, quantity_days + 1)] inline_button_choice_day = [types.InlineKeyboardButton(text=f'{day}', callback_data=f'{day}') for day in days] inline_markup_choice_day = types.InlineKeyboardMarkup().add(*inline_button_choice_day) bot.send_message(chat_id=message.from_user.id, text='Выберите интересующий вас день', reply_markup=inline_markup_choice_day)
def months_in_calendar(message): months = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'] inline_button_choice_month = [types.InlineKeyboardButton(text=f'{month}', callback_data=f'{month}') for month in months] inline_markup_choice_month = types.InlineKeyboardMarkup().add(*inline_button_choice_month) bot.send_message(chat_id=message.from_user.id, text='Выберите интересующий вас месяц', reply_markup=inline_markup_choice_month)
def select_name_your_city(message, char): letter = str(char).upper() cities = search_file_with_cites(letter=letter) inline_button_choice_city = [types.InlineKeyboardButton(text=f'{city}', callback_data=f'{city}') for city in cities] inline_markup_choice_city = types.InlineKeyboardMarkup().add(*inline_button_choice_city) bot.send_message(chat_id=message.from_user.id, text='Выберите ваш город.', reply_markup=inline_markup_choice_city)
def difference_events(message): inline_button_concert = types.InlineKeyboardButton(text='Концерты', callback_data='Концерты') inline_button_cinema = types.InlineKeyboardButton(text='Кино', callback_data='Кино') inline_button_performance = types.InlineKeyboardButton(text='Театр', callback_data='Театр') inline_button_exhibition = types.InlineKeyboardButton(text='Выставки', callback_data='Выставки') inline_markup_choice_event = types.InlineKeyboardMarkup().add(inline_button_concert, inline_button_cinema, inline_button_performance, inline_button_exhibition) bot.send_message(chat_id=message.from_user.id, text='Выберите интересующее вас мероприятие', reply_markup=inline_markup_choice_event)
def start_chat(message): keyboard_start_msg = types.ReplyKeyboardMarkup(True, True) keyboard_start_msg.row('Авторизоваться', 'Зарегистрироваться', 'Выйти из аккаунта') text = 'Бот предоставляет информации о событиях в вашем городе. Чтобы ее получить, напишите слово "афиша".\n\n' \ 'Для продолжения взаимодействий с ботом необходимо зарегистрироваться и авторизоваться.\n\n' \ 'Если вы уже зарегистрированы, необходимо только авторизоваться.' bot.send_message(chat_id=message.from_user.id, text=text, reply_markup=keyboard_start_msg)
def select_letter_your_city(message): alphabet = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЧШЩЭЮЯ' inline_button_enter_your_city = types.InlineKeyboardButton(text='Ввести свой город самостоятельно', callback_data='Ввести свой город самостоятельно') inline_button_choice_letter = [types.InlineKeyboardButton(text=f'{letter}', callback_data=f'{letter}') for letter in alphabet] inline_markup_choice_letter = types.InlineKeyboardMarkup().add(inline_button_enter_your_city, *inline_button_choice_letter) bot.send_message(chat_id=message.from_user.id, text='Нажмите на начальную букву вашего города.' \ '\nЕсли вашего города нет в списке, введите его самостоятельно.', reply_markup=inline_markup_choice_letter)
def select_event(message, city, date, concert=False, exhibition=False, performance=False, movie=False): if concert: url = f'https://www.afisha.ru/{city}/schedule_concert/{date}/' bot.send_message(chat_id=message.from_user.id, text='Идет поиск концертов...') search_class = '_3cJdx _2nJif like-container' search_events(message=message, url=url, search_class=search_class) elif exhibition: url = f'https://www.afisha.ru/{city}/schedule_exhibition/{date}/' bot.send_message(chat_id=message.from_user.id, text='Идет поиск выставок...') search_class = '_1ER_u _2nJif like-container' search_events(message=message, url=url, search_class=search_class) elif performance: url = f'https://www.afisha.ru/{city}/schedule_theatre/{date}/' bot.send_message(chat_id=message.from_user.id, text='Идет поиск спектаклей...') search_class = 'jP8J- _2nJif like-container' search_events(message=message, url=url, search_class=search_class) elif movie: url = f'https://www.afisha.ru/{city}/schedule_cinema/{date}/' bot.send_message(chat_id=message.from_user.id, text='Идет поиск фильмов...') search_class = 'oIhSV _2nJif like-container' search_events(message=message, url=url, search_class=search_class)
def choice_city(callback): callback.message.from_user.id = callback.from_user.id alphabet = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЧШЩЭЮЯ' if callback.data == 'Ввести свой город самостоятельно': msg_entered_city = bot.send_message(chat_id=callback.message.chat.id, text='Введите ваш город') bot.register_next_step_handler(msg_entered_city, writing_entered_city) for char in alphabet: if callback.data == char: select_name_your_city(message=callback.message, char=char) for city in [city for city in look_all_cities()]: if callback.data == city: writing_selected_city(message=callback.message, city=callback.data) if callback.data in ['Январь', 'Март', 'Май', 'Июль', 'Август', 'Октябрь', 'Декабрь']: month = declension_month(month=callback.data) Data[callback.from_user.id].append(month) days_in_calendar(message=callback.message, quantity_days=31) elif callback.data in ['Апрель', 'Июнь', 'Сентябрь', 'Ноябрь']: month = declension_month(month=callback.data) Data[callback.from_user.id].append(month) days_in_calendar(message=callback.message, quantity_days=30) elif callback.data == 'Февраль': month = declension_month(month=callback.data) Data[callback.from_user.id].append(month) days_in_calendar(message=callback.message, quantity_days=28) if callback.data in ['0' + str(x) if x in [1, 2, 3, 4, 5, 6, 7, 8, 9] else str(x) for x in range(1, 31 + 1)]: day = callback.data Data[callback.from_user.id].append(day) difference_events(callback.message) if callback.data == 'Концерты': if callback.from_user.id in Data: select_event(message=callback.message, city=Data[callback.from_user.id][0], date=f'{Data[callback.from_user.id][2]}-{Data[callback.from_user.id][1]}', concert=True) elif callback.data == 'Театр': if callback.from_user.id in Data: select_event(message=callback.message, city=Data[callback.from_user.id][0], date=f'{Data[callback.from_user.id][2]}-{Data[callback.from_user.id][1]}', performance=True) elif callback.data == 'Выставки': if callback.from_user.id in Data: select_event(message=callback.message, city=Data[callback.from_user.id][0], date=f'{Data[callback.from_user.id][2]}-{Data[callback.from_user.id][1]}', exhibition=True) elif callback.data == 'Кино': if callback.from_user.id in Data: select_event(message=callback.message, city=Data[callback.from_user.id][0], date=f'{Data[callback.from_user.id][2]}-{Data[callback.from_user.id][1]}', movie=True)
def authorization_email(message): bot.send_message(chat_id=message.from_user.id, text='Проверка адреса почты.') email = message.text logging.basicConfig( format= u'%(filename)s [LINE:%(lineno)d] #%(levelname)-8s [%(asctime)s] %(message)s', level=logging.INFO) logging.info(msg=f'Authorization email: {email}\n') if check_valid_email(email): Email.email = email msg_password = bot.send_message(chat_id=message.from_user.id, text='Введите пароль для авторизации.') bot.register_next_step_handler(msg_password, authorization_email_password) else: bot.send_message(chat_id=message.from_user.id, text='Вы ввели некорректный адрес почты.')
def registration(message): bot.send_message(chat_id=message.from_user.id, text='Проверка адреса почты') email = message.text logging.basicConfig( format= u'%(filename)s [LINE:%(lineno)d] #%(levelname)-8s [%(asctime)s] %(message)s', level=logging.INFO) logging.info(msg=f'Registration email: {email}\n') if check_valid_email(email): password = create_password() insert_user_in_db(user_id=message.from_user.id, first_name=message.chat.first_name, last_name=message.chat.last_name, email=email, password=password) send_password_to_email(email=email, password=password) bot.send_message( chat_id=message.from_user.id, text= """Перейдите на ранее введенную вами почту.\nВам было прислано сообщение в котором содержится ваш пароль от аккаунта и ссылка для подтверждения вашей почты.\nБез подтверждения почты аккаунт не активен.\nЕсли вы не нашли сообщение, посмотрите в спаме.""" ) else: bot.send_message(chat_id=message.from_user.id, text='Вы ввели некорректный адрес почты.')
def search_events(message, url, search_class): try: list_events = [] response = requests.get(url=url) events = BeautifulSoup(response.content, 'html.parser').find( 'div', class_='content content_view_cards') for event in events.find_all('section', {'class': search_class}): for genre in event.find_all('a', {'class': 'WR4gB'}): ... for name in event.find_all('h3', {'class': 'heHLK'}): ... for time in event.find_all('div', {'class': '_1Jo7v'}): ... description = [ div for div in event.select('div') if not div.has_attr('class') ] description_for_all_events = '' if description == [] else description[ 0].get_text() genre_for_all_events = '' if genre == [] else genre.get_text() name_for_all_events = '' if name == [] else name.get_text() if search_class != 'oIhSV _2nJif like-container': time_for_all_events = '' if time == [] else time.get_text() list_events.append( (genre_for_all_events, name_for_all_events, time_for_all_events, description_for_all_events)) else: list_events.append((genre_for_all_events, name_for_all_events, description_for_all_events)) if search_class == 'oIhSV _2nJif like-container': sort_events = sorted(set(list_events), key=lambda x: x[0]) for events in sort_events: bot.send_message( chat_id=message.from_user.id, text= f'жанр - {events[0]}\nназвание - {events[1]}\nописание - {events[2]}' ) else: sort_events = sorted(set(list_events), key=lambda x: x[2][-6:-1]) for events in sort_events: bot.send_message( chat_id=message.from_user.id, text=f'жанр - {events[0]}\nназвание - {events[1]}\n' f'место и дата - {events[2]}\nописание - {events[3]}') except AttributeError: bot.send_message(chat_id=message.chat.id, text='Ничего не найдено.')
def authorization(message): if select_user_from_db(user_id=message.from_user.id, email=Email.email, password=Password.password): if not check_email_authorization(user_id=message.from_user.id): bot.send_message( chat_id=message.from_user.id, text= 'Вы не можете пользоваться ботом пока не подтвердите свою почту.' ) return bot.send_message( chat_id=message.from_user.id, text='Авторизация прошла успешно. Доступ к боту открыт.') update_user_authorization(user_id=message.from_user.id) else: bot.send_message(chat_id=message.from_user.id, text='Ошибка при авторизации. Попробуйте еще раз.')
def auth_reg(message): if message.text == 'Авторизоваться': if check_user_authorization(user_id=message.from_user.id): bot.send_message(chat_id=message.from_user.id, text='Вы уже авторизованы.') return msg_password = bot.send_message( message.from_user.id, 'Введите почту для авторизации.\nПример почты: [email protected]') bot.register_next_step_handler(msg_password, authorization_email) elif message.text == 'Зарегистрироваться': if check_registration_user(user_id=message.from_user.id): bot.send_message(chat_id=message.from_user.id, text='Вы уже зарегистрированы.') return msg = bot.send_message( message.from_user.id, 'Введите почту для регистрации.\nПример почты: [email protected]') bot.register_next_step_handler(msg, registration) elif message.text == 'Выйти из аккаунта': exit_user_from_account(user_id=message.from_user.id) bot.send_message(message.from_user.id, 'Вы вышли из аккаунта.') elif not check_user_authorization(user_id=message.from_user.id): bot.send_message(chat_id=message.from_user.id, text='Вы не авторизованы. Доступ к боту закрыт.') elif message.text.lower() == 'афиша': select_letter_your_city(message) else: bot.send_message(chat_id=message.from_user.id, text='Введите слово "афиша", чтобы продолжить.')