Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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, "не понял вашего ответа...")