예제 #1
0
def add_user_photos(curs, user):
    """

    (cursor link, object User) -> integer

    Function add user's photos to table of photos

    """
    if not hasattr(user, 'photos'):
        vk_common.dprint(2, vk_common.func_name(),
                         "Не определен атрибут photos.")
        return
    vk_common.dprint(2, vk_common.func_name(), "Входные данные user.photos: ",
                     user.photos)

    rec_ids = list()
    for number, photo in enumerate(user.photos, 1):
        item_id = photo[0]
        image_file_path = photo[1]

        sql_text = f"insert into {TABLES_NAMES[0]} (user_id, top_id, image_file_path, item_id) " \
                   f"values (%s, %s, %s, %s) returning id"
        curs.execute(sql_text, (user.uid, number, image_file_path, item_id))
        rec_id = curs.fetchone()[0]
        rec_ids.append(rec_id)
    return rec_ids
예제 #2
0
def drop_db():
    """

    (cursor link) -> None

    Function drops all tables

    """

    is_drop = 0
    is_exist = 0
    for table_idx in (0, 4, 3, 2, 1):
        result = is_exists_table(TABLES_NAMES[table_idx])
        if result:
            is_exist += 1
        rows, err = drop_table(TABLES_NAMES[table_idx])
        if err == 0:
            is_drop += 1
    vk_common.dprint(2, vk_common.func_name(),
                     f"Существовали {is_exist} таблиц.")
    vk_common.dprint(2, vk_common.func_name(), f"Удалили {is_drop} таблиц.")

    if is_drop != is_exist:
        return -1
    else:
        return is_drop
예제 #3
0
def get_user_by_id(id_string):
    """

    (string) -> (User or None, string, int)

    Function gets object User by users's id string from VK

    """

    vk_common.dprint(2, vk_common.func_name(),
                     f"Входные данные: id_string = {id_string}")
    try:
        int(id_string)
        id_string = f"id{id_string}"
    except ValueError as error:
        vk_common.dprint(2, vk_common.func_name(), error)

    if vk_common.test_id(id_string):
        user = vk_user.User()
        user.assign_by_nickname(id_string)
        if user.error["error"] != 0:
            if user.error["error"] == 113:
                print(
                    f"Аккаунт ВК с id = \"{id_string}\" не определен в системе."
                )
            else:
                print(
                    f"Возникла ошибка {user.error['error']}: {user.error['msg']}."
                )
            return None, user.error['msg'], user.error["error"]
        else:
            return user, "", 0
    else:
        print("Введенная строка не может быть идентификатором пользователя.")
        return None, "", -1
예제 #4
0
    def execute_search(self, info_for_search, user_id_old, user_id_banned):
        error, msg, response = search_by(info_for_search)
        if error != 0:
            return error, msg, None

        error, msg, count, items = vk_common.get_count_items_by_response(
            response)
        vk_common.dprint(2, "Парсим результат запроса: ", error, msg, count,
                         items)
        if error != 0:
            return error, msg, None

        if count == 0:
            return 0, "", None

        # Sort out all records of search
        for item in items:
            vk_common.dprint(2, item['id'], user_id_old)
            if item['id'] in user_id_old or item['id'] in user_id_banned:
                # print(f"id = {item['id']} пропустили.")
                continue

            vk_common.dprint(2, "item = ", item)
            user_add = vk_user.User()
            user_add.assign_by_user_info(item)
            vk_common.dprint(
                2, f"Смотрим результат работы user_add.assign_by_user_info: "
                f"{user_add.error['error']}: {user_add.error['msg']}")
            if user_add.error["error"] != 0:
                vk_common.dprint(
                    1, vk_common.func_name(),
                    f"Возникла ошибка {user_add.error['error']}: "
                    f"{user_add.error['msg']}.")
                return -1, f"{user_add.error['error']}: {user_add.error['msg']}", None

            vk_common.dprint(
                2,
                f"user_add.uid = {user_add.uid}, user_add.age = {user_add.age}"
            )

            if user_add.uid is None:
                vk_common.dprint(1, vk_common.func_name(),
                                 f"Параметр user_add.uid = {user_add.uid}")
                return -1, f"{vk_common.func_name()}. Параметр user_add.uid = {user_add.uid}.", None

            if user_add.age is not None:
                self.results.append(user_add)
                vk_common.dprint(2, f"id = {user_add.uid} добавили в список.")
            else:
                vk_common.dprint(
                    2,
                    f"id = {user_add.uid} пропустили потому как возраст не определился."
                )
        return 0, "", self.results
예제 #5
0
def input_user():
    """

    (None) -> object User or None

    Function asks user_id or nickname from standard input and gets object User by this user_id

    """

    # Input user id
    while True:
        id_string = input(
            "Введите id пользователя ВКонтакте (число=id пользователя или строка=nickname): "
        ).strip()
        # id_string = '171691064'
        # id_string = '5521318'

        user, msg, err = get_user_by_id(id_string)
        if err == 0:
            break
        else:
            vk_common.dprint(2, vk_common.func_name(), user, err, msg)
            if err == 5:
                break
            else:
                continue
    return user, err, msg
예제 #6
0
    def get_id_groups(self):
        """

        (None) -> list

        Function gets list of id groups of user VK: list(int, int, ..., int)

        """
        if self.groups is not None:
            value = (0, "", self.groups)
            return value

        params_here = vk_common.params.copy()
        params_here["user_id"] = self.uid
        params_here["count"] = 1000

        error, msg, response = vk_common.request_get(
            "https://api.vk.com/method/groups.get", params_here,
            vk_common.func_name())
        if error != 0:
            value = (error, msg, None)
            return value

        error, msg, count, items = vk_common.get_count_items_by_response(
            response)
        if error != 0:
            value = (error, msg, None)
            return value

        self.count_groups = count
        self.groups = items

        value = (0, "", self.groups)
        return value
예제 #7
0
    def get_id_friends(self):
        """

        (None) -> tuple(int, string, list or None)

        Function gets list of id friends of user VK: list(int, int, ..., int)

        """

        if self.friends is not None:
            value = (0, "", self.friends)
            return value

        params_here = vk_common.params.copy()
        params_here["user_id"] = self.uid

        error, msg, response = vk_common.request_get(
            "https://api.vk.com/method/friends.get", params_here,
            vk_common.func_name())
        if error != 0:
            value = (error, msg, None)
            return value

        error, msg, count, items = vk_common.get_count_items_by_response(
            response)
        if error != 0:
            value = (error, msg, None)
            return value

        self.count_friends = count
        self.friends = items

        value = (0, "", self.friends)
        return value
예제 #8
0
    def select_user(self, number):
        """

        (int) -> (int)

        Function describes pressing on any button on the frame

        """

        if len(self.users) < 1:
            vk_common.dprint(1, "Массив пользователей пуст.")
            return -1

        vk_common.dprint(2, vk_common.func_name(),
                         "Список пользователей при входе: ", self.users)
        self.user_id = self.users[number - 1][0]
        self.item_ids = self.users[number - 1][1]
        vk_common.dprint(2, f"Выбран пользователь с id = {self.user_id}")

        rows, err = vk_db.get_photo_info_by_user_id(self.user_id)
        if err != 0:
            vk_common.dprint(1, "Ошибка получения имен изображений.")
            return -2

        vk_common.dprint(2, rows)

        self.top_images = rows

        err = self.load_image()
        if err != 0:
            vk_common.dprint(1,
                             "Ошибка при загрузке изображений из БД на форму")
            return -2

        return 0
예제 #9
0
def search_by(search_info):
    """

    (dict) -> (integer, string, list of objects or None)

    Function executes search users by search parameters

    """

    params_here = vk_common.params.copy()
    params_here.update(search_info)
    vk_common.dprint(2, vk_common.func_name(), "Параметры поиска: ",
                     params_here)
    value = vk_common.request_get("https://api.vk.com/method/users.search",
                                  params_here, vk_common.func_name())
    vk_common.dprint(2, vk_common.func_name(), "Результат поиска: ", value)
    return value
예제 #10
0
    def load_image(self):
        """

        (None) -> (int)

        Function loads images from files from the disk to object label

        """

        if not hasattr(self, 'user_id'):
            vk_common.dprint(1, "Не определен атрибут user_id.")
            return -1

        if not hasattr(self, 'top_id'):
            vk_common.dprint(1, "Не определен атрибут top_id.")
            return -1

        if self.top_id not in (1, 2, 3):
            vk_common.dprint(1, "Атрибут top_id <> 1,2,3.")
            return -1

        err = -1
        try:
            vk_common.mk_dir(vk_common.DIR_IMAGES)
            file_path = f"{vk_common.DIR_IMAGES}{self.user_id}_{self.top_id}.jpg"
            vk_common.dprint(2, vk_common.func_name(),
                             f"Загружаем фото на форму из файла {file_path}.")

            img = Image.open(file_path)
            render = ImageTk.PhotoImage(img)

            if hasattr(self, 'label'):
                if self.label is not None:
                    self.label.destroy()

            self.label = Label(self.f_image, image=render)
            self.label.image = render
            self.label.pack()

            err = 0
        except FileNotFoundError as error:
            vk_common.dprint(2, vk_common.func_name(), "Возникло исключение: ",
                             error)
            err = -2
        finally:
            return err
예제 #11
0
    def get_info(self, nickname):
        """

        (string) -> (int, string, None)

        Function gets information about user through api vk by nickname of user

        """

        params_here = vk_common.params.copy()
        params_here["user_ids"] = nickname
        params_here["fields"] = vk_common.FIELDS_USER_INFO
        error, msg, response = vk_common.request_get(
            "https://api.vk.com/method/users.get", params_here,
            vk_common.func_name())
        if error != 0:
            value = (error, msg, None)
            return value

        error, msg, info_json_list = vk_common.get_field_of_response(
            response.json(), "response")
        if error != 0:
            value = (error, msg, None)
            return value

        if len(info_json_list) <= 0:
            value = (-1, "Пустой ответ", None)
            return value

        info_json = info_json_list[0]
        error, msg, deactivated = vk_common.get_field_of_response(
            info_json, "deactivated")
        if error == 0 and (deactivated == "DELETED"
                           or deactivated == "BANNED"):
            value = (error, msg, None)
            return value

        # Get values of information fields of user
        error, msg, fields = vk_common.get_fields_of_response(
            info_json, vk_common.FIELDS_USER_INFO)
        if error != 0:
            value = (error, msg, None)
            return value

        # id,first_name,last_name,bdate,deactivated,is_closed,interests,books,music,sex,city
        self.uid = fields.get('id')
        self.first_name = get_attr_value(fields, 'first_name')
        self.last_name = get_attr_value(fields, 'last_name')
        self.bdate = get_attr_value(fields, 'bdate')
        self.age = vk_common.get_age(self.bdate)
        self.interests = get_attr_value(fields, 'interests')
        self.books = get_attr_value(fields, 'books')
        self.music = get_attr_value(fields, 'music')
        self.sex = get_attr_value(fields, 'sex')
        self.city = get_attr_value(fields, 'city')

        return 0, "", self.uid
예제 #12
0
def re_create_db():
    """

    (None) -> None

    Function recreated all tables

    """

    result = drop_db()
    vk_common.dprint(2, vk_common.func_name(),
                     f" Результат работы drop_db равен {result}.")
    if result == -1:
        return "", -1

    msg, err = create_db()
    vk_common.dprint(2, vk_common.func_name(),
                     f"Результат работы create_db равен ({msg} {err})")
    return msg, err
예제 #13
0
    def get_id_friends(self):
        """

        (None) -> tuple(int, string, list or None)

        Function gets list of id friends of user VK: list(int, int, ..., int)

        """
        if self.users is None:
            return -1

        params_here = dict()
        params_here["count"] = 1000
        params_code = vk_common.params.copy()
        start = 0
        while True:
            if start > len(self.users):
                break

            script = ""
            user_idx = dict()
            for number, user in enumerate(
                    self.users[start:start +
                               vk_common.COUNT_REQUESTS_EXECUTE:1]):
                if user.friends is not None:
                    continue

                params_here["user_id"] = user.uid
                script += f"API.friends.get({params_here}),"
                user_idx[number] = user

            params_code["code"] = f"return [{script}];"
            error, msg, response = vk_common.request_get(
                'https://api.vk.com/method/execute', params_code,
                vk_common.func_name())
            if error != 0:
                value = (error, msg, None)
                return value
            response_json = response.json()
            response_json_ = response_json["response"]
            for number, response_item in enumerate(response_json_):
                user = user_idx[number]
                if response_item:
                    count = response_item["count"]
                    items = response_item["items"]

                    user.count_friends = count
                    user.friends = items
                else:
                    user.count_friends = 0
                    user.friends = None

            start = start + vk_common.COUNT_REQUESTS_EXECUTE

        return 0, "", None
예제 #14
0
    def dislike(self, event, number):
        """

        (string, int) -> (None)

        Function describes pressing on button "DISLIKE" on the frame (event = press on button)

        """

        if not hasattr(self, 'user_id') or not hasattr(self, 'top_id'):
            vk_common.dprint(2, vk_common.func_name(),
                             f"Не заданы атрибуты user_id = или top_id.")
            return

        item_id = self.item_ids[self.top_id - 1]
        if item_id is None:
            vk_common.dprint(2, vk_common.func_name(),
                             f"Атрибут item_id = None.")
            return
        else:
            vk_common.dprint(2, vk_common.func_name(),
                             f"number = {number}; item_id = {item_id}")

        vk_common.dprint(2, vk_common.func_name(),
                         f"number = {number}; item_id = {item_id}")
        vk_common.dprint(
            1, f"имя файла с фото = \"{self.user_id}_{self.top_id}\"; "
            f"ссылка = https://vk.com/id{self.user_id}")

        err, msg, likes = vk_common.dislike_photo(self.user_id, item_id)
        if err != 0:
            mb.showinfo(
                "Информация",
                f"Не смогли убрать лайк у фото пользователя с id = {self.user_id}."
            )
            vk_common.dprint(2, "Не смогли убрать лайк.")
            return
        mb.showinfo("Информация",
                    f"Убрали лайк у фото пользователя с id = {self.user_id}.")
        vk_common.dprint(
            2, f"Убрали лайк: owner_id = {self.user_id}; item_id = {item_id}")
예제 #15
0
def drop_table(curs, table_name):
    """

    (cursor link) -> None

    Function drops table by table name

    """

    sql_text = f"""DROP TABLE if exists {table_name}"""
    vk_common.dprint(2, vk_common.func_name(), f"Текст запроса: {sql_text}")
    curs.execute(sql_text)
예제 #16
0
    def get_name(self):
        """

        (None) -> str

        Function gets name of group VK

        """

        if 'self.group_name' in locals():
            value = (0, "", self.group_name)
            return value

        params_here = vk_common.params.copy()
        params_here["group_ids"] = self.group_id
        params_here["fields"] = "name,members_count"

        error, msg, response = vk_common.request_get(
            'https://api.vk.com/method/groups.getById', params_here,
            vk_common.func_name())
        if error != 0:
            value = (error, msg, None)
            return value

        response_json = response.json()
        error, msg, info_json_list = vk_common.get_field_of_response(
            response_json, 'response')
        if error != 0:
            value = (error, msg, None)
            return value

        info_json = info_json_list[0]

        error, msg, self.group_name = vk_common.get_field_of_response(
            info_json, 'name')
        if error != 0:
            value = (error, msg, None)
            return value

        error, msg, self.members_count = vk_common.get_field_of_response(
            info_json, 'members_count')
        if error != 0:
            value = (error, msg, None)
            return value

        value = (0, "", self.group_name)
        return value
예제 #17
0
def get_attr_value(fields, name_attr):
    """

    (dict, string) -> dict

    Function gets value of attribute by dict from vk and by name this attribute

    """

    f = fields.get(name_attr)
    vk_common.dprint(2, vk_common.func_name(), f"Тип переменной = ", type(f))

    if f is not None:
        if isinstance(f, str):
            if len(f) <= 0:
                f = None
    return f
예제 #18
0
    def __init__(self, users):
        if len(users) < 1:
            vk_common.dprint(
                1, "Ошибка с входными параметрами: массив пользователей пуст.")

        self.users = users
        vk_common.dprint(2, vk_common.func_name(),
                         "Список пользователей при входе: ", self.users)
        self.top_id = 1
        self.label = None
        self.user_id = None
        self.item_ids = None
        self.top_images = None
        self.root = None
        self.f_source = None
        self.f_control = None
        self.f_image = None
예제 #19
0
def get_groups_with_common_friends(id_groups_user, count_friends_limit):
    # Get groups which have <=N common friends
    params_here = dict()
    params_here["count"] = count_friends_limit
    params_here["filter"] = "friends"

    params_code = vk_common.params.copy()

    start = 0
    groups_common_friends_n = list()
    while True:
        if start > len(id_groups_user):
            break

        script = ""
        for group in id_groups_user[start:start +
                                    vk_common.COUNT_REQUESTS_EXECUTE:1]:
            params_here["group_id"] = group
            script += f"API.groups.getMembers({params_here}),"

        params_code["code"] = f"return [{script}];"
        error, msg, response = vk_common.request_get(
            'https://api.vk.com/method/execute', params_code,
            vk_common.func_name())
        if error != 0:
            value = (error, msg, None)
            return value

        response_json = response.json()
        response_json_ = response_json["response"]
        for group_id, response_item in zip(id_groups_user, response_json_):
            # print(group_id, response_item)
            if not response_item:
                continue

            # print(group_id, response_item)
            count = response_item["count"]
            # Accumulate id groups which have <=N=count_friends_limit common friends
            if count in range(1, count_friends_limit + 1):
                groups_common_friends_n.append(group_id)

        start = start + vk_common.COUNT_REQUESTS_EXECUTE

    value = (0, "", groups_common_friends_n)
    return value
예제 #20
0
    def execute_app(self):
        """

        (None) -> (None)

        Function describes execute gdi interface for liking or disliking photos of users

        """

        self.root = Tk()
        self.root.geometry(
            f"{vk_common.MAX_IMAGE_WIDTH}x{vk_common.MAX_IMAGE_HEIGHT}")
        self.root.title("Лайкер")

        self.f_source = Frame(self.root)
        self.f_source.pack(side=TOP)

        self.f_control = Frame(self.root)
        self.f_control.pack(side=TOP)

        self.f_image = Frame(self.root)
        self.f_image.pack(side=BOTTOM)

        vk_common.dprint(2, vk_common.func_name(),
                         "Список пользователей при входе: ", self.users)
        for number, user in enumerate(self.users, 1):
            set_button(self.f_source, str(number), self.select, number)

        set_button(self.f_control, "Лайкнуть", self.like, 1)
        set_button(self.f_control, "ДизЛайкнуть", self.dislike, 2)
        set_button(self.f_control, "<<", self.left, 3)
        set_button(self.f_control, ">>", self.right, 4)

        self.top_id = 1
        self.select_user(1)

        self.root.focus_set()
        self.root.wm_state('zoomed')
        self.root.call('wm', 'attributes', '.', '-topmost', '1')
        self.root.mainloop()
        sleep(1 / 3)
        self.root.quit()
예제 #21
0
def create_db(curs):
    """

    (cursor link) -> None

    Function creates all tables

    """

    # "id,name"
    sql_text = f"""CREATE TABLE if not exists {TABLES_NAMES[1]} (
                    id numeric(4) NOT NULL PRIMARY KEY,
                    name varchar(100));
                    """
    curs.execute(sql_text)
    vk_common.dprint(2, vk_common.func_name(),
                     f"Создали таблицу {TABLES_NAMES[1]}")

    # "id,first_name,last_name,age,interests,books,music,sex,city_id,favorite"
    sql_text = f"""CREATE TABLE if not exists {TABLES_NAMES[2]} (
                id numeric(10) NOT NULL PRIMARY KEY,
                first_name varchar(50),
                last_name varchar(50),              
                age numeric(3),
                interests varchar(3000),
                books varchar(3000),
                music varchar(3000),
                sex numeric(1),
                city_id integer references {TABLES_NAMES[1]}(id),
                favorite numeric(1));
                """
    curs.execute(sql_text)
    vk_common.dprint(2, vk_common.func_name(),
                     f"Создали таблицу {TABLES_NAMES[2]}")

    # "id,user_id,age_from,age_to,sex"
    sql_text = f"""CREATE TABLE if not exists {TABLES_NAMES[3]} (
                id serial PRIMARY KEY,
                user_id integer references {TABLES_NAMES[2]}(id),               
                age_from numeric(3),
                age_to numeric(3),
                sex numeric(1));
                """
    curs.execute(sql_text)
    vk_common.dprint(2, vk_common.func_name(),
                     f"Создали таблицу {TABLES_NAMES[3]}")

    # "id,search_id,user_id,cnt_common_friends,cnt_common_groups,cnt_common_interests,cnt_common_books,cnt_common_music"
    sql_text = f"""CREATE TABLE if not exists {TABLES_NAMES[4]} (
                id serial PRIMARY KEY,
                search_id integer references {TABLES_NAMES[3]}(id),                
                user_id integer references {TABLES_NAMES[2]}(id),
                cnt_common_friends numeric(4),
                cnt_common_groups numeric(4),
                cnt_common_interests numeric(4),
                cnt_common_books numeric(4),
                cnt_common_music numeric(4));
                """
    curs.execute(sql_text)
    vk_common.dprint(2, vk_common.func_name(),
                     f"Создали таблицу {TABLES_NAMES[4]}")

    # "id,user_id,top_id,image_file_path"
    sql_text = f"""CREATE TABLE if not exists {TABLES_NAMES[0]} (
                id serial PRIMARY KEY,
                user_id integer references {TABLES_NAMES[2]}(id),
                top_id numeric(2),
                image_file_path varchar(100),
                item_id integer);
                """
    curs.execute(sql_text)
    vk_common.dprint(2, vk_common.func_name(),
                     f"Создали таблицу {TABLES_NAMES[0]}")
예제 #22
0
    def search_users(self, user, search_param, user_id_old, user_id_banned):
        """

        (object User, dict, list, list) -> (integer, string, list of objects User or None)

        Function executes search users by search parameters

        """

        if not isinstance(user, vk_user.User):
            vk_common.dprint(1, vk_common.func_name(),
                             f"{type(user)} is not object User.")
            return -1, "Некорректный входной параметр.", None

        if not isinstance(user_id_banned, list):
            vk_common.dprint(1, vk_common.func_name(),
                             f"{type(user_id_banned)} is not list.")
            return -1, "Некорректный входной параметр.", None

        if not isinstance(user_id_old, list):
            vk_common.dprint(1, vk_common.func_name(),
                             f"{type(user_id_old)} is not list.")
            return -1, "Некорректный входной параметр.", None

        vk_common.dprint(2, "Черный список", user_id_banned)
        vk_common.dprint(2, "Список пользователей, которые были найдены ранее",
                         user_id_old)
        vk_common.dprint(2, "Параметры поиска: ", search_param)

        age_from = search_param['age_from']
        age_to = search_param['age_to']
        sex = search_param['sex']

        if age_from <= 0 or age_to <= 0:
            return -1, f"\"Возраст\" как параметр поиска должен быть положительным числом. " \
                      f"age_from = {age_from}, age_to = {age_to}", None

        if age_to < age_from:
            return -1, f"\"Возраст ОТ\" должен быть <= \"Возраст ДО\". " \
                      f"age_from = {age_from}, age_to = {age_to}", None

        if sex not in (0, 1, 2):
            return -1, f"\"Пол\" как параметр должен быть 0, 1 или 2; sex = {sex}", None

        self.fields['user_id'] = user.uid
        self.fields['age_from'] = age_from
        self.fields['age_to'] = age_to
        self.fields['sex'] = sex
        self.fields['city'] = user.city

        # Execute the search
        info_for_search = dict()
        info_for_search['age_from'] = age_from
        info_for_search['age_to'] = age_to
        info_for_search['sex'] = sex
        info_for_search['city'] = user.city_id
        info_for_search['fields'] = vk_common.FIELDS_USER_INFO
        info_for_search['count'] = COUNT_REC_BY_ONE_REQUEST
        vk_common.dprint(2, "Формирование информации для функции поиска: ",
                         info_for_search)

        self.results = list()
        if MODE_DIVIDE_SEARCH_BY_MONTH == 1:
            for month in range(1, 13):
                info_for_search['birth_month'] = month
                err, msg, data = self.execute_search(info_for_search,
                                                     user_id_old,
                                                     user_id_banned)
                if err != 0:
                    vk_common.dprint(
                        2, vk_common.func_name(),
                        f"Ошибка в процедуре поиска {err}: {msg} data = {data}"
                    )
                    return -1, f"Ошибка в процедуре поиска {err}: {msg} data = {data}", None
        else:
            err, msg, data = self.execute_search(info_for_search, user_id_old,
                                                 user_id_banned)
            if err != 0:
                vk_common.dprint(
                    2, vk_common.func_name(),
                    f"Ошибка в процедуре поиска {err}: {msg} data = {data}")
                return -1, f"Ошибка в процедуре поиска {err}: {msg} data = {data}", None

        value = (0, '', self.results)
        return value
예제 #23
0
    def get_top_photos(self, top_count):
        """

        (None) -> (int, string, int)

        Function gets photos of user

        """

        params_here = vk_common.params.copy()
        params_here["owner_id"] = self.uid
        params_here["album_id"] = 'profile'
        params_here["rev"] = 1
        params_here["extended"] = 1
        params_here["photo_sizes"] = 1

        error, msg, response = vk_common.request_get(
            "https://api.vk.com/method/photos.get", params_here,
            vk_common.func_name())
        if error != 0:
            if error == 30:
                value = (0, "", (None, None, None))
            else:
                value = (error, msg, None)
            return value

        error, msg, count, items = vk_common.get_count_items_by_response(
            response)
        if error != 0:
            value = (error, msg, None)
            return value

        if len(items) == 0:
            value = (0, "Нет фотографий в профиле", (None, None, None))
            return value

        url_dict = {}
        for item in items:
            vk_common.dprint(2, item)
            # Select max size
            sizes = item['sizes']
            max_size_elem = None
            max_size_w = 0
            max_size_h = 0
            for picture in sizes:
                if picture['width'] > vk_common.MAX_IMAGE_WIDTH or picture[
                        'height'] > vk_common.MAX_IMAGE_HEIGHT:
                    continue
                if picture['width'] >= max_size_w and picture[
                        'height'] >= max_size_h:
                    max_size_w = picture['width']
                    max_size_h = picture['height']
                    max_size_elem = picture
            item['sizes'] = max_size_elem
            url_dict[(item['id'],
                      max_size_elem['url'])] = item['likes']['count']

            vk_common.dprint(
                2,
                f"Выбрали фото с максимальным размером: width = {max_size_w} height = {max_size_h} "
                f"url = {max_size_elem['url']} owner_id = {item['owner_id']} "
                f"id = {item['id']} likes_count = {item['likes']['count']}")

        # Sort dict by values
        list_d = list(url_dict.items())
        vk_common.dprint(2, "До сортировки картинок по лайкам", list_d)
        list_d.sort(reverse=True, key=lambda i: i[1])
        vk_common.dprint(2, "После сортировки картинок по лайкам", list_d)

        top_url = []
        for item in list_d[:top_count:1]:
            top_url.append(item[0])

        vk_common.dprint(2, "В итоге получили список url: ", top_url)
        value = (0, "", top_url)
        return value
예제 #24
0
def execute_mode_search():
    """

    (None) -> (object User, object Search, int)

    Function creates object User and object Search and execute process of searching

    """

    user, err, msg = input_user()
    if err != 0:
        vk_common.dprint(2, "Ошибка при вводе идентификатора пользователя.",
                         err)
        return None, None, -1
    else:
        vk_common.dprint(2, "Процедура ввода пользователя завершена.")

    search_param, err = input_search_parameters(user)
    if err != 0:
        print("Пользователь выбрал выход из программы.")
        return user, None, -1

    user_id_old, err = get_user_id_by_old_searches(user.uid)
    if err != 0:
        vk_common.dprint(2, "Ошибка при получении кол-ва записей в таблице.")
        return user_id_old, None, -1

    user_id_banned, err = vk_db.get_banned_users()
    if err != 0:
        vk_common.dprint(
            2,
            "Ошибка при получении списка пользователей, занесенных в черный список."
        )
        value = (user_id_banned, None, -1)
        return value

    search = vk_search.Search()
    err, msg, users_search = search.search_users(user, search_param,
                                                 user_id_old, user_id_banned)
    if err == 0:
        if len(users_search) > 0:
            print(
                f"Произвели поиск по параметрам. Найдено {len(users_search)} записей."
            )
        else:
            print(f"По данным критериям больше ничего не найдено.")
            value = (user, search, 0)
            return value
    else:
        vk_common.dprint(2, err)
        value = (user, search, -1)
        return value

    users_obj = vk_users.Users(users_search)

    # Detect additional information for searched users
    users_obj.get_additional_info(user)

    # Detect top-10 users by search
    top_users, err = get_top_users_by_search(search, 10)
    if err != 0:
        vk_common.dprint(2, f"Не определена информация о списке топ-10.")
        value = (None, None, -1)
        return value

    if len(top_users) == 0:
        vk_common.dprint(2, f"Не определена информация о списке топ-10.")
        value = (None, None, -1)
        return value

    # Getting photos
    for top_user in top_users:
        # Get top-3 url photos from profile of user and save it
        err, msg, photo_data = top_user.get_top_photos(3)
        if err != 0:
            continue
        vk_common.dprint(2, "Получили данные о фотографиях: ", photo_data)

        top_user.photos = []
        for number, data in enumerate(photo_data, 1):
            vk_common.dprint(2, "Получили данные об одной фото: ", data)

            # Save to file
            if data is None:
                image_file_path = ""
                item_id = None
            else:
                vk_common.mk_dir(vk_common.DIR_IMAGES)
                image_file_path = f"{vk_common.DIR_IMAGES}{top_user.uid}_{number}.jpg"
                item_id = data[0]
                url = data[1]
                vk_common.download_photo_to_file(url, image_file_path)
            top_user.photos.append((item_id, image_file_path))

    # Write top-users to json file
    vk_common.dprint(
        2, vk_common.func_name(),
        f"Проверка перед созданием json: top_users = {top_users}")
    if len(top_users) > 0:
        vk_common.mk_dir(vk_common.DIR_JSON)
        is_ok_write = vk_common.write_to_json(
            f"{vk_common.DIR_JSON}top10_id{user.uid}_{search.age_from}_"
            f"{search.age_to}_{search.sex}_{vk_common.get_current_time_label()}.json",
            top_users)
        if is_ok_write:
            print("Записан json файл c топ-10 результата поиска.")
        else:
            print("Произошла ошибка записи json-файла.")

    value = (user, search, 0)
    return value