Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
Archivo: age.py Proyecto: Henk0/cs102
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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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))
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
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
Ejemplo n.º 13
0
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
Ejemplo n.º 14
0
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
Ejemplo n.º 15
0
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))
Ejemplo n.º 16
0
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
Ejemplo n.º 17
0
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
Ejemplo n.º 18
0
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
Ejemplo n.º 19
0
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