# 🔍 PhotoHunt OSINT
[](https://pypi.org/project/photohunt-osint/)
[](https://pypi.org/project/photohunt-osint/)
[](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[](https://pypi.org/project/photohunt-osint/)\n[](https://pypi.org/project/photohunt-osint/)\n[](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"
}