Как стать автором
Обновить

Подбор скрытой даты рождения пользователя ВК на Python

Сделать подобное позволяет некоторая особенность поиска ВК: хотя год рождения пользователя не виден на его страничке, в результатах поиска этот пользователь будет выводиться только в случае совпадения указанного, пусть и скрытого, года рождения с заданным в поиске.

Сразу же приходит в голову идея автоматизировать перебор, что создатели приложения и сделали. Я же повторю их «подвиг» и напишу аналог на Python.

И еще небольшое замечание, на которое меня натолкнуло это приложение. Зачем перебирать все возможные года? Можно же изначально определить некую отправную точку. За нее можно принять средний год рождения друзей «исследуемого» пользователя, ведь в основном в друзьях находятся ровестники. В случае, если нет друзей, они скрыты или у них всех скрыт их возраст, целесообразно будет начинать поиск со среднего года рождения пользователя ВК, будем считать что это 1990 (поправьте, если имеются другие данные).

Я буду использовать ранее упомянутую на Хабре библиотеку vk для удобного доступа к VK API. Единственное но: она не позволяет выполнять запросы без access_token'а.

Процесс получения токена достаточно хорошо описан в документации да и много где еще, поэтому останавливаться на этом не будем. В конечном варианте скрипта предполагается, что токен сохранен в token.txt в той же директории.

Получаем друзей, их возраст, вычисляем среднее значение
Заодно формируем список, по которому в дальнейшем будем перебирать год:
friends=vkapi.friends.get(user_id=user,fields='bdate')
bdates=0
counter=0
if friends['count']>0:
    for i in friends['items']:
        if 'bdate' in i.keys():
            if len(i['bdate'])>5:
                 bdates+=int(i['bdate'][-4:])
                 counter+=1
    avr=bdates//counter
else:
    avr=1990
ageFromTo=[avr]
for i in range(1,40):
    ageFromTo.append(avr+i)
    ageFromTo.append(avr-i)



Начинаем перебирать
Имя, фамилия, город, день и месяц рождения используются для сужения круга поиска, чтобы не перебирать лишних людей, хотя это и не обязательно.
info=vkapi.users.get(user_ids=user,fields='city,bdate')
if 'bdate' in info[0].keys():
    if len(info[0]['bdate'])>5:
        print(info[0]['bdate'][-4:])
        sys.exit()
    dat=info[0]['bdate'].split('.')
if 'city' in info[0].keys():
    cit=info[0]['city']['id']
fname=info[0]['first_name']
lname=info[0]['last_name']
for i in ageFromTo:
    while True:
        try:
            ans=vkapi.users.search(q=fname+' '+lname,count=1000,
                                   birth_day=dat[0],birth_month=dat[1],
                                   city=0,birth_year=i)
            break
        except vk.exceptions.VkAPIError as text:
            if str(text)[:2]=='6.':
                time.sleep(1)
                continue
    if ans['count']>0:
        for j in ans['items']:
            if str(j['id'])==user:
                print(i)
                flag=True
    if flag:
        break


Финальный вариант скрипта: PasteBin.

Не забывайте, что найденный год не обязательно будет правильным годом рождения пользователя, так как можно указать ошибочный год в профиле.

P.S. Замечания приветствуются.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.