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
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
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
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
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
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
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
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
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
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
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
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
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
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}")
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)
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
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
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
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
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()
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]}")
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
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
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