def mailing(): while (1): t1 = time.time() conn = psycopg2.connect(dbname='vkBotDataBase', user='******', password='******', host='localhost') cursor = conn.cursor() cursor.execute("SELECT * FROM students WHERE time='" + time.strftime("%H.%M", time.localtime()) + "'") result = cursor.fetchall() if result != []: bot = VkBot(result[0][0], conn) message = '' now = datetime.now() next_day = calendar.weekday(now.year, now.month, now.day) + 1 cursor.execute("SELECT * FROM day WHERE id=" + str(result[0][0] * 10 + next_day)) result = cursor.fetchall() print(result) if result != []: message += "Расписание на завтра: \n" for i in result: message += i[1] + ' ' + i[0] + '\n' bot.send_message(message=message) conn.close() t2 = time.time() t = t2 - t1 time.sleep(60 - t)
class VK: def __init__(self, data): log = logging.getLogger('bot') log_level = getattr(logging, data['log'].upper(), 50) log.setLevel(log_level) fmt = logging.Formatter('[%(asctime)s] %(levelname)s: %(name)s: %(message)s') fh = logging.FileHandler('bot.log', 'w') fh.setFormatter(fmt) log.addHandler(fh) ch = logging.StreamHandler() ch.setFormatter(fmt) ch.setLevel(logging.WARNING) log.addHandler(ch) self.group_id = data['group_id'] self.log = log self.log.info('Initializing VkBot class...') self.bot = VkBot(data['user_token'], data['group_token'], data['group_id']) self.log.info('Running!') def make_post(self): try: self.log.info("Making a post...") stats = api.get_stats() local, world = stats['today'] local_yesterday, global_yesterday = stats['yesterday'] self.log.info('Got stats for post') message = Message('Пишите в лс боту, чтобы получить последнюю статистику!\n', 'post') message.append(api.arrange_message(local, local_yesterday, 'в России')) message.append(api.arrange_message(world, global_yesterday, 'в мире')) self.log.info('Calling bot.wall_post()') self.bot.wall_post(message.get()) except: self.log.exception('') def messages_hander(self): messages = { 'ru': ['рф', "ру", "россия", 'ru', 'russia'], 'world': ['мир', "в мире", 'world', 'worldwide'], 'all': ['коронавирус', "covid", "все", "статистика"], 'start': ['начать', "помощь"] } def send_message(event): try: self.log.info('Got event with type %s', event.type) msg = re.sub(fr'\[{self.group_id}|.*\](,|) ', '', event.message['text'].lower()) msg = msg.encode('cp1251', 'ignore').decode('cp1251').strip(' ') peer_id = event.message.peer_id self.log.info('Event message is "%s", peer id is %s', msg, peer_id) out_msg = Message('', 'info') stats = api.get_stats()['today'] stats_yesterday = api.get_stats()['yesterday'] if msg in messages['ru'] or msg in messages['all']: self.log.info('Getting local stats for message...') self.log.info('Got local stats!') out_msg.append(api.arrange_message(stats[0], stats_yesterday[0], 'в России')) if msg in messages['world'] or msg in messages['all']: self.log.info('Getting global stats for message...') self.log.info('Got global stats!') out_msg.append(api.arrange_message(stats[1], stats_yesterday[1], 'в мире')) if msg in messages['start'] or event.from_chat and msg == '': out_msg.set_type('start') # TODO статистика в разных странах out_msg.change(( 'Привет! Я бот - коронавирус. Я могу сообщать тебе последнюю статистику по коронавирусу.\n\n' 'Чтобы начать, просто напиши одну из трех комманд: \n' 'ру - Узнать статистику в России.\n' 'мир - Узнать о ситуации в мире.\n' 'все - Статистика России и мира в одном сообщении.\n' )) if out_msg.get() != '': self.bot.send_message(peer_id, out_msg) else: out_msg.change('Извини, но я тебя не понимаю. Напиши "помощь", чтобы получить список команд.') out_msg.set_type('empty') self.bot.send_message(peer_id, out_msg) except TypeError: self.log.warning('Got TypeError in messages_handler()') self.bot.send_message(peer_id, 'Произошла ошибка. Повторите попытку позднее.') except: self.log.exception('') raise while True: try: event = self.bot.get_event() send_message(event) except TypeError: self.log.warning('Got TypeError in messages_handler()') except: self.log.exception('') raise
def main(): vk = Vk(VK_TOKEN, '5.130') vk_bot = VkBot(VK_BOT_TOKEN) start_key = vk_bot.get_keyboard(start_button) continue_key = vk_bot.get_keyboard(continue_button) change_criteria_key = vk_bot.get_keyboard(change_criteria_button) database_users = crud.load_users() users = [] city_dict = {} criteria = {} long_poll = VkLongPoll(vk_bot.session) for event in long_poll.listen(): if event.type == VkEventType.MESSAGE_NEW: if event.to_me: request = event.text.lower() if request == "привет": flag = 0 for user_id in database_users: if user_id == event.user_id: criteria = crud.load_criteria(event.user_id) flag = 1 break if flag == 0: info = vk.get_user_info(event.user_id) user = User(event.user_id, vk.get_criteria(info)) users.append(user) crud.insert_user(user) user.count_to_load, target_users = vk.search_users( user.criteria, user.viewed_list, user.black_list) vk_bot.send_message( event.user_id, f"привет {user.first_name}, " f"нашел для тебя {user.count_to_load} пользователей\n " ) vk_bot.send_message(event.user_id, user.display_criteria()) vk_bot.send_message(event.user_id, "сделай выбор:", start_key) elif flag == 1: user = User(event.user_id, criteria) user.viewed_list = crud.load_viewed_list(event.user_id) user.loaded_list = user.viewed_list.copy() user.black_list = crud.load_black_list(event.user_id) user.favorite_list = crud.load_favorite_list( event.user_id) user.count_to_load, target_users = vk.search_users( user.criteria, [], user.black_list) user.count_loaded = len( user.viewed_list) if user.viewed_list else 0 users.append(user) if user.count_not_viewed( ) > 0 and user.count_loaded > 0: vk_bot.send_message( event.user_id, f"привет {user.first_name}, продолжим?\n" f"осталось {user.count_not_viewed()} пользователей\n" f"\n{user.display_criteria()}\n", continue_key) else: clear_current_search_data(user) vk_bot.send_message( event.user_id, f"привет {user.first_name}, искать снова?\n" f"нашел {user.count_to_load} пользователей\n" f"\n{user.display_criteria()}\n", start_key) else: for user in users: if request in ('начать поиск', 'продолжить поиск'): if user.id == event.user_id: count, target_users = vk.search_users( user.criteria, user.viewed_list, user.black_list) if request == 'начать поиск': user.count_to_load = count vk_bot.send_message( event.user_id, f"нашел {user.count_to_load} пользователей" ) else: vk_bot.send_message( event.user_id, f"осталось {count} пользователей") vk_bot.send_message(event.user_id, "загружаю...") for i, target_user in enumerate(target_users): photos = vk.get_photos(target_user) top_3_photos = vk.get_top_photos(photos, 3) attachments = vk_bot.get_attachments( top_3_photos) vk_bot.send_message( event.user_id, f"https://vk.com/id{str(target_user)}", None, attachments) user.viewed_list.append(target_user) if i == user.max_number - 1: break crud.insert_users_search(user) user.count_loaded = len(user.loaded_list) if user.count_not_viewed() > 0: vk_bot.send_message( event.user_id, f"осталось {user.count_not_viewed()} пользователей" f"\nсделай выбор:", continue_key) else: clear_current_search_data(user, 1) vk_bot.send_message( event.user_id, "сделай выбор:", start_key) elif request == 'изменить параметры': if user.id == event.user_id: vk_bot.send_message( event.user_id, f"{user.display_criteria()}\n" "сделай выбор:", change_criteria_key) elif request == 'пол': if user.id == event.user_id: user.change_sex() crud.update_sex(user) clear_current_search_data(user, 1) vk_bot.send_message( event.user_id, f"пол изменен\n" f"{user.display_criteria()}", start_key) count, target_users = vk.search_users( user.criteria, user.viewed_list, user.black_list) vk_bot.send_message( event.user_id, f"нашел {count} пользователей") elif request == 'возраст': if user.id == event.user_id: vk_bot.send_message( event.user_id, "введите возраст в формате '30-35'") elif re.match(re.compile(age_pattern), request): if user.id == event.user_id: age_from, age_to = re.match( re.compile(age_pattern), request).groups() user.change_age(age_from, age_to) crud.update_age(user) clear_current_search_data(user, 1) count, target_users = vk.search_users( user.criteria, user.viewed_list, user.black_list) vk_bot.send_message( event.user_id, f"возраст изменен\n{user.display_criteria()}", start_key) vk_bot.send_message( event.user_id, f"нашел {count} пользователей") elif request == 'город': if user.id == event.user_id: vk_bot.send_message( event.user_id, "введите город в формате 'г Москва'") elif re.match(re.compile(city_pattern), request): if user.id == event.user_id: city_query = re.match(re.compile(city_pattern), request).groups()[0] city_dict, city_key = vk.get_cities( city_query, user.criteria['country_id']) if len(city_key) > 0: city_key = vk_bot.get_keyboard( {'buttons': city_key}) vk_bot.send_message( event.user_id, "подтвердите выбор:", city_key) else: vk_bot.send_message( event.user_id, "город не найден", change_criteria_key) elif re.match(re.compile(id_city_pattern), request): if user.id == event.user_id: city_id = re.match(re.compile(id_city_pattern), request).groups()[0] user.change_city(city_id, city_dict[city_id]) crud.update_city(user) clear_current_search_data(user, 1) user.count_to_load, target_users = vk.search_users( user.criteria, user.viewed_list, user.black_list) vk_bot.send_message( event.user_id, f"город изменен\n{user.display_criteria()}", start_key) vk_bot.send_message( event.user_id, f"нашел {user.count_to_load} пользователей" ) elif request == 'статус': if user.id == event.user_id: vk_bot.send_message(event.user_id, user.STATUS_LABEL) elif re.match(re.compile(status_pattern), request): if user.id == event.user_id: status = int( re.match(re.compile(status_pattern), request).groups()[0]) user.change_status(status) crud.update_status(user) clear_current_search_data(user, 1) count, target_users = vk.search_users( user.criteria, user.viewed_list, user.black_list) vk_bot.send_message( event.user_id, f"статус изменен\n{user.display_criteria()}", start_key) vk_bot.send_message( event.user_id, f"нашел {count} пользователей") elif request == '+': if user.id == event.user_id: reply_message = vk_bot.get_reply_message( event.peer_id, event.user_id) if re.match(re.compile(id_reply_pattern), reply_message): favorite_user_id = int( re.match(re.compile(id_reply_pattern), reply_message).groups()[0]) if favorite_user_id not in user.favorite_list: crud.insert_favorite( user, favorite_user_id) user.favorite_list.append( favorite_user_id) vk_bot.send_message( event.user_id, f"пользователь добавлен в избранное", continue_key) else: vk_bot.send_message( event.user_id, 'пользователь уже в списке', continue_key) else: vk_bot.send_message( event.user_id, "чтобы добавить в избранное, отправь '+' " "\nв ответе на сообщение со ссылкой " "на пользователя") elif request == '-': if user.id == event.user_id: reply_message = vk_bot.get_reply_message( event.peer_id, event.user_id) if re.match(re.compile(id_reply_pattern), reply_message): black_list_user_id = int( re.match(re.compile(id_reply_pattern), reply_message).groups()[0]) if black_list_user_id not in user.black_list: crud.insert_black_user( user, black_list_user_id) user.black_list.append( black_list_user_id) user.clear_black_list_info( black_list_user_id) user.count_to_load, target_users = vk.search_users( user.criteria, [], user.black_list) vk_bot.send_message( event.user_id, f"пользователь добавлен в черный список", continue_key) else: vk_bot.send_message( event.user_id, 'пользователь уже в списке', continue_key) else: vk_bot.send_message( event.user_id, "чтобы добавить в черный список, отправь '-' " "\nв ответе на сообщение со ссылкой " "на пользователя") elif request == 'черный список': if user.id == event.user_id: if user.black_list: for black_user in user.black_list: vk_bot.send_message( event.user_id, f"https://vk.com/id{str(black_user)}" ) vk_bot.send_message( event.user_id, 'сделай выбор', continue_key) else: vk_bot.send_message( event.user_id, 'список пуст', continue_key) elif request == 'избранное': if user.id == event.user_id: if user.favorite_list: for favorite_user in user.favorite_list: vk_bot.send_message( event.user_id, f"https://vk.com/id{str(favorite_user)}" ) vk_bot.send_message( event.user_id, 'сделай выбор', continue_key) else: vk_bot.send_message( event.user_id, 'список пуст', continue_key) else: if user.id == event.user_id: vk_bot.send_message( event.user_id, "не понял вашего ответа...")