╔═══════════════════════════════════════════════╗
║ ░█████╗░░██████╗██╗███╗░░██╗████████╗ ║
║ ██╔══██╗██╔════╝██║████╗░██║╚══██╔══╝ ║
║ ██║░░██║╚█████╗░██║██╔██╗██║░░░██║░░░ ║
║ ██║░░██║░╚═══██╗██║██║╚████║░░░██║░░░ ║
║ ╚█████╔╝██████╔╝██║██║░╚███║░░░██║░░░ ║
║ ░╚════╝░╚═════╝░╚═╝╚═╝░░╚══╝░░░╚═╝░░░ ║
║ P R O F I L E R v1.1 ║
║ Telegram: @Delix0_Tgk ║
╚═══════════════════════════════════════════════╝
Профессиональная система сбора, анализа и визуализации OSINT-данных с генерацией интерактивных HTML-отчётов в стиле dark cyberpunk
OSINT Profiler — это продвинутый инструмент для специалистов по информационной безопасности, журналистов-расследователей и OSINT-аналитиков. Система позволяет структурировано собирать, хранить и анализировать открытые данные (Open Source Intelligence), создавая детальные профили объектов исследования с последующей генерацией профессиональных визуальных отчётов.
git clone https://github.com/Delix0/OSINT-Profiler.git
cd OSINT-Profiler
pip install -r requirements.txt
python main.py
# В CLI выберите опцию [1] Создать новую цель
# Заполните базовые данные:
# - ФИО: Иванов Иван Иванович
# - Дата рождения: 1990-01-15
# - Теги: test, demo
# Генерация отчёта:
# [4] Генерировать отчёт → введите ID цели
# Готово! Откройте output/target_XXX.html в браузере
# requirements.txt
jinja2>=3.1.0 # Шаблонизатор HTML
rich>=13.0.0 # Красивый CLI
pydantic>=2.0.0 # Валидация данных
python-dateutil>=2.8.0 # Работа с датами
pyyaml>=6.0 # Конфигурация
typer>=0.9.0 # CLI фреймворк (опционально)
# 1. Создайте виртуальное окружение (рекомендуется)
python -m venv venv
# 2. Активируйте окружение
# Windows:
venv\Scripts\activate
# Linux/macOS:
source venv/bin/activate
# 3. Установите зависимости
pip install -r requirements.txt
# 4. Проверка установки
python main.py --version
# Скоро будет добавлено
docker build -t osint-profiler .
docker run -it osint-profiler
После запуска python main.py вы увидите главное меню:
╔═══════════════════════════════════════════════╗
║ OSINT PROFILER v2.0 ║
║ Главное меню ║
╠═══════════════════════════════════════════════╣
║ [1] 🎯 Создать новую цель ║
║ [2] 📋 Просмотреть все цели ║
║ [3] ✏️ Редактировать цель ║
║ [4] 📊 Генерировать отчёт ║
║ [5] 🚀 Генерировать все отчёты ║
║ [6] 🗑️ Удалить цель ║
║ [7] 🔍 Поиск по базе ║
║ [8] 💾 Экспорт/Импорт ║
║ [9] ⚙️ Настройки ║
║ [0] ❌ Выход ║
╚═══════════════════════════════════════════════╝
┌─ Персональная информация ─────────────────────┐
│ │
│ Полное имя: Иванов Иван Иванович │
│ Дата рождения: 1990-01-15 │
│ Место рождения: Москва, Россия │
│ Пол: [M/F/Other]: M │
│ Псевдонимы (через запятую): ivan90, vanya │
│ │
└───────────────────────────────────────────────┘
┌─ Контакты ────────────────────────────────────┐
│ │
│ Телефоны (по одному на строку): │
│ +7-900-123-45-67 │
│ +7-495-987-65-43 │
│ │
│ Email адреса: │
│ ivan@example.com │
│ ivan.ivanov@company.ru │
│ │
│ Мессенджеры: │
│ Telegram: @ivan_tg │
│ WhatsApp: +7-900-123-45-67 │
│ Skype: ivan.ivanov │
│ │
└───────────────────────────────────────────────┘
┌─ Социальные сети ─────────────────────────────┐
│ │
│ [1] ВКонтакте │
│ URL: vk.com/ivan90 │
│ Username: ivan90 │
│ Подписчики: 1523 │
│ Активность: высокая │
│ │
│ [2] Instagram │
│ URL: instagram.com/ivan_official │
│ Username: ivan_official │
│ Подписчики: 4521 │
│ Публикаций: 234 │
│ │
│ Добавить ещё? [y/n]: n │
└───────────────────────────────────────────────┘
┌─ Семья ───────────────────────────────────────┐
│ │
│ [1] Мать │
│ ФИО: Иванова Мария Петровна │
│ Дата рождения: 1965-05-10 │
│ Профессия: Учитель │
│ │
│ [2] Отец │
│ ФИО: Иванов Иван Сергеевич │
│ Дата рождения: 1963-08-22 │
│ Профессия: Инженер │
│ │
│ Добавить ещё? [y/n]: n │
└───────────────────────────────────────────────┘
┌─ Образование ─────────────────────────────────┐
│ │
│ [1] Среднее образование │
│ Учреждение: Школа №15, Москва │
│ Период: 1997-2007 │
│ Специальность: общее │
│ │
│ [2] Высшее образование │
│ Учреждение: МГУ им. Ломоносова │
│ Период: 2007-2012 │
│ Специальность: Информатика │
│ Степень: Бакалавр │
│ │
└───────────────────────────────────────────────┘
┌─ Трудовая деятельность ───────────────────────┐
│ │
│ [1] Текущее место работы │
│ Компания: ООО "ТехноСофт" │
│ Должность: Senior Developer │
│ Период: 2018 - настоящее время │
│ Описание: Разработка веб-приложений │
│ │
│ [2] Предыдущая работа │
│ Компания: ЗАО "СофтЛаб" │
│ Должность: Junior Developer │
│ Период: 2012-2018 │
│ │
└───────────────────────────────────────────────┘
┌─ Адреса проживания ───────────────────────────┐
│ │
│ [1] Текущий адрес │
│ Адрес: г. Москва, ул. Ленина, д. 10, кв. 5 │
│ Координаты: 55.7558, 37.6173 │
│ Период: 2015 - настоящее время │
│ Тип: постоянное место жительства │
│ │
│ [2] Предыдущий адрес │
│ Адрес: г. Москва, ул. Пушкина, д. 25 │
│ Координаты: 55.7412, 37.6177 │
│ Период: 2007-2015 │
│ Тип: студенческое общежитие │
│ │
└───────────────────────────────────────────────┘
┌─ Известные связи ─────────────────────────────┐
│ │
│ [1] Петров Пётр Петрович │
│ Тип связи: друг │
│ Период знакомства: с 2005 │
│ Контекст: учились вместе в школе │
│ │
│ [2] Сидоров Сидор Сидорович │
│ Тип связи: коллега │
│ Период знакомства: с 2012 │
│ Контекст: работали вместе в СофтЛаб │
│ │
└───────────────────────────────────────────────┘
┌─ Важные события ──────────────────────────────┐
│ │
│ [1] 1990-01-15 │
│ Событие: Дата рождения │
│ Описание: Родился в Москве │
│ │
│ [2] 2012-06-25 │
│ Событие: Окончание университета │
│ Описание: Получил диплом МГУ │
│ │
│ [3] 2015-03-10 │
│ Событие: Переезд │
│ Описание: Купил квартиру на ул. Ленина │
│ │
└───────────────────────────────────────────────┘
┌─ Классификация ───────────────────────────────┐
│ │
│ Теги (через запятую): │
│ IT, developer, Moscow, public_figure │
│ │
│ Заметки: │
│ Активно использует социальные сети. │
│ Регулярно публикует технические статьи │
│ на профессиональных форумах. Участвует │
│ в open-source проектах на GitHub. │
│ │
└───────────────────────────────────────────────┘
После заполнения данных:
# Выберите опцию [4] Генерировать отчёт
# Введите ID цели (например: target_001)
✓ Загрузка данных цели...
✓ Рендеринг HTML-шаблона...
✓ Встраивание стилей и скриптов...
✓ Генерация интерактивных компонентов...
✓ Сохранение отчёта...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✨ Отчёт успешно создан!
📁 Файл: output/target_001_Ivanov_Ivan.html
📊 Размер: 2.4 MB
⏱️ Время генерации: 1.3 сек
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Откройте файл в браузере — отчёт полностью автономный!
osint-profiler/
│
├── 📁 core/ # Ядро системы
│ ├── __init__.py
│ └── data_manager.py # CRUD операции с БД
│
├── 📁 data/ # Хранилище данных
│ ├── database.json # Основная БД (JSON)
│ └── backups/ # Резервные копии
│
├── 📁 templates/ # HTML-шаблоны
│ └── report.html # Основной шаблон отчёта
│
├── 📁 static/ # Статические файлы
│ ├── css/
│ │ └── style.css # Основные стили
│ ├── js/
│ │ ├── network-graph.js # Граф связей (vis.js)
│ │ └── map.js # Карта (Leaflet.js)
│
├── 📁 output/ # Сгенерированные отчёты
│ └── .gitkeep
│
├── main.py # Точка входа (CLI)
├── generator.py # Скрипт генерации
├── demo.py # Демо-данные
├── requirements.txt # Зависимости Python
├── .gitignore # Git ignore
└── README.md # Этот файл
┌─────────────────────────────────────────────────────────┐
│ CLI Interface │
│ (Rich UI + Typer) │
└──────────────────────┬──────────────────────────────────┘
│
┌───────────┴───────────┐
│ │
┌──────────▼───────────┐ ┌──────▼──────────┐
│ Data Manager │ │ Generators │
│ (CRUD + Search) │ │ (HTML/PDF/JSON) │
└──────────┬───────────┘ └──────┬──────────┘
│ │
│ ┌─────────────────┤
│ │ │
┌──────────▼─────▼─┐ ┌──────▼──────────┐
│ JSON Database │ │ Templates │
│ (database.json) │ │ (Jinja2) │
└──────────────────┘ └──────────────────┘
User Input → CLI Forms → Validators → Data Manager → JSON DB
│
▼
User Request → Generator ← Templates ← Data Manager ← JSON DB
│
▼
HTML Report (output/)
Управление базой данных целей.
from core.data_manager import DataManager
# Инициализация
dm = DataManager(db_path="data/database.json")
# Создание цели
target_data = {
"personal": {
"full_name": "Иванов Иван Иванович",
"birth_date": "1990-01-15",
"birth_place": "Москва, Россия"
},
"tags": ["test", "demo"],
"notes": "Тестовый профиль"
}
target_id = dm.create_target(target_data)
print(f"Создана цель: {target_id}") # target_001
# Получение цели
target = dm.get_target("target_001")
print(target["personal"]["full_name"]) # Иванов Иван Иванович
# Обновление цели
dm.update_target("target_001", {
"notes": "Обновлённая заметка"
})
# Удаление цели
dm.delete_target("target_001")
# Получение всех целей
all_targets = dm.get_all_targets()
print(f"Всего целей: {len(all_targets)}")
# Поиск
results = dm.search_targets(query="Иван", fields=["personal.full_name"])
for target in results:
print(target["id"], target["personal"]["full_name"])
Методы:
create_target(data: dict) -> str — создать новую цельget_target(target_id: str) -> dict — получить цель по IDupdate_target(target_id: str, data: dict) -> bool — обновить цельdelete_target(target_id: str) -> bool — удалить цельget_all_targets() -> list — получить все целиsearch_targets(query: str, fields: list = None) -> list — поискexport_to_json(filepath: str) -> bool — экспорт в JSONimport_from_json(filepath: str) -> int — импорт из JSONГенерация HTML/PDF отчётов.
from generators.html_generator import ReportGenerator
# Инициализация
gen = ReportGenerator(
template_dir="templates",
output_dir="output"
)
# Генерация отчёта для одной цели
output_path = gen.generate_report("target_001")
print(f"Отчёт создан: {output_path}")
# Генерация отчётов для всех целей
paths = gen.generate_all_reports()
print(f"Создано {len(paths)} отчётов")
# Кастомная генерация
output = gen.generate_report(
target_id="target_001",
template="custom_template.html",
theme="light" # вместо dark
)
# Предпросмотр (только HTML-код)
html_code = gen.preview_report("target_001")
print(html_code[:500]) # первые 500 символов
Методы:
generate_report(target_id: str, **kwargs) -> str — генерация отчётаgenerate_all_reports() -> list — генерация всех отчётовpreview_report(target_id: str) -> str — превью HTMLexport_to_pdf(target_id: str) -> str — экспорт в PDFВалидация данных через Pydantic.
from core.validators import TargetSchema, PersonalInfoSchema
# Валидация персональных данных
personal = PersonalInfoSchema(
full_name="Иванов Иван Иванович",
birth_date="1990-01-15",
gender="male"
)
# Валидация полной цели
target = TargetSchema(
personal=personal,
tags=["test", "demo"]
)
# Автоматическая валидация
try:
validated = TargetSchema(**raw_data)
except ValidationError as e:
print(e.json())
{
"id": "target_001",
"created_at": "2025-02-11T12:00:00Z",
"updated_at": "2025-02-11T12:30:00Z",
"personal": {
"full_name": "Иванов Иван Иванович",
"birth_date": "1990-01-15",
"birth_place": "Москва, Россия",
"gender": "male",
"aliases": ["ivan90", "vanya_ivanov"],
"photo_url": "https://example.com/photo.jpg"
},
"contacts": {
"phones": [
{
"number": "+7-900-123-45-67",
"type": "mobile",
"verified": true
}
],
"emails": [
{
"address": "ivan@example.com",
"type": "personal",
"verified": true
}
],
"messengers": {
"telegram": "@ivan_tg",
"whatsapp": "+7-900-123-45-67",
"skype": "ivan.ivanov"
}
},
"social_media": [
{
"platform": "vk",
"url": "https://vk.com/ivan90",
"username": "ivan90",
"followers": 1523,
"following": 342,
"posts": 567,
"verified": false,
"activity": "high",
"last_active": "2025-02-10"
}
],
"family": [
{
"relation": "mother",
"full_name": "Иванова Мария Петровна",
"birth_date": "1965-05-10",
"occupation": "Учитель",
"contact": "+7-900-111-22-33"
}
],
"education": [
{
"institution": "МГУ им. Ломоносова",
"degree": "Бакалавр",
"field": "Информатика",
"start_date": "2007-09-01",
"end_date": "2012-06-30",
"location": "Москва, Россия"
}
],
"employment": [
{
"company": "ООО ТехноСофт",
"position": "Senior Developer",
"start_date": "2018-03-01",
"end_date": null,
"location": "Москва, ул. Ленина, 10",
"description": "Разработка веб-приложений"
}
],
"addresses": [
{
"address": "г. Москва, ул. Ленина, д. 10, кв. 5",
"type": "residence",
"coordinates": {
"lat": 55.7558,
"lng": 37.6173
},
"start_date": "2015-03-10",
"end_date": null,
"verified": true
}
],
"connections": [
{
"name": "Петров Пётр Петрович",
"relation_type": "friend",
"context": "Учились вместе в школе",
"since": "2005-09-01",
"strength": "strong",
"target_id": "target_002"
}
],
"timeline": [
{
"date": "1990-01-15",
"event": "birth",
"title": "Дата рождения",
"description": "Родился в Москве"
}
],
"tags": ["IT", "developer", "Moscow", "public"],
"notes": "Активно использует социальные сети..."
}
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
string | ✅ | Уникальный ID (auto) |
created_at |
datetime | ✅ | Дата создания (auto) |
updated_at |
datetime | ✅ | Дата обновления (auto) |
personal.full_name |
string | ✅ | ФИО |
personal.birth_date |
date | ❌ | Дата рождения |
contacts.phones |
array | ❌ | Телефоны |
social_media |
array | ❌ | Соцсети |
tags |
array | ❌ | Метки |
| **📊 Профиль-карточка** Основная информация с фото, статистикой и тегами | **🗺️ Интерактивная карта** Все адреса с кластеризацией и временной линией |
| **🕸️ Граф связей** Визуализация социальной сети и контактов | **⏱️ Временная линия** Хронология событий жизни |
Посмотрите живой пример отчёта (демо-данные).
/* Dark Cyberpunk Theme */
:root {
--primary-neon: #00ff9f; /* Основной неон */
--secondary-neon: #00d9ff; /* Вторичный неон */
--accent-neon: #ff006e; /* Акцент */
--bg-dark: #0a0e27; /* Фон */
--bg-card: #141b3b; /* Карточки */
--text-primary: #e0e6f7; /* Текст */
--text-secondary: #8892b0; /* Вторичный текст */
}
/* Глитч-эффект */
.glitch {
animation: glitch 1s linear infinite;
}
/* Неоновое свечение */
.neon-glow {
text-shadow:
0 0 5px var(--primary-neon),
0 0 10px var(--primary-neon),
0 0 20px var(--primary-neon);
}
# CLI меню → [8] Экспорт/Импорт
# Экспорт всей базы в JSON
[1] Экспорт базы данных → export_2025_02_11.json
# Экспорт одной цели в JSON
[2] Экспорт цели → target_001.json
# Импорт из JSON
[3] Импорт из JSON → import_file.json
# Экспорт в CSV (все цели)
[4] Экспорт в CSV → database_export.csv
Программно:
from core.data_manager import DataManager
dm = DataManager()
# Экспорт
dm.export_to_json("backup.json")
dm.export_to_csv("data.csv")
# Импорт
count = dm.import_from_json("backup.json")
print(f"Импортировано {count} целей")
from core.data_manager import DataManager
dm = DataManager()
# Создать backup
backup_path = dm.create_backup()
print(f"Backup: {backup_path}") # data/backups/backup_2025_02_11_123045.json
# Восстановить из backup
dm.restore_from_backup("data/backups/backup_2025_02_11_123045.json")
# Автоматический backup при каждом изменении
dm.auto_backup = True # По умолчанию включено
from core.search_engine import SearchEngine
se = SearchEngine()
# Поиск по нескольким полям
results = se.search(
query="Иван",
fields=["personal.full_name", "personal.aliases"]
)
# Поиск с фильтрами
results = se.advanced_search(
filters={
"tags": {"$contains": "IT"},
"personal.birth_date": {"$gte": "1990-01-01"},
"addresses": {"$exists": True}
}
)
# Regex поиск
results = se.regex_search(
pattern=r"ivan\d+",
field="social_media.username"
)
# Fuzzy search (опечатки)
results = se.fuzzy_search(
query="Iwan Iwanov", # опечатка
threshold=0.8
)
from generators.html_generator import ReportGenerator
gen = ReportGenerator()
# Генерация всех отчётов с прогресс-баром
paths = gen.generate_all_reports(show_progress=True)
# Генерация с фильтром
paths = gen.generate_filtered_reports(
filter_func=lambda t: "IT" in t.get("tags", [])
)
# Асинхронная генерация (быстрее)
import asyncio
async def generate_async():
paths = await gen.generate_all_async()
return paths
asyncio.run(generate_async())
data/database.jsondata/database.json в .gitignorefrom core.encryption import DatabaseEncryption
# Включение шифрования
enc = DatabaseEncryption(password="your_secure_password")
# Зашифровать базу
enc.encrypt_database("data/database.json")
# Расшифровать
enc.decrypt_database("data/database.json.encrypted")
# Использование в DataManager
dm = DataManager(
db_path="data/database.json",
encryption=True,
password="your_password"
)
from core.data_manager import DataManager
dm = DataManager(hash_sensitive_fields=True)
# При создании цели телефоны/email будут захешированы
target_data = {
"contacts": {
"phones": ["+7-900-123-45-67"], # Сохранится как SHA256 хеш
"emails": ["ivan@example.com"] # Тоже хеш
}
}
target_id = dm.create_target(target_data)
output/pip install -r requirements-dev.txt
# Включает:
# - pytest (тестирование)
# - black (форматирование)
# - flake8 (линтинг)
# - mypy (type checking)
# - pre-commit (git hooks)
# Все тесты
pytest
# С покрытием
pytest --cov=core --cov=generators
# Конкретный тест
pytest tests/test_data_manager.py::test_create_target
# Verbose
pytest -v
# Форматирование кода
black .
# Линтинг
flake8 core/ generators/
# Type checking
mypy core/
# Установка hooks
pre-commit install
# Запуск вручную
pre-commit run --all-files
# generators/custom_generator.py
from generators.base import BaseGenerator
class CustomGenerator(BaseGenerator):
"""Кастомный генератор отчётов."""
def generate(self, target_id: str) -> str:
"""Генерация кастомного отчёта."""
target = self.data_manager.get_target(target_id)
# Ваша логика
output = self.render_template(
"custom_template.html",
target=target
)
# Сохранение
output_path = self.save_report(
content=output,
filename=f"custom_{target_id}.html"
)
return output_path
Этот проект использует следующие библиотеки:
Спасибо всем контрибьюторам и OSINT-сообществу! ❤️
MIT License
Copyright (c) 2025 Delix0
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Если проект помог вам — поставьте ⭐ на GitHub!
Также можете: