kluter/ShadowFinder-Web

GitHub: kluter/ShadowFinder-Web

基于浏览器的照片影子分析定位工具。

Stars: 0 | Forks: 0

**通过影子长度在浏览器中定位照片。** `ShadowFinder Web` 是 Bellingcat 的 [**ShadowFinder**](https://github.com/bellingcat/ShadowFinder) 的基于浏览器的版本。从物体、其影子以及日期和时间,它绘制出地球上每个可能落下的影子位置。无需设置、账户、Jupyter 或 Colab。拖放一张图片,标记三个点,选择一个时间,点击计算。无需上传。无需服务器。一切都在您的浏览器中本地运行。 **[立即尝试 → kluter.github.io/ShadowFinder-Web](https://kluter.github.io/ShadowFinder-Web/)** ![ShadowFinder Web](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/eeb86c4015093958.png) ## 站在 Bellingcat 的肩膀上 如果没有 Bellingcat 的原始 [ShadowFinder](https://github.com/bellingcat/ShadowFinder),该项目将不会存在,它是由 Bellingcat 的 [**Galen Reich**](https://github.com/GalenReich) 创建的,贡献者包括 **Jordan Gillard**、**Thomas Ellmenreich** 和 **Boris Nezlobin**。他们完成了艰难的部分。`ShadowFinder Web` 是他们算法在 JS 中的忠实重实现。 如果您在研究中使用此工具,请引用原始项目。 ## 为什么移植它? 原始版本非常出色,但得到结果需要工作: A Google sign-in for Colab,使用一个 *单独的工具* 测量影子像素,然后将数字粘贴到代码单元格中。`ShadowFinder Web` 移除了这些步骤,并将方法封装在一个干净、引导式的界面中。 ## 与笔记本相比增加了什么 | 方面 | 原始笔记本 | `ShadowFinder Web` | |---|---|---| | **测量** | 一个单独的图像工具,然后粘贴数字 | 点击图像上的基础、顶部和影子尖端 | | **运行** | 编辑并运行代码单元格 | 一个引导式的五步界面 | | **日期和时间** | 输入它 | 输入它,或者如果存在,从 `EXIF` 自动填充 | | **不良几何形状** | 没有警告 | 实时阴影角度警告(实验性) | | **结果** | 一个静态的 `PNG` | 一个交互式地图(暗色、OpenStreetMap、卫星) | | **开始** | Colab 和 Google 登录 | 打开一个网页 | ## 关键要求 该工具评估物体到影子角度如下: | 角度,物体到影子 | 判定 | |---|---| | `88° to 98°` | 🟢 良好,可靠 | | `85° to 87°`,或 `99° to 109°` | 🟡 边界,可用 | | `< 85°` 或 `> 109` | 🔴 很可能错误 | 这些阈值是实验性的,由感觉而非严格测试设定。欢迎对它们进行改进的贡献。 ## 如何使用 1. **在左侧面板上**(或点击 *浏览*)拖放一张照片。 2. **标记三个点**:物体的底部、顶部,然后是影子尖端。 3. **设置日期和时间**(或点击 *使用此 `日期 & 时间`* 从 `EXIF`)。选择 **UTC** 或 **本地**。 4. **计算**。明亮的带状区域显示了该影子可能出现的每个位置。 ## 它是如何工作的 - 太阳位置来自 [SunCalc](https://github.com/mourner/suncalc),这是原始 `suncalc` 包的 JS 等价物。 - 世界在 `0.5 度网格`(纬度 -60 到 85)上采样。每个点的太阳高度给出预期的影子比例 `高度 / tan(高度)`,与您的进行比较。 - 在 **20% 带内**的点被绘制出来,匹配精确的地方最亮,与原始生成的相同带状区域。 - **本地模式**使用 Bellingcat 的 `timezone_grid.json` 在计算太阳之前将您的本地时间转换为 UTC 在每个点上。 与 [Original](https://github.com/bellingcat/ShadowFinder) 进行了检查:`高度 10`、`影子 8`、`2024-02-29 12:00 UTC` 重新生成了其 README 中的环。 一个故意的区别是投影:原始是一个静态的等角圆柱投影,而 `ShadowFinder Web` 使用了一个可缩放的 **Web Mercator** 地图,您可以将其放大。相同的带状区域,相同的数据,只是更靠近极地弯曲。平面的布局意味着要丢弃 Leaflet 的瓦片,这些瓦片仅限于 Web Mercator。 有关完整方法和示例,请参阅 [Bellingcat 的文章](https://www.bellingcat.com/resources/2024/08/22/shadow-geolocate-geolocation-locate-image-tool-open-source-bellingcat-measure/)。 ## 尝试自己操作 三个已知答案的案例: | 测试 | 日期和时间 | 预期 | |------|---------------|----------| | 手动输入:`高度 10`、`影子 8` | `2024-02-29 12:00:00 UTC` | 原始的 [README](https://github.com/bellingcat/ShadowFinder) 中的环 | | 一张 [晴朗的海滨图像](https://www.bellingcat.com/app/uploads/2024/08/image10.jpg) | `2024-07-10 10:30:46 UTC` | Bellingcat 的 [结果地图](https://www.bellingcat.com/app/uploads/2024/08/ShadowTool.png) | | 这张 [Rainbolt 视频](https://www.youtube.com/watch?v=pQIjDPFgdJA) 中的 [静止](assets/05_03_2024_111741_shadow_test_rainbolt.png) | `2024-05-03 11:17:41 本地` | 视频中揭示的 [结果](assets/result_shadow_test_rainbolt.png) | 请注意 Rainbolt 日期格式:视频将其写作 `05 03 2024`,月份在前,因此是 3 月 5 日,而不是 5 月 3 日。输入错误的一个会导致带状区域落在错误的位置。 | Rainbolt 的测试照片 | Rainbolt 的结果 | |---|---| | Test photo | ShadowFinder Web result | ## 本地运行 一个静态网站,没有构建步骤。使用任何东西来提供文件夹: ``` # 任何静态服务器都适用,例如 npx serve . # 或 VS Code 的 Live Server 扩展 ``` ## 隐私与透明度 您的照片永远不会离开您的浏览器。它被绘制到一个画布上,其 EXIF 被读取到内存中,没有上传,没有服务器。您可以自己确认:打开 DevTools (`F12`) → 网络,加载一张图片,并且没有请求携带它。任何 EXIF 文本在显示之前都会被转义,因此一个精心制作的文件无法注入任何内容。 唯一的出站请求是地图瓦片(CARTO、OpenStreetMap、Esri)和 Leaflet 库。唯一存储的是您选择的地图层,在 `localStorage` (`sf-tileset`) 中,没有图像数据,没有坐标。 ### 代码和依赖项 `ShadowFinder Web` 是纯 HTML、CSS 和 JavaScript,没有构建步骤。其逻辑位于 `js/script.js` 中,未压缩,因此您所读的就是运行的。 | 库 | 加载自 | 是否接触您的数据? | |---|---|---| | [Leaflet](https://leafletjs.com/) | CDN (unpkg) | 否,仅渲染地图瓦片 | | [SunCalc](https://github.com/mourner/suncalc) | 打包在 `js/` 中 | 仅本地,不通过网络 | | [exifr](https://github.com/MikeKovarik/exifr) | 打包在 `js/` 中 | 仅本地,不通过网络 | 只有 Leaflet 来自 CDN;将其替换为本地副本以完全离线运行。 它是在 AI 辅助下构建的,故意公开披露,因为 [不透明的 AI 生成 OSINT 工具的风险](https://www.dutchosintguy.com/post/vibe-coding-is-becoming-an-osint-risk) 是真实的。解决方案不是隐藏它,而是保持代码可读,以便任何人都可以验证它。 ### 安全注意事项 - **地图瓦片揭示了您查看的区域。**瓦片请求编码了地图坐标,因此瓦片服务器可以推断您正在查看的位置。如果这很重要,请使用 VPN。 - **一个 CDN 依赖项。**Leaflet 从 unpkg 加载。理论上,受损害的 CDN 可以提供恶意代码,但这极不可能;自托管 Leaflet 以排除所有可能性。 - **浏览器和操作系统信任。**如果您的浏览器或系统被破坏,没有任何网络应用程序可以保护您。 ## 相关 您可能还会喜欢 **[TracePoint](https://github.com/kluter/TracePoint)**,我的另一个基于浏览器的地理定位工具,这个是通过视线交点实现的,具有相同的暗色、无摩擦设计。
标签:Bellingcat, CMS安全, DNS解析, EXIF数据, JavaScript, 交互设计, 图像处理, 在线工具, 地理信息, 地理定位, 多模态安全, 开源项目, 影子分析, 数据可视化, 时间戳, 本地运行, 浏览器应用, 用户界面, 研究工具, 算法实现, 自定义脚本