ALW1EZ/PANO

GitHub: ALW1EZ/PANO

一个基于 Python 和 Qt 的桌面化 OSINT 调查平台,通过图形与时间线融合 AI 辅助发现数据中的隐藏关联。

Stars: 422 | Forks: 54

# PANO - 平台分析与网络运营
![PANO Logo](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/14cae4672a215636.png) [![License: CC BY-NC](https://img.shields.io/badge/License-CC%20BY--NC-lightgrey.svg)](https://creativecommons.org/licenses/by-nc/4.0/) [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/) [![PySide6](https://img.shields.io/badge/GUI-PySide6-brightgreen.svg)](https://wiki.qt.io/Qt_for_Python) [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux-orange.svg)](https://github.com/ALW1EZ/PANO/) **PANO** 是一个功能强大的 OSINT 调查平台,结合了图形可视化、时间线分析和 AI 工具,帮助你发现数据中的隐藏联系和模式。 [开始使用](#getting-started) • [功能特性](#features) • [文档](#development-guide) • [贡献指南](#contributing) https://github.com/user-attachments/assets/6b95e97a-ffdd-4056-b12b-f268d8e5d565 https://github.com/user-attachments/assets/af0c0f65-7b79-417c-a678-a789d42a6003 https://github.com/user-attachments/assets/568b4c28-be78-4559-a607-899fca2f9613 https://github.com/user-attachments/assets/6aa191eb-09de-41d5-b96f-4a2e32d6a0c2 https://github.com/user-attachments/assets/96377b80-e137-4eb4-9387-a0db4e49c2c1 https://github.com/user-attachments/assets/4228bda0-6c13-4ea9-bc07-d87abe367e10
## 🚀 开始使用 1. 克隆仓库: git clone https://github.com/ALW1EZ/PANO.git cd PANO 2. 运行应用程序: - Linux:`./start_pano.sh` - Windows:`start_pano.bat` 启动脚本将自动执行以下操作: - 检查更新 - 设置 Python 环境 - 安装依赖项 - 启动 PANO 要使用 Email Lookup 转换 你需要先登录 GHunt。 通过启动脚本启动 PANO 后: 1. 手动选择虚拟环境 - Linux:`source venv/bin/activate` - Windows:`call venv\Scripts\activate` 2. 查看登录指南 [这里](https://github.com/mxrch/GHunt/?tab=readme-ov-file#login) ## 💡 快速入门指南 1. **创建调查**:新建调查或加载现有调查 2. **添加实体**:将实体从侧边栏拖放到图形中 3. **发现联系**:使用转换自动查找关系 4. **分析**:使用时间线和地图视图理解模式 5. **保存**:导出调查以便后续使用 ## 🔍 功能特性 ### 🕸️ 核心功能 - **交互式图形可视化** - 拖放实体创建 - 多种布局算法(圆形、层次、径向、力导向) - 动态关系映射 - 视觉节点和边样式设置 - **时间线分析** - 时间顺序事件可视化 - 交互式时间线导航 - 事件过滤和分组 - 时间关系分析 - **地图集成** - 地理数据可视化 - 基于位置的分析 - 交互式地图功能 - 坐标绘制和跟踪 ### 🎯 实体管理 - **支持的实体类型** - 📧 电子邮件地址 - 👤 用户名 - 🌐 网站 - 🖼️ 图像 - 📍 位置 - ⏰ 事件 - 📝 文本内容 - **自定义实体类型** ### 🔄 转换系统 - **电子邮件分析** - Google 账户调查 - 日历事件提取 - 位置历史分析 - 关联服务发现 - **用户名分析** - 跨平台用户名搜索 - 社交媒体资料发现 - 平台关联 - 网络存在分析 - **图像分析** - 反向图像搜索 - 视觉内容分析 - 元数据提取 - 相关图像发现 ### 🤖 AI 集成 - **PANAI** - 自然语言调查助手 - 自动实体提取和关系映射 - 模式识别和异常检测 - 多语言支持 - 上下文感知建议 - 时间线和图形分析 ## 🧩 核心组件 ### 📦 实体 实体是 PANO 的基本构建块。它们代表可以连接和分析的信息片段: - **内置类型** - 📧 电子邮件:带服务检测的电子邮件地址 - 👤 用户名:社交媒体和平台用户名 - 🌐 网站:带元数据的网页 - 🖼️ 图像:带 EXIF 和分析的图像 - 📍 位置:地理坐标和地址 - ⏰ 事件:基于时间的事件 - 📝 文本:通用文本内容 - **属性系统** - 类型安全的属性验证 - 自动属性获取 - 动态属性更新 - 自定义属性类型 - 元数据支持 ### ⚡ 转换 转换是处理实体以发现新信息和关系的自动化操作: - **操作类型** - 🔍 发现:从现有实体中查找新实体 - 🔗 关联:连接相关实体 - 📊 分析:从实体数据中提取洞察 - 🌐 OSINT:收集开源情报 - 🔄 丰富:为现有实体添加数据 - **特性** - 异步操作支持 - 进度跟踪 - 错误处理 - 速率限制 - 结果验证 ### 🛠️ 辅助工具 辅助工具是为特定调查任务提供专用 UI 的工具: - **可用辅助工具** - 🔍 交叉询问:分析和陈述证词 - 👤 肖像创建:生成面部合成图 - 📸 媒体分析器:高级图像处理和分析 - 🔍 基础搜索:搜索附近兴趣点 - 🔄 翻译器:翻译文本 - **辅助工具特性** - 自定义 Qt 界面 - 实时更新 - 图形集成 - 数据可视化 - 导出能力 ## 📖 开发指南
点击展开开发文档 ### 系统要求 - 操作系统:Windows 或 Linux - Python 3.11+ - PySide6 用于 GUI - 联网以使用在线功能 ### 自定义实体 实体是 PANO 的核心数据结构。每个实体代表具有特定属性和行为的信息片段。要创建自定义实体: 1. 在 `entities` 文件夹中创建新文件(例如:`entities/phone_number.py`) 2. 实现你的实体类: ``` from dataclasses import dataclass from typing import ClassVar, Dict, Any from .base import Entity @dataclass class PhoneNumber(Entity): name: ClassVar[str] = "Phone Number" description: ClassVar[str] = "A phone number entity with country code and validation" def init_properties(self): """Initialize phone number properties""" self.setup_properties({ "number": str, "country_code": str, "carrier": str, "type": str, # mobile, landline, etc. "verified": bool }) def update_label(self): """Update the display label""" self.label = self.format_label(["country_code", "number"]) ``` ### 自定义转换 转换是处理实体并生成新洞察或关系的操作。要创建自定义转换: 1. 在 `transforms` 文件夹中创建新文件(例如:`transforms/phone_lookup.py`) 2. 实现你的转换类: ``` from dataclasses import dataclass from typing import ClassVar, List from .base import Transform from entities.base import Entity from entities.phone_number import PhoneNumber from entities.location import Location from ui.managers.status_manager import StatusManager @dataclass class PhoneLookup(Transform): name: ClassVar[str] = "Phone Number Lookup" description: ClassVar[str] = "Lookup phone number details and location" input_types: ClassVar[List[str]] = ["PhoneNumber"] output_types: ClassVar[List[str]] = ["Location"] async def run(self, entity: PhoneNumber, graph) -> List[Entity]: if not isinstance(entity, PhoneNumber): return [] status = StatusManager.get() operation_id = status.start_loading("Phone Lookup") try: # Your phone number lookup logic here # Example: query an API for phone number details location = Location(properties={ "country": "Example Country", "region": "Example Region", "carrier": "Example Carrier", "source": "PhoneLookup transform" }) return [location] except Exception as e: status.set_text(f"Error during phone lookup: {str(e)}") return [] finally: status.stop_loading(operation_id) ``` ### 自定义辅助工具 辅助工具是通过专用 UI 提供额外调查能力的工具。要创建自定义辅助工具: 1. 在 `helpers` 文件夹中创建新文件(例如:`helpers/data_analyzer.py`) 2. 实现你的辅助工具类: ``` from PySide6.QtWidgets import ( QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QTextEdit, QLabel, QComboBox ) from .base import BaseHelper from qasync import asyncSlot class DummyHelper(BaseHelper): """A dummy helper for testing""" name = "Dummy Helper" description = "A dummy helper for testing" def setup_ui(self): """Initialize the helper's user interface""" # Create input text area self.input_label = QLabel("Input:") self.input_text = QTextEdit() self.input_text.setPlaceholderText("Enter text to process...") self.input_text.setMinimumHeight(100) # Create operation selector operation_layout = QHBoxLayout() self.operation_label = QLabel("Operation:") self.operation_combo = QComboBox() self.operation_combo.addItems(["Uppercase", "Lowercase", "Title Case"]) operation_layout.addWidget(self.operation_label) operation_layout.addWidget(self.operation_combo) # Create process button self.process_btn = QPushButton("Process") self.process_btn.clicked.connect(self.process_text) # Create output text area self.output_label = QLabel("Output:") self.output_text = QTextEdit() self.output_text.setReadOnly(True) self.output_text.setMinimumHeight(100) # Add widgets to main layout self.main_layout.addWidget(self.input_label) self.main_layout.addWidget(self.input_text) self.main_layout.addLayout(operation_layout) self.main_layout.addWidget(self.process_btn) self.main_layout.addWidget(self.output_label) self.main_layout.addWidget(self.output_text) # Set dialog size self.resize(400, 500) @asyncSlot() async def process_text(self): """Process the input text based on selected operation""" text = self.input_text.toPlainText() operation = self.operation_combo.currentText() if operation == "Uppercase": result = text.upper() elif operation == "Lowercase": result = text.lower() else: # Title Case result = text.title() self.output_text.setPlainText(result) ```
## 📄 许可证 本项目根据知识共享署名-非商业性使用(CC BY-NC)许可证授权。 **你可以自由:** - ✅ 分享:复制和重新分发材料 - ✅ 改编: remix、转换并基于材料构建 **在以下条款下:** - ℹ️ 署名:必须提供适当署名 - 🚫 非商业性:不得用于商业目的 - 🔓 无附加限制 ## 🙏 感谢 特别感谢所有库作者和贡献者使本项目成为可能。 ## 👨‍💻 作者 由 ALW1EZ 创建,融入 AI ❤️
标签:AI辅助, BSD, ESC4, OSINT, PySide6, Python, Python 3.11, SEO, 二进制发布, 人工智能, 图可视化, 图形可视化, 威胁情报, 平台, 开发者工具, 开源工具, 情报收集, 数据关联, 数据关联分析, 数据挖掘, 无后门, 模式识别, 漏洞研究, 用户模式Hook绕过, 系统分析, 网络分析, 调查平台, 逆向工具, 链接发现, 黄金证书