def get_friends(user_id, fields): """ Вернуть данных о друзьях пользователя :param user_id: идентификатор пользователя, список друзей которого нужно получить :param fields: список полей, которые нужно получить для каждого пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert isinstance(fields, str), "fields must be string" assert user_id > 0, "user_id must be positive integer" domain = "https://api.vk.com/method" access_token = config.VK_CONFIG['access_token'] user_id = user_id query_params = { 'domain': domain, 'access_token': access_token, 'user_id': user_id, 'fields': fields } query = "{domain}/friends.get?access_token={access_token}&user_id={user_id}&fields={fields}&v=5.53".format(**query_params) response = get(query).json() try: response = response['response']['items'] except: return [] for num, friend in enumerate(response): user = User(id= friend['id'], first_name=friend['first_name'], last_name=friend['last_name'], online=friend['online']) try: user.bdate = friend['bdate'] except: pass response[num] = user return response
def get_friends(user_id, fields): assert isinstance(user_id, int), "user_id must be positive integer" assert isinstance(fields, str), "fields must be string" assert user_id > 0, "user_id must be positive integer" domain = "https://api.vk.com/method" access_token = config.VK_CONFIG['access_token'] user_id = user_id query_params = { 'domain': domain, 'access_token': access_token, 'user_id': user_id, 'fields': fields } query = "{domain}/friends.get?access_token={access_token}&user_id={user_id}&fields=" \ "{fields}&v=5.53".format(**query_params) response = get(query).json() try: response = response['response']['items'] except: return [] for num, friend in enumerate(response): user = User(id=friend['id'], first_name=friend['first_name'], last_name=friend['last_name'], online=friend['online']) try: user.bdate = friend['bdate'] except: pass response[num] = user return response
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" data = get_friends(user_id) friends = data['response']['items'] ages = [] for friend in friends: user = User(**friend) try: bdate = str(user.bdate) d, m, y = map(int, bdate.split('.')) today = str(dt.date.today()) ty, tm, td = map(int, today.split('-')) if tm > m or (m == tm and td > d): ages.append(ty - y) else: ages.append(ty - y - 1) except ValueError: pass return median(ages)
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" list_fr = get_friends(user_id, 'bdate') ages = [] for friend in list_fr: user = User(**friend) try: bdate = str(user.bdate) if bdate.count('.') == 2: day, month, year = map(int, bdate.split('.')) today = str(dt.date.today()) year_now, month_now, day_now = map(int, today.split('-')) if month_now > month or (month == month_now and day_now > day): ages.append(year_now - year) else: ages.append(year_now - year - 1) except: pass if ages: return median(ages)
def get_friends_with_execute(user_ids: List[int]) -> List[List[User]]: # Uses execute method to collect data about friends of many people friends_list = [] for i in range(len(user_ids) // 25 + 1): code = """ var users = {}; var friends = []; var i = 0; while (i < users.length) {{ var user_friends = API.friends.get( {{"user_id":users[i], "fields":"online"}})["items"]; friends.push(user_friends); i = i+1; }} return friends; """.format(user_ids[i * 25:(i + 1) * 25]) user_friends_list = execute(code) friends_list.extend(user_friends_list) # Deleting deactivated or closed users and making users model list i = 0 while i < len(friends_list): if friends_list[i] is None: print(i) friends_list.pop(i) continue for j, friend in enumerate(friends_list[i]): friends_list[i][j] = User(**friend) i += 1 return friends_list
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" friends = get_friends(user_id, "bdate") friends = [User(**friend) for friend in friends] ages = [] for friend in friends: if friend.bdate is not None: data = friend.bdate.split(".") if len(data) == 3: age = datetime.now().year - int(data[2]) born_month = int(data[1]) born_day = int(data[0]) if (datetime.now().month < born_month) or (datetime.now().month == born_month and datetime.now().day < born_day): ages.append(age - 1) else: ages.append(age) if ages: ages.sort() if len(ages) % 2 == 1: return ages[len(ages) // 2] else: return (ages[len(ages) // 2 - 1] + ages[len(ages) // 2]) / 2 else: return None
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" response = get_friends(user_id, 'bdate') ages = [] friends = [User(**friend) for friend in response] for friend in friends: if friend.bdate is not None: date = friend.bdate.split('.') if len(date) == 3: bday = int(date[0]) bmonth = int(date[1]) age = datetime.now().year - int(date[2]) if (datetime.now().month < bmonth) or ((datetime.now().month == bmonth) and (datetime.now().day < bday)): age -= 1 ages.append(age) if ages != []: return median(ages) else: return None
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" friends_list = get_friends(user_id, 'bdate') age_list = [] for friend in friends_list: user = User(**friend) if user.bdate is not None: bdate = user.bdate.split('.') if len(bdate) == 3: year = dt.datetime.now().year month = dt.datetime.now().month day = dt.datetime.now().day if (month >= int(bdate[1])) & (day >= int(bdate[0])): age_list.append(year - int(bdate[2])) else: age_list.append(year - int(bdate[2]) - 1) age_list.sort() if len(age_list) != 0: age = median(age_list) else: age = None return age
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" cur_date = dt.datetime.now() fr_list = get_friends(user_id, 'bdate') age_list = [] for fr in fr_list: user = User(**fr) if user.bdate: try: bd = dt.datetime.strptime(user.bdate, '%d.%m.%Y') except: continue age = cur_date.year - bd.year if cur_date.month < bd.month: age -= 1 elif (cur_date.month == bd.month) and (cur_date.day <= bd.day): age -= 1 age_list.append(age) if age_list: return float(median(age_list))
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" friends = [User(**friend) for friend in get_friends(user_id, 'bdate')] # current_date = dt.datetime.now() # tests fix current_date = dt.datetime.now() - dt.timedelta(days=365) result = [] for friend in friends: birthday = friend.bdate if birthday: # ДР указан try: # ДР полный bd = dt.datetime.strptime(birthday, "%d.%m.%Y") except: continue age = current_date - bd result.append(int(age.days / 365.25)) if result: return median(result)
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" friends = get_friends(user_id, fields='bdate') list_age = [] for friend in friends: user = User(**friend) if user.bdate: birthday = user.bdate today = dt.now() if len(birthday) == 10: born = dt.strptime(birthday, '%d.%m.%Y') age = today.year - born.year - ((today.month, today.day) < (born.month, born.day)) list_age.append(age) if len(list_age) != 0: return median(list_age) return None
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" friends = get_friends(user_id) ages = [] for friend in friends: user = User(**friend) try: bdate = str(user.bdate) bd, bm, by = map(int, bdate.split('.')) today = dt.date.today() ages.append(today.year - by - ((today.month, today.day) < (bm, bd))) except ValueError: pass try: return median(ages) except: pass
def get_friends(user_id, fields): """ Returns a list of user IDs or detailed information about a user's friends """ assert isinstance(user_id, int), "user_id must be positive integer" assert isinstance(fields, str), "fields must be string" assert user_id > 0, "user_id must be positive integer" domain = "https://api.vk.com/method" access_token = '949de9049e46bce7b329236f68f0f6f94d2fc0656ef260dde73273342572c4f62a837405b5b769f0c501d' user_id = user_id fields = fields v = '5.103' q_params = { 'domain': domain, 'access_token': access_token, 'user_id': user_id, 'fields': fields, 'v': v } query = f"{domain}/friends.get?access_token={access_token}&user_id={user_id}&fields={fields}&v={v}".format( **q_params) response = get(query).json() try: response = response['response']['items'] except: return [] for num, friend in enumerate(response): user = User(id=friend['id'], first_name=friend['first_name'], last_name=friend['last_name'], online=friend['online']) try: user.bdate = friend['bdate'] except: pass response[num] = user return response
def age_predict(user_id: int) -> Optional[float]: """ Returns median from user's friends ages :param user_id: user ID which age we are predicting :return: approximate user's age """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" friends_ages = [] request = get_friends(user_id, 'bdate') user_friends = [User(**friend) for friend in request] # pprint.pprint(user_friends) for friend in user_friends: if (friend.bdate is not None) and (len(friend.bdate) >= 8): friend_bdate = dt.strptime(friend.bdate, "%d.%m.%Y") today = dt.now() age = (today - friend_bdate) friends_ages.append(age.days / 365.25) return round(median(friends_ages), 1) if friends_ages else None
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" friends = [User(**friend) for friend in get_friends(user_id, 'bdate')] current_date = datetime.date(datetime.now()) age_list = [] for person in friends: bday = person.bdate if bday: try: bd = datetime.strptime(bday, "%d.%m.%Y") except (ValueError, TypeError): continue age = current_date.year - bd.year - ( (current_date.month, current_date.day) < (bd.month, bd.day)) age_list.append(age) if age_list: return float(median(age_list))
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" friends = get_friends(user_id, 'bdate')['items'] friendslist = [] for j in range(len(friends)): friendslist.append(User(**friends[j])) ageslist = [] bdateslist: list = [] for j in range(len(friendslist)): bdateslist.append([]) try: bdateslist[j] = friendslist[j].bdate except Exception: pass for i in range(len(bdateslist)): try: dates = bdateslist[i].split('.') day = int(dates[0]) month = int(dates[1]) year = int(dates[2]) today = date.today() if (month > int(today.month)) | \ (month == int(today.month)) & (day > int(today.day)): ageslist.append(int(today.year) - year - 1) else: ageslist.append((int(today.year - year))) except Exception: pass if len(ageslist) != 0: return median(ageslist) else: return None
def get_friends(user_id: int, fields: str = 'bdate', count: int = 5, offset: int = 0) -> List[User]: # Returns info about user friends assert isinstance(user_id, int), "user_id must be positive integer" assert isinstance(fields, str), "fields must be string" assert user_id > 0, "user_id must be positive integer" url = "https://api.vk.com/method/friends.get" parameters = { 'access_token': config.VK['VK_ACCESS_TOKEN'], 'user_id': user_id, 'offset': offset, 'fields': fields, 'count': count, 'v': config.VK['API_VERSION'] } friends = get(url, params=parameters)['items'] for i in range(len(friends)): friends[i] = User(**friends[i]) return friends
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" friends = get_friends(user_id, 'bdate') ages = [] for friend in friends: user = User(**friend) if user.bdate and len(user.bdate) > 8: time_n = datetime.now() time_b = datetime.strptime(user.bdate, "%d.%m.%Y") u_age = (time_n - time_b) ages.append(int(u_age.days//365.25)) return median(ages) if ages else None
def age_predict(user_id: int) -> Optional[float]: """ Наивный прогноз возраста по возрасту друзей Возраст считается как медиана среди возраста всех друзей пользователя :param user_id: идентификатор пользователя :return: медианный возраст пользователя """ assert isinstance(user_id, int), "user_id must be positive integer" assert user_id > 0, "user_id must be positive integer" data = get_friends(user_id, 'bdate') friends = [User(**friend) for friend in data] ages = [] for friend in friends: if friend.bdate is not None: if len(friend.bdate) >= 8: ages.append( (datetime.today() - datetime.strptime(friend.bdate, '%d.%m.%Y')).days // 365.25) if len(ages) > 0: age = median(ages) return age else: return None