📍 广建实习定位助手 (Guangjian Internship Location Helper)
这是一个专为广建学院实习打卡系统设计的前端定位注入与模拟工具。通过 Hook 底层核心定位 API,配合精心设计的拟物化拟真磨砂玻璃 (Glassmorphism) 控制面板,实现精准、无感、防检测的地理位置模拟。
🧭 系统架构与数据流
本助手在底层实现了一套完整的坐标拦截与代理分发机制,其核心架构如下:
graph TD
User([用户选点/输入]) -->|确认保存| Store[(Store: GM_setValue / LocalStorage)]
Store -->|加载初始坐标| MainWorld[主世界注入脚本]
subgraph 顶层窗口 (Top Window)
MainWorld -->|Hook API| WebPage[实习系统页面]
UI[悬浮球 & 控制面板] -->|实时微调| MainWorld
end
subgraph IFrame 隔离区 (Nested IFrames)
TopTimer[同步定时器 1s] -->|postMessage| IFrame1[子页面 iframe 1]
TopTimer -->|postMessage| IFrame2[子页面 iframe 2]
IFrame1 -->|监听 SYNC_COORD| HookedGeo1[Hooked Geolocation]
IFrame2 -->|监听 SYNC_COORD| HookedGeo2[Hooked Geolocation]
end
WebPage -->|请求定位| HookedGeo[Hooked Geolocation]
HookedGeo -->|检测 SDK| SDK{SDK 分流判断}
SDK -->|W3C Geolocation| WGS84[抖动处理 + 转为 WGS-84]
SDK -->|高德/腾讯/百度/微信| GCJ02[抖动处理 + 维持 GCJ-02]
WGS84 -->|返回| WebPage
GCJ02 -->|返回| WebPage
✨ 核心特性
- 🎯 多 SDK 深度覆盖:全面劫持 W3C 标准定位、腾讯地图、高德地图、百度地图及微信 JSSDK 定位,覆盖几乎所有常见的前端地图打卡方案。
- 🛡️ 工业级防检测:
- Native 代码伪装:拦截并代理
Function.prototype.toString,使所有 Proxy 代理函数在被检测脚本调用.toString()时均返回function () { [native code] }。 - 只读属性锁定:利用
Object.defineProperty冻结navigator.geolocation及其原型链属性,防止第三方脚本检测或重写。 - IFrame 穿透防御:自动拦截动态创建的 iframe
src指向geolocation相关页面,防止利用沙箱绕过 Hook。 - 动态防静止静摩擦抖动:自动在设定坐标基础上加入 $\pm0.00004$ 的高斯抖动,并模拟 $10m \sim 15m$ 随机水平精度,防止后台风控通过静态坐标串判定作弊。
- Native 代码伪装:拦截并代理
- 🗺️ 所见即所得地图选点:集成高德瓦片地图,支持拖拽标记、点击落点、即时保存与一键应用。
- 🔍 地址检索与坐标转换:内置 Nominatim 地理编码服务,支持输入地名搜索。自动完成
WGS-84原始坐标与中国GCJ-02火星坐标系的双向纠偏。 - 📱 响应式动效 UI:
- 桌面端:支持顶部标题栏按压拖拽的悬浮磨砂玻璃卡片。
- 手机端:类 iOS 弹性底部抽屉面板,支持下滑手势拖拽关闭。
- 数据缓存:内置本地常用坐标收藏夹,便于多实习点快速切换。
🛠️ 技术注入矩阵
本助手拦截了以下关键的底层接口,从源头上切断了真实定位数据的读取:
| 目标 SDK / 接口 | Hook 截获点 | 返回坐标系 | 说明 |
|---|---|---|---|
| W3C Geolocation | navigator.geolocation.getCurrentPositionnavigator.geolocation.watchPosition |
WGS-84 | 原始 GPS 坐标系,自动将 GCJ-02 逆偏后返回,确保符合浏览器规范 |
| 腾讯地图 SDK | qq.maps.Geolocation.prototype.getLocationqq.maps.Geolocation.prototype.getIpLocation |
GCJ-02 | 注入自定义模拟数据对象,附带省市区、Adcode 属性 |
| 高德地图 SDK | AMap.Geolocation.prototype.getCurrentPositionAMap.Geolocation.prototype.getCityInfo |
GCJ-02 | 劫持回调,伪造高精度定位成功状态及行政区划编码 |
| 百度地图 SDK | BMap.Geolocation.prototype.getCurrentPosition |
GCJ-02 | 劫持定位状态码及 point 属性,模拟高精度成功回调 |
| 微信 JSSDK | wx.getLocation |
GCJ-02 | Hook 微信全局变量及属性 setter,对动态加载的 JSSDK 同样有效 |
| IFrame 沙箱绕过 | HTMLIFrameElement.prototype.src (setter) |
- | 监测到 src 包含 geolocation 则重定向至 about:blank |
🚀 安装指南
步骤一:安装脚本管理器
在浏览器中安装 Tampermonkey (油猴) 插件(支持 Chrome, Edge, Firefox, Safari 等)。
步骤二:新建脚本
- 点击油猴插件图标,选择 "添加新脚本"。
- 清空编辑器默认内容。
- 复制本项目中的
广建实习定位助手.user.js完整代码并粘贴。 - 按下
Ctrl + S(或Cmd + S) 保存脚本。
📖 使用说明
1. 控制台激活
安装完成后,访问广建实习系统页面:
https://jw.gdcvi.edu.cn/sx/ZhuJMB010306/ByJwb/
页面右侧将出现一个带有绿色定位图标的圆形悬浮球。点击悬浮球即可展开定位控制台。
2. 位置模拟方式
- 手动输入:在控制面板的“纬度 Lat”和“经度 Lng”输入框内直接输入目标坐标(GCJ-02 格式),点击“应用坐标”。
- 地图选点:
- 点击控制面板中的 「地图选点」 按钮。
- 系统将加载全屏高德地图。
- 您可以在地图上任意点击或拖动红色标记进行微调。
- 确定位置后,点击右下角的 「确认选点」,页面将自动重载并应用新位置。
- 地名检索:在地图选点界面顶部的搜索框中,输入具体的地理名称(如:广州天河公园),点击“搜索”后从下拉列表中选择精准地点(搜索依靠 Nominatim 外部服务,在网络受限时可能需要代理)。
3. 位置收藏夹
- 设置好常用位置的坐标后,点击 「+ 保存当前位置到列表」。
- 输入易记的别名(例如:公司总部、宿舍)。
- 之后只需在“已保存位置”列表中点击 「应用」,即可瞬间切换并刷新生效。
⚠️ 坐标系转换说明
在地图技术领域,不同平台使用的坐标标准不一致。本助手在内部进行了高精度数学换算,用户无需手动计算纠偏:
- 高德地图瓦片(地图选点):使用 GCJ-02 坐标系。
- 地点检索(OSM Nominatim):返回 WGS-84 坐标系,本助手已在底层将其自动映射转换为 GCJ-02。
- W3C Geolocation 注入:浏览器底层接口要求返回标准 WGS-84,本助手会自动将当前保存的 GCJ-02 模拟坐标转换为 WGS-84 后再向页面进行输出,从而保证了与原生定位机制的完美兼容。
💡 常见问题与排查 (FAQ)
[!TIP]
Q: 为什么点击“地图选点”后地图是一片空白?
A: 请检查您的网络连接是否通畅。地图组件及样式文件(Leaflet)是从公共 CDN (cdn.jsdelivr.net) 动态加载的,如遇 CDN 波动可能会出现暂时性加载失败。另外,部分浏览器安全策略可能会拦截跨源 CSS/JS,请确保油猴脚本权限正常。
[!WARNING]
Q: 输入地名搜索没有反应?
A: 地名检索依赖于 OpenStreetMap 提供的 Nominatim API。在部分网络环境下(如校园网或企业内网),该域名可能会被限制或解析缓慢。建议确保网络环境通畅,或者直接在地图上滑动拖拽选点。
[!IMPORTANT]
Q: 为什么打卡系统提示定位失败或仍在获取旧坐标?
A:
- 请确认您的打卡页面 URL 匹配规则是否在
@match范围内。- 请清除浏览器缓存,或强制刷新页面 (
Ctrl + F5)。- 部分高级打卡系统可能会利用更底层的 Native 容器(如微信客户端或专用 APP)的专有 API 进行定位。若在 PC 端浏览器仿真器或手机浏览器内使用,本助手能保证 100% 拦截生效;但在微信原生客户端内可能受到客户端自身安全沙箱的额外限制。
📄 免责声明
本脚本仅用于前端地图 API 技术研究、多 SDK 兼容性测试及定位功能开发调试。
请勿将本脚本用于任何违反学校规章制度、实习管理规定或国家法律法规的场景。因使用本脚本产生的任何考勤纠纷、学术诚信问题或法律责任,均由使用者本人承担,开发者不承担任何直接或间接责任。