def test_api_reuest(self):
     q1 = "Москва"
     params = dict(q=q1, country_id=1)
     result = vkapi.api_reuest(self.vk_api, "database.getCities", **params)
     self.assertIsInstance(result, dict)
     self.assertEqual(result.get("count"), len(result.get("items")))
     for city in result.get("items"):
         self.assertGreaterEqual(city.get("title").lower().find(q1.lower()), 0)
Пример #2
0
def update_param_target_users(target_user: TargetUser, vk_api):
    if target_user.sex not in (1, 2):  # пол
        sex_exist = None
        while not sex_exist:
            sex = input(
                "Выберете ваш пол: мужской введите - м, женский введите - ж: "
            ).lower()
            sex_dict = {"m": 2, "м": 2, "ж": 1}
            if sex_dict.get(sex):
                target_user.sex = sex_dict.get(sex)
                sex_exist = True

    if not target_user.city:  # город
        while not target_user.city:
            params_city = dict(q=input("Введите наименование вашего города: "),
                               country_id=1)
            city_list = api_reuest(vk_api, "database.getCities", **params_city)
            if city_list:
                if city_list.get("count") > 0:
                    city_list_find = city_list.get("items")
                    print("0-Ввести другой город")
                    for number, city in enumerate(city_list_find, 1):
                        city_string = f'{number}-{city.get("title")}'
                        if city.get("area"):
                            city_string += f', {city.get("area")}'
                        if city.get("region"):
                            city_string += f', {city.get("region")}'
                        print(city_string)
                    city_number = (posintput(
                        "Введите номер вашего города: ",
                        0,
                        len(city_list.get("items"), ),
                    ) - 1)
                    if city_number >= 0:
                        target_user.city = city_list_find[city_number].get(
                            "id")
                else:
                    print("Не найдено подходящих городов, попробуйте снова")
            else:
                print("Поиск города не удался - попробуйте снова")

    if (not target_user.age) or (target_user.age > 150):  # возраст
        target_user.age = posintput("Введите свой возраст: ", 10, 150)

    if not target_user.activities:
        while not target_user.activities:
            target_user.activities = list_from_string(
                input("Введите через запятую вашу деятельность: "))

    if not target_user.interests:
        while not target_user.interests:
            target_user.interests = list_from_string(
                input("Введите через запятую ваши интересы: "))

    if not target_user.movies:
        while not target_user.movies:
            target_user.movies = list_from_string(
                input("Введите через запятую ваши любимые фильмы: "))

    if not target_user.music:
        while not target_user.music:
            target_user.music = list_from_string(
                input("Введите через запятую вашу любимую музыку: "))

    if not target_user.books:
        while not target_user.books:
            target_user.books = list_from_string(
                input("Введите через запятую ваши любимые книги: "))

    if not target_user.quotes:
        while not target_user.quotes:
            target_user.quotes = list_from_string(
                input("Введите через запятую ваши любимые цитаты: "))

    if not target_user.about:
        while not target_user.about:
            target_user.about = list_from_string(
                input("Расскажите немного о себе, кратко через запятую: "))

    if not target_user.home_town:
        while not target_user.home_town:
            target_user.home_town = list_from_string(
                input(
                    "Введите свои любимые или родные города через запятую: "))

    return True
Пример #3
0
def search_users_of_parametr(connection, vk_api, search_p, current_target_user):
    all_users_id_search = []
    count_all_iteration = len(search_p.status) * (
        search_p.age_to - search_p.age_from + 1
    )
    print("Поиск подходящих пользователей")
    status_bar_find = StatusBar(count_all_iteration)
    for current_status in search_p.status:
        count_errors = 0
        for current_age in range(search_p.age_from, search_p.age_to + 1):
            status_bar_find.plus(1)
            dict_search = dict(
                q=search_p.q,
                city=search_p.city,
                age_from=current_age,
                age_to=current_age,
                count=search_p.count,
                sex=search_p.sex,
                has_photo=search_p.has_photo,
                status=current_status,
                sort=random.choice((0, 1)),
                fields=[
                    "bdate",
                    "relation",
                    "city",
                    "common_count",
                    "sex",
                    "activities",
                    "interests",
                    "music",
                    "movies",
                    "books",
                    "quotes",
                    "about",
                    "home_town",
                ],
            )
            users_search = api_reuest(vk_api, "users.search", **dict_search)
            # счетчик ошибок, если на одном пользователе нет ответа, то выходим из цикла досрочно
            if not users_search:
                count_errors += 1
                if count_errors == 10:
                    break
                continue

            with connection:
                for user in users_search.get("items"):
                    # print(user)
                    try:
                        user_current_search = insert_update_user_vk(
                            connection,
                            "users_vk",
                            user.get("id"),
                            first_name=user.get("first_name"),
                            last_name=user.get("last_name"),
                            age=current_age,
                            city=search_p.city,
                            sex=user.get("sex"),
                            relation=current_status,
                            activities=list_from_string(user.get("activities")),
                            interests=list_from_string(user.get("interests")),
                            movies=list_from_string(user.get("movies")),
                            music=list_from_string(user.get("music")),
                            books=list_from_string(user.get("books")),
                            quotes=list_from_string(user.get("quotes")),
                            about=list_from_string(user.get("about")),
                            home_town=list_from_string(user.get("home_town")),
                        )
                        user_id_bd = user_current_search[0]
                        # print('user', user_current_search)
                        all_users_id_search.append(user_id_bd)
                        # if user_current_search[7]:
                        #     common_activities = set(current_target_user.activities) & set(user_current_search[7])
                        #     print(f'common_activities:{common_activities}')
                        common_activities = calc_common_param(
                            current_target_user.activities, user_current_search[7]
                        )
                        common_interests = calc_common_param(
                            current_target_user.interests, user_current_search[8]
                        )
                        common_movies = calc_common_param(
                            current_target_user.movies, user_current_search[9]
                        )
                        common_music = calc_common_param(
                            current_target_user.music, user_current_search[10]
                        )
                        common_books = calc_common_param(
                            current_target_user.books, user_current_search[11]
                        )
                        common_quotes = calc_common_param(
                            current_target_user.quotes, user_current_search[12]
                        )
                        common_about = calc_common_param(
                            current_target_user.about, user_current_search[13]
                        )
                        common_home_town = calc_common_param(
                            current_target_user.home_town, user_current_search[14]
                        )

                        points_relation = calc_points(current_status, {1: 5, 6: 15})
                        points_age = calc_points(
                            int(math.fabs(current_target_user.age - current_age)),
                            {0: 20, 1: 17, 2: 15, 3: 12, 4: 10, 5: 5},
                        )
                        points_activities = calc_points(
                            common_activities, {1: 10, 2: 20, 3: 30}
                        )
                        points_interests = calc_points(
                            common_interests, {1: 10, 2: 20, 3: 30}
                        )
                        points_movies = calc_points(
                            common_movies, {1: 10, 2: 13, 3: 15}
                        )
                        points_music = calc_points(common_music, {1: 20, 2: 25, 3: 30})
                        points_books = calc_points(common_books, {1: 10, 2: 15, 3: 20})
                        points_quotes = calc_points(
                            common_quotes, {1: 10, 2: 20, 3: 30}
                        )
                        points_about = calc_points(common_about, {1: 10, 2: 20, 3: 30})
                        points_home_town = calc_points(
                            common_home_town, {1: 20, 2: 25, 3: 30}
                        )
                        points_common_friends = calc_points(
                            user.get("common_count"), {1: 30, 2: 35, 3: 40}
                        )

                        points_auto = (
                            points_age
                            + points_relation
                            + points_activities
                            + points_interests
                            + points_movies
                            + points_music
                            + points_books
                            + points_quotes
                            + points_about
                            + points_home_town
                            + points_common_friends
                        )

                        insert_update_grade_users(
                            connection,
                            current_target_user.user_bd_id,
                            user_id_bd,
                            points_auto=points_auto,
                            num_common_friends=user.get("common_count"),
                        )

                    except TypeError as e:
                        print(f"Ошика типов: {e}")
    if all_users_id_search:
        return all_users_id_search
Пример #4
0
def search_users_of_parametr(vk_api,
                             search_p,
                             current_target_user,
                             likely_users_export=[]):
    likely_users = list()
    count_all_iteration = len(
        search_p.status) * (search_p.age_to - search_p.age_from + 1)
    print("Поиск подходящих пользователей")
    status_bar_find = StatusBar(count_all_iteration)

    for current_status in search_p.status:
        count_errors = 0
        for current_age in range(search_p.age_from, search_p.age_to + 1):
            status_bar_find.plus(1)
            dict_search = dict(
                q=search_p.q,
                city=search_p.city,
                age_from=current_age,
                age_to=current_age,
                count=search_p.count,
                sex=search_p.sex,
                has_photo=search_p.has_photo,
                status=current_status,
                sort=random.choice((0, 1)),
                fields=[
                    "bdate",
                    "relation",
                    "city",
                    "common_count",
                    "sex",
                    "activities",
                    "interests",
                    "music",
                    "movies",
                    "books",
                    "quotes",
                    "about",
                    "home_town",
                ],
            )
            users_search = api_reuest(vk_api, "users.search", **dict_search)
            # счетчик ошибок, если на одном пользователе нет ответа, то выходим из цикла досрочно
            if not users_search:
                count_errors += 1
                if count_errors == 10:
                    break
                continue

            for user in users_search.get("items"):
                if user.get("id") not in likely_users_export:
                    try:
                        current_likely_user = LikelyUser(
                            user.get("id"),
                            relation=current_status,
                            common_friends=user.get("common_count"),
                            common_groups=-1,
                            first_name=user.get("first_name"),
                            last_name=user.get("last_name"),
                            age=current_age,
                            city=search_p.city,
                            sex=user.get("sex"),
                            activities=list_from_string(
                                user.get("activities")),
                            interests=list_from_string(user.get("interests")),
                            movies=list_from_string(user.get("movies")),
                            music=list_from_string(user.get("music")),
                            books=list_from_string(user.get("books")),
                            quotes=list_from_string(user.get("quotes")),
                            about=list_from_string(user.get("about")),
                            home_town=list_from_string(user.get("home_town")),
                        )
                        current_likely_user.calculate_points_auto(
                            current_target_user)
                        likely_users.append(current_likely_user)

                    except TypeError as e:
                        print(f"Ошибка типов: {e}")
    if likely_users:
        return likely_users
Пример #5
0
def set_current_target_user(connection, vk_api) -> VKUser:
    # записываем все данные пользователя с ВК
    user_target_dict = None
    try:
        user_target_dict = vk_api.users.get(
            fields=[
                "city",
                "bdate",
                "sex",
                "relation",
                "status",
                "activities",
                "interests",
                "music",
                "movies",
                "personal",
                "relation",
                "common_count",
                "has_photo",
                "books",
                "quotes",
                "about",
                "home_town",
            ]
        )[0]
    except requests.exceptions.HTTPError as e:
        print(f"Не удалось получить данные пользователя: {e}")
    if user_target_dict:
        with connection:
            parametrs_user_dict = dict(
                first_name=user_target_dict.get("first_name"),
                last_name=user_target_dict.get("last_name"),
                age=(int(dt.now().year) - int(user_target_dict.get("bdate")[-4:])),
                sex=user_target_dict.get("sex"),
                city=user_target_dict.get("city").get("id")
                if user_target_dict.get("city")
                else None,
                activities=list_from_string(user_target_dict.get("activities")),
                interests=list_from_string(user_target_dict.get("interests")),
                movies=list_from_string(user_target_dict.get("movies")),
                music=list_from_string(user_target_dict.get("music")),
                books=list_from_string(user_target_dict.get("books")),
                quotes=list_from_string(user_target_dict.get("quotes")),
                about=list_from_string(user_target_dict.get("about")),
                home_town=list_from_string(user_target_dict.get("home_town")),
            )
            # фильтр пустых значений:
            param_for_delete_list = []
            for key, value in parametrs_user_dict.items():
                if value is None:
                    param_for_delete_list.append(key)
            for key in param_for_delete_list:
                parametrs_user_dict.pop(key)

            user_in_bd = list(
                insert_update_user_vk(
                    connection,
                    "target_users_vk",
                    user_target_dict.get("id"),
                    **parametrs_user_dict,
                )
            )

        if user_in_bd:
            params_for_update = dict()
            if user_in_bd[6] not in (1, 2):  # пол
                sex_exist = None
                while not sex_exist:
                    sex = input(
                        "Выберете ваш пол: мужской введите - м, женский введите - ж: "
                    ).lower()
                    sex_dict = {"m": 2, "м": 2, "ж": 1}
                    if sex_dict.get(sex):
                        user_in_bd[6] = sex_dict.get(sex)
                        params_for_update.update(sex=user_in_bd[6])
                        sex_exist = True

            if user_in_bd[7] is None:  # город
                while not user_in_bd[7]:
                    params_city = dict(
                        q=input("Введите наименование вашего города: "), country_id=1
                    )
                    city_list = api_reuest(vk_api, "database.getCities", **params_city)
                    if city_list:
                        if city_list.get("count") > 0:
                            city_list_find = city_list.get("items")
                            print("0-Ввести другой город")
                            for number, city in enumerate(city_list_find, 1):
                                city_string = f'{number}-{city.get("title")}'
                                if city.get("area"):
                                    city_string += f', {city.get("area")}'
                                if city.get("region"):
                                    city_string += f', {city.get("region")}'
                                print(city_string)
                            city_number = (
                                posintput(
                                    "Введите номер вашего города: ",
                                    0,
                                    len(city_list.get("items"),),
                                )
                                - 1
                            )
                            if city_number >= 0:
                                user_in_bd[7] = city_list_find[city_number].get("id")
                            params_for_update.update(city=user_in_bd[7])
                        else:
                            print("Не найдено подходящих городов, попробуйте снова")
                    else:
                        print("Поиск города не удался - попробуйте снова")

            if (user_in_bd[8] is None) or (user_in_bd[8] > 150):  # возраст
                user_in_bd[8] = posintput("Введите свой возраст: ", 10, 150)
                params_for_update.update(age=user_in_bd[8])

            if user_in_bd[9] is None:
                while not user_in_bd[9]:
                    user_in_bd[9] = list_from_string(
                        input("Введите через запятую вашу деятельность: ")
                    )
                    if user_in_bd[9]:
                        params_for_update.update(activities=user_in_bd[9])

            if user_in_bd[10] is None:
                while not user_in_bd[10]:
                    user_in_bd[10] = list_from_string(
                        input("Введите через запятую ваши интересы: ")
                    )
                    if user_in_bd[10]:
                        params_for_update.update(interests=user_in_bd[10])

            if user_in_bd[11] is None:
                while not user_in_bd[11]:
                    user_in_bd[11] = list_from_string(
                        input("Введите через запятую ваши любимые фильмы: ")
                    )
                    if user_in_bd[11]:
                        params_for_update.update(movies=user_in_bd[11])

            if user_in_bd[12] is None:
                while not user_in_bd[12]:
                    user_in_bd[12] = list_from_string(
                        input("Введите через запятую вашу любимую музыку: ")
                    )
                    if user_in_bd[12]:
                        params_for_update.update(music=user_in_bd[12])

            if user_in_bd[13] is None:
                while not user_in_bd[13]:
                    user_in_bd[13] = list_from_string(
                        input("Введите через запятую ваши любимые книги: ")
                    )
                    if user_in_bd[13]:
                        params_for_update.update(books=user_in_bd[13])

            if user_in_bd[14] is None:
                while not user_in_bd[14]:
                    user_in_bd[14] = list_from_string(
                        input("Введите через запятую ваши любимые цитаты: ")
                    )
                    if user_in_bd[14]:
                        params_for_update.update(quotes=user_in_bd[14])

            if user_in_bd[15] is None:
                while not user_in_bd[15]:
                    user_in_bd[15] = list_from_string(
                        input("Расскажите немного о себе, кратко через запятую: ")
                    )
                    if user_in_bd[15]:
                        params_for_update.update(about=user_in_bd[15])

            if user_in_bd[16] is None:
                while not user_in_bd[16]:
                    user_in_bd[16] = list_from_string(
                        input("Введите свои любимые или родные города через запятую: ")
                    )
                    if user_in_bd[16]:
                        params_for_update.update(home_town=user_in_bd[16])

            # Записываем то что дозаполнили вручную
            if len(params_for_update) > 0:
                with connection:
                    insert_update_user_vk(
                        connection,
                        "target_users_vk",
                        user_in_bd[1],
                        **params_for_update,
                    )

            return VKUser(
                user_in_bd[1],
                user_in_bd[0],
                user_in_bd[4],
                user_in_bd[5],
                user_in_bd[6],
                user_in_bd[7],
                user_in_bd[8],
                user_in_bd[9],
                user_in_bd[10],
                user_in_bd[11],
                user_in_bd[12],
                user_in_bd[13],
                user_in_bd[14],
                user_in_bd[15],
                user_in_bd[16],
            )