anonymousRAID/OSINT-Mapping-Tool
GitHub: anonymousRAID/OSINT-Mapping-Tool
一个本地优先的OSINT映射工具,用于在浏览器中记录和关联开源情报数据,并通过地图可视化展示。
Stars: 46 | Forks: 8
# OSINT 映射工具
一个用于组织开源情报(OSINT)研究的小型网络应用。记录标识符(社交媒体账号、电话、车辆等),在地图上(Google 或 OpenStreetMap)标记地点,并将两者关联起来。所有数据均不会离开您的浏览器。
[](https://react.dev)
[](https://vitejs.dev)
[](LICENSE)
[](#隐私)
## 简介
### OSINT 映射工具如何工作?
**信息标签页**是一个节点图。每个节点代表一条信息:一个 Instagram 账号、一个电话号码、一个车牌号、一个家庭成员。将一个节点的连接手柄拖拽到另一个节点即可将它们关联。将连接线放置在空白处会自动创建一个已连接的新节点(类似 Blender 风格);右键单击也能实现同样效果,无需拖拽。每种类型都有自己专属的表单字段和品牌图标,您也可以上传自定义图标。
**地图标签页**是点击标记模式。在任意位置放置一个标记点,如果该地点被地理编码器识别(如咖啡店、学校、公园),其名称、地址和相应的图标会自动为您填充。还有一个搜索栏,可以按名称跳转到特定地点。标记点可以关联到标识符,例如一个咖啡店标记点可以附带“3月14日 @johndoe 在此打卡”,并关联相关的 Instagram 账号。通过齿轮图标可以选择 **Google Maps**(POI 数据更丰富,需要 API 密钥)或 **OpenStreetMap**(无需密钥,无需注册)。
所有数据都会保存为一个单独的 `.osint.json` 文件,您可以将其存储在任何地方、分享或进行版本控制。
## 截图


🛠 技术栈
|组件 |工具 |
|:---|:---|
| UI | React 18, Vite |
| 节点图 | [`@xyflow/react`](https://reactflow.dev) |
| 地图 | [`@vis.gl/react-google-maps`](https://visgl.github.io/react-google-maps/), [`leaflet`](https://leafletjs.com) + [`react-leaflet`](https://react-leaflet.js.org) |
| 状态管理 | React Context (无 Redux / 无状态库) |
| 存储 | 本地 JSON 文件(项目)+ `localStorage`(设置、自定义图标)|
🚀 开始使用
您需要 Node 18+ 和 npm。 ``` git clone https://github.com/anonymousRAID/OSINT-Mapping-Tool cd OSINT-Mapping-Tool npm install npm run dev ``` 然后打开## 设置 Google Maps(可选) 仅当您需要使用 Google Maps 模式时才需要此步骤。如果您希望完全跳过 Google Cloud,请直接跳转到 [OpenStreetMap 模式](#openstreetmap-mode)。您的密钥仅存在于浏览器中,永远不会被提交或发送到其他地方。 在 Google Cloud Console 中,选择或创建一个项目,然后: 1. 在 **API 和服务 → API 库** 中,启用 **Maps JavaScript API**、**Geocoding API** 和 **Places API**。Maps JS 是必需的;后两者用于地址自动填充和地点类型检测。 2. 在 **API 和服务 → 凭据** 中,创建一个 API 密钥。 3. 在该密钥上,设置 **应用限制 → HTTP 引荐来源网址**,并添加 `http://localhost:5173/*` 用于开发环境。这是密钥万一泄露时的唯一安全措施。 4. 可选:在 **地图管理 → 地图样式** 下创建一个 **Map ID** 以进行自定义样式设置。没有它,控制台会出现警告,但应用仍然正常工作。 向应用提供密钥的两种方式: **应用内:** 将其粘贴到地图标签页的设置界面并点击保存。它会被存入 `localStorage`。如果您之前在没有密钥的情况下继续操作,左上角的齿轮图标会打开相同的设置。 **配置文件:** 复制模板: ``` cp public/app.config.example.json public/app.config.json ``` 然后填入您的值: ``` { "googleMaps": { "apiKey": "AIzaSyD…", "mapId": "abc123def456…" } } ``` `public/app.config.json` 已被 git 忽略,因此即使推送提交,它也不会泄露。 如果两者都设置了,`localStorage` 优先。通过齿轮图标清除它,即可回退到使用文件。 ## OpenStreetMap 模式 不想处理 Google Cloud?打开地图标签页的设置(齿轮图标),将提供商切换为 **OpenStreetMap**。瓦片来自 openstreetmap.org,搜索/反向地理编码通过 Nominatim 运行。无需密钥,无需注册,免费使用。POI 检测比 Google 的粗略,每个标记点的信息卡中没有实时地点详情(评分、营业时间等)——其他一切功能都相同。 ## 保存、打开和“继续最近的项目”列表 工作时,应用会定期向 `localStorage` 保存快照。如果您不小心在未保存的情况下点击了后退箭头(我遇到过不止一次),项目会在登录界面的“继续最近的项目”下显示,并带有“未保存”标签。选择它,您就能回到之前的状态。每个浏览器最多保留 5 个最近项目。 `.osint.json` 也被 git 忽略,因此将其放入仓库文件夹不会出现在提交中。 ## 功能详解 ### 信息标签页 涵盖社交、联系、个人、车辆和其他类别的二十种内置标识符类型,每种都有自己的专属字段(Instagram:用户名、粉丝数、帖子数、个人简介;车辆:品牌、型号、年份、颜色、所有者;等等)。 连接方式: - 从一个节点拖拽连接手柄到另一个节点,将它们连接起来。 - 拖拽到空白处会弹出快速添加窗口(这也会自动创建到新节点的连接线)。 - 右键单击画布,可在不连接的情况下打开同样的弹出窗口。 图标: - 常见平台的品牌图标(Instagram, Facebook, X/Twitter, YouTube, TikTok, LinkedIn, Snapchat, Discord, Telegram, Google, Spotify, WhatsApp)。 - 可上传自定义图标。它们按浏览器存储,因此在相同安装下的所有项目中都可用。 编辑快捷键(在字段中输入或模态框打开时禁用): - `Ctrl/Cmd + Z` 撤销,`Ctrl/Cmd + Shift + Z` 或 `Ctrl/Cmd + Y` 重做。最多保存 20 个操作,保存在内存中。 - `Ctrl/Cmd + C / V` 复制/粘贴选中的节点。 - `Ctrl/Cmd + D` 复制节点。 - `Del` 或 `Backspace` 删除选中内容(一个节点或一条边)。 可通过框选或 `Shift+点击` 进行多选。对多选内容的任何操作都算作一次撤销步骤。 ### 地图标签页 在任意位置点击以放置标记点。如果该地点是已知地点——Google 模式下的 Google POI,OSM 模式下的 Nominatim 结果——其名称、地址和相应的图标会自动填充。否则,您将获得坐标并自行填写其余信息。 十种内置地点图标(咖啡、美食、健身房、家、电影、公园、游乐园、学校、购物、服装、图书馆),具有浅色和深色变体,会随主题切换。图标和颜色可以按标记点覆盖。 点击一个标记点会打开一张卡片,包含您的笔记(到访日期、同行人员、自由格式笔记)、关联的标识符以及指向实时地图的链接。在 Google 模式下,卡片还会显示 Google 记录的所有地点详情(评分、营业时间、电话、网站)。 侧边栏中的“连接标记点”开关可以按标记点放置的顺序在标记点之间绘制虚线。线条颜色可自定义。 ### 两个标签页的交叉链接 标记点可以关联到一个或多个标识符,每个关联都附有简短注释(如“在 IG 上打卡”、“注册车主”、“前地址”)。点击标记点卡片中的标识符芯片,可跳转到信息标签页并高亮该节点。将鼠标悬停在信息标签页侧边栏中的标识符上,地图上与之关联的标记点会闪烁。 ## 项目布局 ``` src/ components/ UI components (tabs, modals, pickers) context/ ProjectContext, NodeHistoryContext, NavigationContext, … images/ icons/ place-type pin icons (light + dark) node_icons/ brand icons for identifiers styles/ global + theme CSS utils/ projectIO, customIcons, appConfig, recentProjects identifierTypes.js identifier type registry + resolvers identifierIcons.js identifier brand-icon registry mapIcons.js place-type icon registry + Google-types mapping pinColors.js pin color palette App.jsx landing ↔ project view gate main.jsx provider stack + root render public/ app.config.example.json template for your API key (committed) app.config.json your real key (gitignored) ``` ## 隐私 本工具没有后端,也没有分析功能。在 Google 模式下,唯一的出站调用是浏览器使用您自己的密钥进行的瓦片/Places API 请求。在 OpenStreetMap 模式下,请求发送至 openstreetmap.org 获取瓦片,发送至 nominatim.openstreetmap.org 进行搜索——与您直接访问它们的网站时发出的请求相同。 您的设置和自定义图标库存储在此浏览器的 `localStorage` 中。项目文件 (`*.osint.json`) 保存在您指定的磁盘位置。要清除所有数据,请清除您运行该应用来源的站点数据,并删除 `.osint.json` 文件。 仓库的 `.gitignore` 文件会阻止 `app.config.json` 和 `*.osint.json` 被提交,因此即使您意外在克隆的文件夹内工作,也不会泄露您的密钥或研究数据。 ## 许可证 [GPL-3.0](LICENSE)。
标签:ESC4, OSINT, React, Syscalls, Vite, 地图标记, 地理信息, 情报研究, 映射工具, 本地优先, 标识符管理, 研究工具, 网络安全, 自定义脚本, 节点图, 隐私保护