w0wzahh/GeoChecker
GitHub: w0wzahh/GeoChecker
一款用于视频聊天平台的零依赖 Tampermonkey 脚本,通过拦截 WebRTC 流量实现实时的 IP 地理定位、网络诊断与威胁情报查询。
Stars: 0 | Forks: 0
# GeoChecker v5.0
**适用于视频聊天平台的实时 IP 地理定位与 WebRTC 分析工具。**
[](LICENSE)
[]()
[](https://www.tampermonkey.net/)
[]()
*无需 API key。无需注册。无需后端。安装即用。*
## 目录
- [概述](#overview)
- [功能](#features)
- [架构](#architecture)
- [安装说明](#installation)
- [方法 1:Tampermonkey 用户脚本(推荐)](#method-1-tampermonkey-userscript-recommended)
- [方法 2:控制台注入(一次性)](#method-2-console-injection-one-off)
- [用法](#usage)
- [支持的平台](#supported-platforms)
- [键盘快捷键](#keyboard-shortcuts)
- [Tampermonkey 菜单命令](#tampermonkey-menu-commands)
- [技术深入解析](#technical-deep-dive)
- [WebRTC 挂钩引擎](#webrtc-hooking-engine)
- [IP 提取流水线](#ip-extraction-pipeline)
- [统计数据收集](#stats-collection)
- [多 PC 处理](#multi-pc-handling)
- [项目结构](#project-structure)
- [技术栈](#tech-stack)
- [API 与数据源](#apis--data-sources)
- [自动更新系统](#auto-update-system)
- [更新日志](#changelog)
- [免责声明](#disclaimer)
## 概述
GeoChecker 挂钩到视频聊天平台上的 WebRTC 对等连接,提取对等端 IP 地址,并实时补充地理定位数据。所有信息都会显示在一个可拖拽的玻璃拟物化悬浮窗中,包含 10 个标签页,涵盖地理定位、网络诊断、威胁情报和 OSINT 查询。
它完全在您的浏览器中运行。没有服务器,没有数据库,没有 API key。它在原型级别拦截 ICE candidates,并在客户端查询免费的地理定位 API。离开您浏览器的唯一数据,就是视频聊天平台已经在交换的相同 ICE 流量。
### 为什么选择 GeoChecker?
| 问题 | GeoChecker 的应对方案 |
|---------|---------------------|
| 视频聊天平台将 peer IP 隐藏在 TURN 中继之后 | 深度被动扫描外加 Agora RTC 路径检测 |
| 现有工具需要 API key 或付费订阅 | 100% 免费、无需 key 的地理定位 API |
| 基础的 IP 查询工具只显示静态数据 | 实时 WebRTC 统计数据、连接质量评分、NAT 分析 |
| 随机聊天对象缺乏威胁情报 | 内置代理/VPN/主机检测,外加完整的 OSINT 工具套件 |
| 丑陋、杂乱的悬浮窗 | 玻璃拟物化 UI,10 个井然有序的标签页,支持响应式和缩放 |
## 功能
### 核心能力
- **自动 IP 发现。** 挂钩 `RTCPeerConnection` 以拦截 ICE candidates 并提取公共 IPv4 和 IPv6 地址,无需平台配合。
- **多源地理定位。** 并行查询 GeoJS、FreeIPApi 和 ipapi.is,支持自动故障转移和智能字段合并。
- **威胁情报。** 实时代理和 VPN 检测、托管和数据中心标记、Tor 出口节点检查以及高风险国家警报。
### WebRTC 分析
- **连接质量评分。** 基于 RTT、jitter、丢包、丢帧和带宽稳定性的实时 0-100 分评分。
- **网络路径可视化。** 直观的指示器,显示您是处于直接 P2P 路径还是通过 TURN 中继。
- **实时统计。** Bitrate 曲线图、丢包率、RTT、jitter、分辨率、FPS、丢帧、质量限制原因、NACK/FIR/PLI 计数器、音频电平以及可用带宽估算。
- **编解码器指纹识别。** 从 `getStats()` 报告中识别协商的编解码器(VP8、VP9、H.264、Opus 等)。
- **DTLS 和 ICE 检查。** 显示 DTLS 状态和角色、SRTP 密码、TLS 版本、ICE 角色、传输协议和 candidate 类型。
- **NAT 类型分析。** 双 STUN 探测,确定连接是否位于 Symmetric、Cone 或混合 NAT 之后。
- **mDNS 和 IPv6 泄漏检测。** 捕获来自 ICE candidates 的 `.local` 主机名泄漏和公共 IPv6 暴露。
### 用户体验
- **10 标签页悬浮窗。** 概览、位置、网络、安全、地图、统计、时间线、设置、历史和帮助。
- **嵌入式迷你地图。** 带有一键全屏功能的 OpenStreetMap iframe。
- **天气和距离。** 对方所在位置的当前天气,以及与您自己 IP 的距离。
- **会话事件时间线。** 按时间顺序记录 peer 发现、连接状态更改、质量变化和泄漏事件。
- **Peer 历史记录。** 持久记录遇到过 peer,包含时间戳、位置和 ISP。可导出为 CSV。
- **Peer 指纹识别。** 根据 peer 属性生成确定性哈希,用于跨会话重新识别。
- **屏幕共享检测。** 通过 track 标签检测 peer 何时开始共享屏幕。
- **媒体设备枚举。** 列出您本地的摄像头、麦克风和扬声器。
- **自动刷新地理定位。** 定期重新获取位置数据,以捕捉正在移动的移动端 peer。
### OSINT 集成
一键查询任何已发现的 IP:
| 服务 | URL |
|---------|-----|
| Shodan | shodan.io |
| AbuseIPDB | abuseipdb.com |
| VirusTotal | virustotal.com |
| ipinfo.io | ipinfo.io |
| GreyNoise | viz.greynoise.io |
| Censys | search.censys.io |
| IPVoid | ipvoid.com |
| ThreatFox | threatfox.abuse.ch |
| AlienVault OTX | otx.alienvault.com |
| Talos Intelligence | talosintelligence.com |
| Tor Exit Node Checker | check.torproject.org |
### UI 与辅助功能
- **深色和浅色主题。** 在玻璃拟物化深色模式和简洁的浅色模式之间切换。
- **主播模式。** 模糊 UI 中的 IP 地址。悬停或按住 Shift 键进行预览。
- **紧凑模式。** 将悬浮窗缩小到最小宽度以节省屏幕空间。
- **可拖拽和缩放。** 从顶部栏拖拽,从边角手柄缩放。位置和尺寸会保存到 `localStorage`。
- **自动隐藏。** 当没有活跃的 peer 时,自动折叠小组件。
- **桌面通知。** 发现新 peer 时,通过原生 `GM_notification` 发出警报。
- **Toast 系统。** 针对操作、错误和事件的非侵入式反馈。
- **键盘快捷键。** `Ctrl+Shift+G` 切换悬浮窗,`?` 打开帮助,`Shift` 预览主播模式。
## 架构
GeoChecker 是一个零依赖的单文件用户脚本。它完全在浏览器沙箱内运行,不需要后端、数据库或外部服务账户。
```
Browser Page
|
|-- GeoChecker Userscript (IIFE)
| |
| |-- WebRTC Hook Layer
| | |-- RTCPeerConnection prototype interception
| | |-- Constructor wrapping (Reflect.construct)
| | |-- Passive/deep instance scanning
| | |-- iframe recursion
| |
| |-- IP Extraction Layer
| | |-- ICE candidate parsing
| | |-- Private IP filtering
| | |-- mDNS and IPv6 leak detection
| |
| |-- Geolocation Layer
| | |-- Parallel API queries (GeoJS, FreeIPApi, ipapi.is)
| | |-- Response merging and normalization
| | |-- Weather fetch (Open-Meteo)
| |
| |-- Stats Collection Layer
| | |-- Periodic getStats() polling
| | |-- Delta calculation for bitrate history
| | |-- Per-PC stats scoping (prevents cross-contamination)
| |
| |-- UI Layer
| | |-- Glassmorphism overlay (DOM)
| | |-- 10-tab content router
| | |-- Theme engine
| | |-- Toast queue
| |
| |-- Persistence Layer
| |-- localStorage (position, settings, history, stats)
| |-- GM API (notifications, menu commands)
```
## 安装说明
### 方法 1:Tampermonkey 用户脚本(推荐)
适用于在任何视频聊天网站上的持久、自动使用。
1. 安装 [Tampermonkey](https://www.tampermonkey.net/)(Chrome / Firefox / Edge / Safari)。
2. 打开原始用户脚本的 URL:
https://raw.githubusercontent.com/w0wzahh/GeoChecker/main/geochecker-webrtc.user.js
3. Tampermonkey 将检测到 `.user.js` 扩展名并提示安装。
4. 点击 **安装**。
5. 导航到任何 WebRTC 视频聊天网站。悬浮窗将自动出现。
**自动更新:** 该脚本包含 `@downloadURL` 和 `@updateURL` 元数据。Tampermonkey 每 24 小时检查一次更新并静默安装。脚本内的轮询器也会在每次推送后 30 分钟内通知您有新版本。
### 方法 2:控制台注入(一次性)
用于无需安装任何内容的快速测试。
1. 打开目标网站(例如:Ome.tv、Emerald Chat)。
2. 按 **F12** → **控制台** 标签页。
3. 复制本仓库中 `console-inject.js` 的内容。
4. 将其粘贴到控制台并按 **Enter**。
5. 开始视频通话。悬浮窗会立即出现。
## 用法
### 支持的平台
GeoChecker 适用于任何使用 WebRTC 对等连接的网站。已验证的平台包括:
- **Ome.tv** 及 Omegle 的替代品
- **Monkey**(支持 Agora RTC 路径)
- **Emerald Chat**
- **ChatHub**
- **任何**使用标准 `RTCPeerConnection` 的**自定义 WebRTC 应用程序**
### 键盘快捷键
| 快捷键 | 操作 |
|----------|--------|
| `Ctrl + Shift + G` | 切换悬浮窗可见性 |
| `?` | 打开或关闭帮助悬浮窗 |
| `Shift` (按住) | 预览主播模式(显示被模糊的 IP) |
### Tampermonkey 菜单命令
右键点击 Tampermonkey 图标,然后选择 GeoChecker:
| 命令 | 快捷键 | 操作 |
|---------|-----------|--------|
| 切换悬浮窗 | `t` | 显示 / 隐藏小组件 |
| 切换紧凑模式 | `c` | 缩小 / 扩大悬浮窗宽度 |
| 切换主播模式 | `s` | 模糊 / 显示 IP 地址 |
| 切换主题 | `m` | 切换深色 / 浅色主题 |
| 导出历史记录 CSV | `e` | 将 peer 历史记录下载为 CSV |
| 检查更新 | `u` | 手动触发版本检查 |
## 技术深入解析
### WebRTC 挂钩引擎
GeoChecker 采用四层挂钩策略来拦截对等连接:
1. **原型方法包装。** 拦截 `RTCPeerConnection.prototype` 上的 `addIceCandidate`、`setLocalDescription` 和 `setRemoteDescription`。这可以捕获来自遗留代码和直接调用这些方法的库的请求。
2. **构造函数包装。** 使用 `Reflect.construct(...)` 替换全局 `RTCPeerConnection` 构造函数,以保留 ES6 子类链。每个新实例都会被自动挂钩。
3. **被动全局扫描。** 定期扫描 `window`、`iframe.contentWindow` 和深层对象树,寻找未被挂钩的 `RTCPeerConnection` 实例。这在缓存实例的 SPA 框架中很常见。
4. **iframe MutationObserver。** 检测动态注入的 iframe,并递归扫描其内容窗口。
这四层并行工作。如果一层漏掉了某个实例,另一层会将其捕获。
### IP 提取流水线
当拦截到 ICE candidate 时:
```
ICE Candidate String
|
|-- Parse candidate type (host, srflx, prflx, relay)
|-- Extract IP address (IPv4, IPv6, or mDNS .local)
|-- Filter private ranges (RFC 1918, loopback, link-local)
|-- Validate format (regex plus isValidIP())
|-- Check for mDNS leak (.local hostnames)
|-- Check for IPv6 public leak
|-- De-duplicate against known IPs
|-- Trigger geolocation fetch
```
### 统计数据收集
捕获 IP 后,GeoChecker 会每 1.5 秒轮询一次活跃对等连接的 `getStats()`:
- **Bitrate。** 根据 `bytesReceived` 和 `bytesSent` 的增量计算,通过 `__gc_stats_id` 为每个 PC 划定作用域,以防止交叉污染。
- **丢包。** 源自 `packetsLost` 和 `packetsReceived` 的比率。
- **RTT 和 Jitter。** 从 `candidate-pair` 和 `remote-inbound-rtp` 报告中提取。
- **编解码器信息。** 通过 `mimeType` 加上 `payloadType` 对 `codec` 报告进行去重。
- **质量指标。** `framesPerSecond`、`framesDropped`、`frameWidth`、`frameHeight` 和 `qualityLimitationReason`。
主 PC 选举算法确保只有最近活跃的连接驱动全局 UI 状态。这可以防止多个 peer 同时连接时出现闪烁。
### 多 PC处理
在复杂的应用程序中(多方通话、SFU 连接),多个 `RTCPeerConnection` 实例可能会同时处于活动状态。GeoChecker 会:
- 为每个 PC 分配一个唯一的 `__gc_stats_id`。
- 使用 `pcId|reportId` 键限定所有 `prevStatsMap` 条目的作用域。
- 选举一个主 PC(最后未关闭的连接)用于全局 UI 更新。
- 持续轮询后台 PC 以保证数据完整性。
## 项目结构
```
GeoChecker/
├── geochecker-webrtc.user.js # Main Tampermonkey userscript (production)
├── console-inject.js # Standalone console injection variant
├── README.md # This file
├── .gitignore # Excludes local-only files from git
└── LICENSE # All Rights Reserved
```
## 技术栈
| 层级 | 技术 |
|-------|-----------|
| 语言 | 原生 ES6+ JavaScript(无构建步骤,无框架) |
| 样式 | CSS3(包含 glassmorphism、backdrop-filter、CSS 变量) |
| API | GeoJS、FreeIPApi、ipapi.is、Open-Meteo |
| 地图 | OpenStreetMap iframe 嵌入 |
| 通知 | `GM_notification` (Tampermonkey) 和 Web Notifications API |
| 存储 | `localStorage` |
| 托管 | GitHub(用户脚本源码)和 Cloudflare Pages(网站) |
## API 与数据源
所有地理定位和数据扩充 API 都是**免费的、无需 key 的,并且启用了 CORS**:
| 服务 | Endpoint | 提供的数据 |
|---------|----------|---------------|
| GeoJS | `get.geojs.io` | IP、国家、地区、城市、纬度、经度 |
| FreeIPApi | `free.freeipapi.com` | IP、国家、地区、城市、ISP、代理和 VPN 标记 |
| ipapi.is | `api.ipapi.is` | IP、国家、ASN、ISP、托管、移动、Tor 标记 |
| Open-Meteo | `api.open-meteo.com` | 当前天气(温度、风速、状况) |
## 自动更新系统
GeoChecker 拥有包含三层的更新机制:
### 第一层:原生 Tampermonkey 自动更新
- Tampermonkey 每 24 小时检查一次 `@downloadURL`。
- 将远程的 `@version` 与本地版本进行比较。
- 当版本号增加时静默安装更新。
### 第二层:脚本内版本轮询
- 脚本每 30 分钟通过 `GM_xmlhttpRequest` 获取一次远程文件。
- 解析远程的 `@version` 标头。
- 如果较新:显示一条带有可点击更新链接的 Toast 通知。
### 第三层:手动检查
- Tampermonkey 菜单中的“检查更新”会立即触发版本比较。
- 确认是否为最新状态或提示更新。
**重要提示:** 每次发布时都必须提升 `@version` 元数据的版本号。如果没有版本升级,Tampermonkey 将看不出差异并跳过更新。
## 更新日志
### v5.0.4
- 重新设计了键盘快捷键帮助悬浮窗,以匹配 glassmorphism 主题。
- 修复了按键徽标的对比度:明亮的强调色文本搭配发光边框。
- 添加了入场动画(缩放 + 淡入)和错落的滑入行效果。
- 添加了 Escape 键以关闭帮助悬浮窗。
- 将关闭按钮的文本更改为带有渐变和悬停发光效果的“Got it”。
### v5.0.3
- 将许可证更改为 **保留所有权利**(原为 MIT)。未经书面许可,严禁未经授权的使用、修改或分发。
- 添加了带有 `@downloadURL` 和 `@updateURL` 元数据的自动更新系统。
- 添加了脚本内版本轮询(30 分钟间隔)和手动检查菜单项。
- 从仓库中删除了 `index.html` 和 `server.js`(通过 Cloudflare Pages 托管)。
### v5.0.2
- 修复了更新 Toast 链接,使其直接使用原始的 `.user.js` URL(避免 TM 重定向页面)。
### v5.0.1
- 修复了多个 PC 之间 `prevStatsMap` 的键冲突(通过 `__gc_stats_id` 实现每个 PC 的作用域划分)。
- 添加了主 PC 选举机制,以防止同时连接造成的全局 UI 状态损坏。
- 修复了 SPA 导航导致 hook/被动扫描间隔永久终止的问题。
- 在 `RTCPeerConnection` 构造函数 hook 上使用了 `Reflect.construct`,以实现稳健的 ES6 子类化。
- 在检测到新 peer 时清除了 `weatherData`,以防止天气显示陈旧。
- 在 `Notification.requestPermission()` 周围添加了 `try/catch`,以适配受限的浏览器。
- 为 `?` 键盘快捷键添加了输入保护(防止在输入时触发)。
### v5.0.0
- 完全重写,采用 glassmorphism UI 和 10 标签页悬浮窗。
- 添加了 mDNS 和 IPv6 泄漏检测、编解码器指纹识别、DTLS 信息。
- 添加了 NAT 类型分析、peer 指纹识别、会话时间线。
- 添加了 11 项服务的 OSINT 套件、自动刷新地理定位。
- 添加了 Tampermonkey 原生菜单集成(`GM_registerMenuCommand`)。
- 添加了桌面通知(`GM_notification`)、主播模式、紧凑模式。
- 添加了可拖拽和缩放的悬浮窗,并支持位置记忆。
## 免责声明
本工具仅供**教育和个人使用**。
- IP 地理定位是近似的(最高为城市级别的准确度)。
- WebRTC IP 提取是一种已知的浏览器行为。本工具仅显示已经在传输中的信息。
- 请尊重他人的隐私以及您使用此工具的任何平台的服务条款。
- 作者不对滥用或违反平台政策的行为负责。
由 **w0wzahh** 用 ❤️ 制作
标签:DFIR, IP地理定位, WebRTC, 代码示例, 数据分析, 数据可视化, 浏览器脚本, 策略控制器, 自定义脚本, 视频聊天