photohunt-osint


Namephotohunt-osint JSON
Version 1.0.2 PyPI version JSON
download
home_pagehttps://github.com/IrenicFalcon/photohunt-osint
SummaryOSINT photo search for people based on Search4Faces
upload_time2025-02-08 01:02:24
maintainerNone
docs_urlNone
authorIrenicFalcon
requires_python>=3.6
licenseMIT
keywords osint photo search4faces search people
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 🔍 PhotoHunt OSINT

[![PyPI Version](https://img.shields.io/pypi/v/photohunt-osint)](https://pypi.org/project/photohunt-osint/)
[![Python Versions](https://img.shields.io/pypi/pyversions/photohunt-osint)](https://pypi.org/project/photohunt-osint/)
[![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)

**PhotoHunt OSINT** - современная библиотека для поиска лиц по открытым источникам. Идеально подходит для:
- Журналистских расследований 🕵️♂️
- Кибербезопасности 🔒 
- Социальных исследований 📊
- Поиска родственников 👪

## 🌟 Возможности
- 🚀 Асинхронный поиск
- 🔎 Поддержка 6 баз
- 🎭 Фильтрация полученных данных
- 📁 Экспорт в HTML/JSON/CSV/XLSX/TXT/XML
- 🌍 Локализация (RU/EN)

## 🗃️ Базы данных
| Название           | Кол-во лиц         | Точность | Период сбора данных         |
|----------------|---------------|----------|-----------------------------|
| `vk_wall`      | 1.11B         | 68.79%   | 2019-11 → 2020-11<br>2022-12 → 2023-01 |
| `vkok_avatar`  | 280.78M       | VK:37.90%<br>OK:40.19% | VK:2018-12 → 2019-06<br>OK:2019-06 → 2020-03 |
| `vkokn_avatar` | 312.96M       | VK:48.37%<br>OK:45.13% | VK:2022-09 → 2024-11*<br>OK:2022-09 → 2022-10 |
| `tt_avatar`    | 125.44M       | 10.52%   | 2021-03 → 2021-09           |
| `ch_avatar`    | 13.07M        | 8.94%    | 2021-05 → 2022-01           |
| `sb_photo`     | 55.74M        | 12.46%   | 2022-05 → 2022-08           |

<small>*Данные актуальны на 08.02.2025</small>

## 📦 Установка
```bash
pip install photohunt-osint
```

## 🔎 Принцип работы
1. **Загрузка фото** (локальные файлы/URL)
2. **Детекция лиц** с выделением характерных признаков
3. **Сравнение** с выбранной базой данных
4. **Ранжирование** результатов по точности совпадения

## 📌 Рекомендации
1. Используйте изображения с **четкой видимостью лиц**
2. Поддерживаемые форматы: JPEG, PNG
3. Размер изображения не более 25MB

## 🚀 Примеры использования

### Через класс PhotoHunt
```python
from photohunt import PhotoHunt
import asyncio

async def main(client):
    
    # Загрузка изображения
    upload_results = await client.upload_batch(["group_photo.jpg"])
        
    detect_results = []
    
    # Поиск по всем лицам на фото
    for result in upload_results:
        
        if not result.get("boundings"): continue
        
        red = await client.detect(
            query="vk_wall",
            filename=result["url"],
            boundings=result["boundings"],
            results=50
        )
            
        detect_results.extend(res)
        

    # Экспорт в Excel
    for i, detect_result in enumerate(detect_results, 1):
        
        client.export(results, {"xlsx": "report{i}.xlsx"})

if __name__ == "__main__":
    client = PhotoHunt()
    try:
        
        asyncio.run(main(client))
        
    finally:
        
        client.close()
```

### Через CLI
```bash
# Поиск по локальному изображению
photohunt -s photo.jpg -db vk_wall -r 150

# Пакетная обработка с фильтрами
photohunt -s "photos/*.jpg" \
  -db vkokn_avatar \
  -fl "age>=18" "city=Санкт-Петербург" \
  -o result \
  -f json
```

## 📊 Обработка результатов
### Структура данных
```python
{
    "profile": "https://vk.com/id1",
    "face": "https://i.search4faces.com/faces/vk01/.../example.jpg",
    "source": "https://sun9-33.userapi.com/.../example.jpg",
    "score": 60.72,
    "age": 40,
    "first_name": "Павел",
    "last_name": "Дуров",
    "maiden_name": "",
    "city": "Санкт-Петербург",
    "country": "Россия",
    "born": "10.10.1984",
    "bio": ""
}
```

### Методы анализа
```python
# Фильтрация результатов
high_confidence = [p for p in results if p['score'] > 75]

# Статистика по городам
from collections import Counter
cities = Counter(p["city"] for p in results)

# Экспорт контактов
contacts = [{'name': p["first_name"] +" " + p["last_name"], 'url': p["profile"]} for p in results]
```

## 📜 Лицензия
MIT License - подробности в файле [LICENSE](LICENSE)

---

## 👥 Контакты
- Email: whispjuxy@gmail.com
- KeyBase: [@lastobserver](https://keybase.io/lastobserver)

## 💖 Поддержать проект
Развитие инструмента поддерживается сообществом. Вы можете помочь: 

- **TON**: `UQCl6nBbfXaHz2Z4ka9QcTiPIEzVGY1Bwn9eDlBAgOUwKJp1`  
- **Bitcoin**: `1JnzRzZEXcKoT9echwfRrwGbWxLyLPo9Si`  
- **USDT TON**: `UQCl6nBbfXaHz2Z4ka9QcTiPIEzVGY1Bwn9eDlBAgOUwKJp1`

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/IrenicFalcon/photohunt-osint",
    "name": "photohunt-osint",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": "osint photo search4faces search people",
    "author": "IrenicFalcon",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/51/87/f42538b80e3a853d5b4fc8dde809ca0593e205885aa0a8e45e65088a05d2/photohunt_osint-1.0.2.tar.gz",
    "platform": null,
    "description": "# \ud83d\udd0d PhotoHunt OSINT\n\n[![PyPI Version](https://img.shields.io/pypi/v/photohunt-osint)](https://pypi.org/project/photohunt-osint/)\n[![Python Versions](https://img.shields.io/pypi/pyversions/photohunt-osint)](https://pypi.org/project/photohunt-osint/)\n[![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n**PhotoHunt OSINT** - \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043b\u0438\u0446 \u043f\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c. \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f:\n- \u0416\u0443\u0440\u043d\u0430\u043b\u0438\u0441\u0442\u0441\u043a\u0438\u0445 \u0440\u0430\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 \ud83d\udd75\ufe0f\u2642\ufe0f\n- \u041a\u0438\u0431\u0435\u0440\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \ud83d\udd12 \n- \u0421\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 \ud83d\udcca\n- \u041f\u043e\u0438\u0441\u043a\u0430 \u0440\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u043e\u0432 \ud83d\udc6a\n\n## \ud83c\udf1f \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438\n- \ud83d\ude80 \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a\n- \ud83d\udd0e \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 6 \u0431\u0430\u0437\n- \ud83c\udfad \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\n- \ud83d\udcc1 \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML/JSON/CSV/XLSX/TXT/XML\n- \ud83c\udf0d \u041b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f (RU/EN)\n\n## \ud83d\uddc3\ufe0f \u0411\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\n| \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435           | \u041a\u043e\u043b-\u0432\u043e \u043b\u0438\u0446         | \u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c | \u041f\u0435\u0440\u0438\u043e\u0434 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445         |\n|----------------|---------------|----------|-----------------------------|\n| `vk_wall`      | 1.11B         | 68.79%   | 2019-11 \u2192 2020-11<br>2022-12 \u2192 2023-01 |\n| `vkok_avatar`  | 280.78M       | VK:37.90%<br>OK:40.19% | VK:2018-12 \u2192 2019-06<br>OK:2019-06 \u2192 2020-03 |\n| `vkokn_avatar` | 312.96M       | VK:48.37%<br>OK:45.13% | VK:2022-09 \u2192 2024-11*<br>OK:2022-09 \u2192 2022-10 |\n| `tt_avatar`    | 125.44M       | 10.52%   | 2021-03 \u2192 2021-09           |\n| `ch_avatar`    | 13.07M        | 8.94%    | 2021-05 \u2192 2022-01           |\n| `sb_photo`     | 55.74M        | 12.46%   | 2022-05 \u2192 2022-08           |\n\n<small>*\u0414\u0430\u043d\u043d\u044b\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b \u043d\u0430 08.02.2025</small>\n\n## \ud83d\udce6 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n```bash\npip install photohunt-osint\n```\n\n## \ud83d\udd0e \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b\n1. **\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u043e\u0442\u043e** (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b/URL)\n2. **\u0414\u0435\u0442\u0435\u043a\u0446\u0438\u044f \u043b\u0438\u0446** \u0441 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432\n3. **\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435** \u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445\n4. **\u0420\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435** \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f\n\n## \ud83d\udccc \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438\n1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 **\u0447\u0435\u0442\u043a\u043e\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043b\u0438\u0446**\n2. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b: JPEG, PNG\n3. \u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 25MB\n\n## \ud83d\ude80 \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\n\n### \u0427\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0441\u0441 PhotoHunt\n```python\nfrom photohunt import PhotoHunt\nimport asyncio\n\nasync def main(client):\n    \n    # \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\n    upload_results = await client.upload_batch([\"group_photo.jpg\"])\n        \n    detect_results = []\n    \n    # \u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0432\u0441\u0435\u043c \u043b\u0438\u0446\u0430\u043c \u043d\u0430 \u0444\u043e\u0442\u043e\n    for result in upload_results:\n        \n        if not result.get(\"boundings\"): continue\n        \n        red = await client.detect(\n            query=\"vk_wall\",\n            filename=result[\"url\"],\n            boundings=result[\"boundings\"],\n            results=50\n        )\n            \n        detect_results.extend(res)\n        \n\n    # \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 Excel\n    for i, detect_result in enumerate(detect_results, 1):\n        \n        client.export(results, {\"xlsx\": \"report{i}.xlsx\"})\n\nif __name__ == \"__main__\":\n    client = PhotoHunt()\n    try:\n        \n        asyncio.run(main(client))\n        \n    finally:\n        \n        client.close()\n```\n\n### \u0427\u0435\u0440\u0435\u0437 CLI\n```bash\n# \u041f\u043e\u0438\u0441\u043a \u043f\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e\nphotohunt -s photo.jpg -db vk_wall -r 150\n\n# \u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438\nphotohunt -s \"photos/*.jpg\" \\\n  -db vkokn_avatar \\\n  -fl \"age>=18\" \"city=\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\" \\\n  -o result \\\n  -f json\n```\n\n## \ud83d\udcca \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432\n### \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\n```python\n{\n    \"profile\": \"https://vk.com/id1\",\n    \"face\": \"https://i.search4faces.com/faces/vk01/.../example.jpg\",\n    \"source\": \"https://sun9-33.userapi.com/.../example.jpg\",\n    \"score\": 60.72,\n    \"age\": 40,\n    \"first_name\": \"\u041f\u0430\u0432\u0435\u043b\",\n    \"last_name\": \"\u0414\u0443\u0440\u043e\u0432\",\n    \"maiden_name\": \"\",\n    \"city\": \"\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\",\n    \"country\": \"\u0420\u043e\u0441\u0441\u0438\u044f\",\n    \"born\": \"10.10.1984\",\n    \"bio\": \"\"\n}\n```\n\n### \u041c\u0435\u0442\u043e\u0434\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430\n```python\n# \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432\nhigh_confidence = [p for p in results if p['score'] > 75]\n\n# \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043f\u043e \u0433\u043e\u0440\u043e\u0434\u0430\u043c\nfrom collections import Counter\ncities = Counter(p[\"city\"] for p in results)\n\n# \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432\ncontacts = [{'name': p[\"first_name\"] +\" \" + p[\"last_name\"], 'url': p[\"profile\"]} for p in results]\n```\n\n## \ud83d\udcdc \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\nMIT License - \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 [LICENSE](LICENSE)\n\n---\n\n## \ud83d\udc65 \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u044b\n- Email: whispjuxy@gmail.com\n- KeyBase: [@lastobserver](https://keybase.io/lastobserver)\n\n## \ud83d\udc96 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\n\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u043c. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043c\u043e\u0447\u044c: \n\n- **TON**: `UQCl6nBbfXaHz2Z4ka9QcTiPIEzVGY1Bwn9eDlBAgOUwKJp1`  \n- **Bitcoin**: `1JnzRzZEXcKoT9echwfRrwGbWxLyLPo9Si`  \n- **USDT TON**: `UQCl6nBbfXaHz2Z4ka9QcTiPIEzVGY1Bwn9eDlBAgOUwKJp1`\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "OSINT photo search for people based on Search4Faces",
    "version": "1.0.2",
    "project_urls": {
        "Homepage": "https://github.com/IrenicFalcon/photohunt-osint"
    },
    "split_keywords": [
        "osint",
        "photo",
        "search4faces",
        "search",
        "people"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1ba6d4dd02561cd188c491aca709ec7bab6fe33bfcbdae5524bb04d1b9ff5f46",
                "md5": "e15f3f9ccefaf76d4ddfb8b8cd283e8d",
                "sha256": "763576202e6caa4dc13aa481618a65669b2c0fdde36aa3c1a24599d53426d186"
            },
            "downloads": -1,
            "filename": "photohunt_osint-1.0.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "e15f3f9ccefaf76d4ddfb8b8cd283e8d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 15361,
            "upload_time": "2025-02-08T01:02:23",
            "upload_time_iso_8601": "2025-02-08T01:02:23.369225Z",
            "url": "https://files.pythonhosted.org/packages/1b/a6/d4dd02561cd188c491aca709ec7bab6fe33bfcbdae5524bb04d1b9ff5f46/photohunt_osint-1.0.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5187f42538b80e3a853d5b4fc8dde809ca0593e205885aa0a8e45e65088a05d2",
                "md5": "7f1d27e0711836e6f2d5c2ca32adec82",
                "sha256": "c6ad43f4b6fc806effd82a1018266e7db8c60bbd5d1793d9349bd8ef07c87356"
            },
            "downloads": -1,
            "filename": "photohunt_osint-1.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "7f1d27e0711836e6f2d5c2ca32adec82",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 15627,
            "upload_time": "2025-02-08T01:02:24",
            "upload_time_iso_8601": "2025-02-08T01:02:24.807308Z",
            "url": "https://files.pythonhosted.org/packages/51/87/f42538b80e3a853d5b4fc8dde809ca0593e205885aa0a8e45e65088a05d2/photohunt_osint-1.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-02-08 01:02:24",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "IrenicFalcon",
    "github_project": "photohunt-osint",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "photohunt-osint"
}
        
Elapsed time: 0.50262s