Pull to refresh

Подбор скрытой даты рождения пользователя ВК на 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. Замечания приветствуются.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.