Soft Identifier - VK OSINT TOOL

Приветствую всех обитателей данного форума! Сегодня я поведаю вам о таком инструменте как "Identifier", он нужен для анализа странички в соц.сети ВК.

Что делает этот инструмент? Создает отчет где: записываются данные друзей человека, кол-во мужчин/женщин у человека в друзьях, его предположительный пол (определяется на основе соотношения мужчин/женщин в друзьях у человека), предполагаемый возраст (определяется по среднему значению возраста друзей человека), предполагаемые города, где проживает человек (определяется по 3-ем самым часто встречающимся городам у друзей), возможные увлечения человека (определяется по 3-ем самым часто встречающимся тематикам групп, на которые подписан человек)

*Код инструмента прикреплен внизу
Приступим к установке. Для работы инструмента вам понадобится , установить библиотеку requests python -m pip install requests, токен вконтакте, получить его можно .
Токен вставляем в 169 строку, в переменную access_token. Теперь нам надо запустить инструмент python имя файла.py

После запуска инструмента вводим id страницы, посмотреть его можно в адресной строке браузера.

Screenshot_1.png

рис. 1 "id страницы"

Подождем пока инструмент обработает данные.

Screenshot_2.png

рис. 2 "Вывод инструмента"


Screenshot_3.png

рис.3 "файл report.txt"

Python:
import requests
import datetime
from collections import Counter

def banner():
    print('''\nd888888b d8888b. d88888b d8b   db d888888b d888888b d88888b d888888b d88888b d8888b.
  `88'   88  `8D 88'     888o  88 `~~88~~'   `88'   88'       `88'   88'     88  `8D
   88    88   88 88ooooo 88V8o 88    88       88    88ooo      88    88ooooo 88oobY'
   88    88   88 88~~~~~ 88 V8o88    88       88    88~~~      88    88~~~~~ 88`8b  
  .88.   88  .8D 88.     88  V888    88      .88.   88        .88.   88.     88 `88.
Y888888P Y8888D' Y88888P VP   V8P    YP    Y888888P YP      Y888888P Y88888P 88   YD
                                                                           
                                                                            Made by @Tayrus
                                                                                ver 0.1dev    
                                                                                     ''')



def analysis_gender(male_count, female_count):
    if male_count > female_count:
        verdict = 'мужчина'
   
    if female_count > male_count:
        verdict = 'женщина'

    if male_count == female_count:
        verdict = 'n/a'

    return verdict

def analysis_age(current_year, person_year):
    person_year =  person_year.split('.')
    age = current_year - int(person_year[2])
   
    #Отсееваем тех, кто указал не настоющую дату, например 100 лет
    if age >=60:
        age = 45

    return age

def make_report(count,dic):
    male_count = 0
    female_count = 0
    handle = open('report.txt','w')
    now = datetime.datetime.now()
    current_year = now.year
    sum_age = 0
    count_person_with_age = 0
    frequent_cities = []
    hobbies_list = []

    for x in range(0,count):
            person_id = dic['response']['items'][x]['id']
            person_first_name = dic['response']['items'][x]['first_name']
            person_last_name = dic['response']['items'][x]['last_name']
            person_sex = dic['response']['items'][x]['sex']
           
            try:
                if person_sex == 2:
                    person_sex = 'мужской'
                    male_count += 1
                if person_sex == 1:
                    person_sex = 'женский'
                    female_count +=1

                try:
                    person_bdate = dic['response']['items'][x]['bdate']
                except KeyError:
                    handle.write(f'{person_first_name} {person_last_name} id - {person_id}/дата рождения - n/a /пол - {person_sex}\n')
                    continue

                try:
                    age = analysis_age(current_year,person_bdate)
                    sum_age += age
                    count_person_with_age +=1
                except:
                    handle.write(f'{person_first_name} {person_last_name} id - {person_id}/дата рождения - {person_bdate}/возраст - n/a /пол - {person_sex}\n')
                    continue
               
                try:
                    person_city = dic['response']['items'][x]['city']['title']
                    frequent_cities.append(person_city)
                except KeyError:
                    handle.write(f'{person_first_name} {person_last_name} id - {person_id}/дата рождения - {person_bdate}/возраст - {age}/пол - {person_sex}/город - n/a\n')
                    continue

                try:
                    person_phone = dic['response']['items'][x]['mobile_phone']
                except KeyError:
                    handle.write(f'{person_first_name} {person_last_name} id - {person_id}/дата рождения - {person_bdate}/возраст - {age}/пол - {person_sex}/город - {person_city}/моб.номер - n/a\n')
                    continue

                handle.write(f'{person_first_name} {person_last_name} id - {person_id}/дата рождения - {person_bdate}/возраст - {age}/пол - {person_sex}/город - {person_city}/моб.номер - {person_phone}\n')
            except UnicodeEncodeError:
                continue

    #Часто встречающийся пол друзей  
    verdict_gender = analysis_gender(male_count, female_count)
   
    #Среднее значение возраста друзей
    estimated_age = int(sum_age/count_person_with_age)
   
    #Часто встречающиеся города друзей
    frequent_cities = Counter(frequent_cities)
    one_city, two_city, three_city = frequent_cities.most_common(3)
    one_city = one_city[0]
    two_city = two_city[0]
    three_city = three_city[0]

    #Увлечения
    groups = get_user_group(id)
   
    for group_id in groups:
        try:
            hobbies_list.append(get_group_activiti(group_id))
        except KeyError:
            continue
   
    group_counter = Counter(hobbies_list)
    one_hobbie, two_hobbie, three_hobbie = group_counter.most_common(3)
    one_hobbie = one_hobbie[0]
    two_hobbie = two_hobbie[0]
    three_hobbie = three_hobbie[0]



   
   
    handle.write('Итого:')
    handle.write(f'\n\nМужчин - {male_count}/Женщин - {female_count} \nпредположительно объект - {verdict_gender} \nпредпологаемый возраст - {estimated_age}\nвозможный город - {one_city}/{two_city}/{three_city}\nвозможные увлечения - {one_hobbie}/{two_hobbie}/{three_hobbie}')
    handle.close()

def get_user_group(id):
    r = requests.get(f'https://api.vk.com/method/groups.get?user_id={id}&access_token={access_token}&v=5.103')
    groups = r.json()['response']['items']
   
    return groups

def get_group_activiti(id):
    r = requests.get(f'https://api.vk.com/method/groups.getById?group_id={id}&fields=activity&access_token={access_token}&v=5.103')
   
    return r.json()['response'][0]['activity']

def resolve_id(id):
    r = requests.get(f'https://api.vk.com/method/utils.resolveScreenName?screen_name={id}&oath=0&access_token={access_token}&v=5.103')
   
    return r.json()['response']['object_id']

def get_friends_info(id):
    r = requests.get(f'https://api.vk.com/method/friends.get?user_id={id}&fields=sex,bdate,city,contacts&order=name&access_token={access_token}&v=5.103')
    data = r.json()
    count = int(data['response']['count'])
   
    make_report(count,data)

def get_user_input():
    user_id  = input('Введите id страницы: ')
    try:
        int(user_id)
    except:
        user_id = resolve_id(user_id)
   
    return user_id


if __name__ == '__main__':
    try:
        banner()
        access_token = '' #Вставьте сюда ваш токен

        if access_token == '':
            print('Токен не обнаружен, запишите его')
            exit()

        id = get_user_input()
        get_friends_info(id)
        print('\n[+] Отчет сгенерирован ./report.txt')
    except KeyboardInterrupt:
        print('\n\n[+] Выходим...')
        exit()
 

Вложения

  • Screenshot_2.png
    Screenshot_2.png
    4,6 КБ · Просмотры: 776
Последнее редактирование:
Не одобряю так сказать, есть же четкие характеристики профиля такие как : Мужчина/Женщина, Дата рождения, Город, Увлечения
Зачем делать медианную выборку для получения данных характеристик если они есть в явном виде, просто спарсил и все, или даже лучше воспользоваться апи для получения данных

И если ты пишешь скрипт для использования не самолично, думаю правильно сделать хоть какой юзер интерфейс
python3 -m my-module --auth_token=999999 ----КАК ПРИМЕР


Beautiful is better than ugly.
Simple is better than complex.
 
Выдает:
Traceback (most recent call last):
File "wow.py", line 176, in <module>
get_friends_info(id)
File "wow.py", line 154, in get_friends_info
make_report(count,data)
File "wow.py", line 101, in make_report
estimated_age = int(sum_age/count_person_with_age)
ZeroDivisionError: division by zero
 
Не одобряю так сказать, есть же четкие характеристики профиля такие как : Мужчина/Женщина, Дата рождения, Город, Увлечения
Зачем делать медианную выборку для получения данных характеристик если они есть в явном виде, просто спарсил и все, или даже лучше воспользоваться апи для получения данных

И если ты пишешь скрипт для использования не самолично, думаю правильно сделать хоть какой юзер интерфейс
python3 -m my-module --auth_token=999999 ----КАК ПРИМЕР


Beautiful is better than ugly.
Simple is better than complex.
Конечно можно было спарасить то, что указано на странице у пользователя, но вдруг он указал не те данные? Инструмент выясняет это за счет друзей, задумка такая )
PS Аргументы добавлю в обнове

Выдает:
Traceback (most recent call last):
File "wow.py", line 176, in <module>
get_friends_info(id)
File "wow.py", line 154, in get_friends_info
make_report(count,data)
File "wow.py", line 101, in make_report
estimated_age = int(sum_age/count_person_with_age)
ZeroDivisionError: division by zero
Что-то не так с возрастом у пользователя, кого ты сканируешь. Исправлю в обнове
 
Очень отрадно, что кто то тоже интересуется этой темой. Весьма перспективное направление в ОСИНТе. Мой бот уже умеет строить карту отношений и зависимостей друзей. По лайкам и коментам и т.п. Давным давно начинал с того же. Возраст пол увлечения работа школа университет. Кстати рекомендую добавить эти пункты. Как гласит народная мудрость: "Скажи мне, кто твой друг и я скажу, кто ты"
 
Конечно можно было спарасить то, что указано на странице у пользователя, но вдруг он указал не те данные? Инструмент выясняет это за счет друзей, задумка такая )
PS Аргументы добавлю в обнове
Если есть предположение что человек указал неактуальную информацию, то почему ты его не распостраняешь на его друзей?)
Тоесть его друзья тоже могут указать не актуальную информацию и поитогу ты получишь вообще кашу)
 
Если есть предположение что человек указал неактуальную информацию, то почему ты его не распостраняешь на его друзей?)
Тоесть его друзья тоже могут указать не актуальную информацию и поитогу ты получишь вообще кашу)
Исключено!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!