Anti-getCurrentPosition
navigator.geolocation.getCurrentPosition 是网页应用中常用的获取设备位置的 API,对该函数进行重载可以“欺骗”网页的定位系统.
getCurrentPosition 的语法如下:
getCurrentPosition(success)
getCurrentPosition(success, error)
getCurrentPosition(success, error, options)
根据 mdn 所述,参数的含义如下:
success是函数成功时的回调函数,唯一输入参数是GeolocationPosition,包含两个属性:coords的类型是Coordinates,表示设备在地球上的位置,具体属性如下:latitude:纬度(十进制,double);longitude:经度(十进制,double);altitude:海拔(double),可以为null(表示无法提供,下同);accuracy:位置精度(单位米,double);altitudeAccuracy,海拔精度(单位米,double),可以为null;heading:设备行驶方向(单位为度,double),0度表示正北,方向按顺时针确定,可以为null;speed:设备速度(单位米每秒,double),可以为null.
timestamp,返回一个时间戳,表示获取到数据的时间.error是函数失败时的回调函数,唯一输入参数是GeolocationPositionError,包含两个属性:code错误码:1/PERMISSION_DENIED:权限获取失败;2/POSITION_UNAVAILABLE:内部位置源返回内部错误;3/TIMEOUT:获取地理位置超时;
message开发者可读的错误信息.
options是一个包含下列参数的可选对象:maximumAge:一个正的long值,表示可接受的缓存位置的最大存在时间(以毫秒为单位).如果设置为0,则设备不能使用缓存位置,必须尝试检索当前的真实位置;如果设置为Infinity,则设备必须返回缓存位置而不考虑其存在时间.默认值:0.timeout:一个正的long值,表示设备允许获取位置的最长时间(以毫秒为单位).默认值为Infinity,意味着getCurrentPosition()会一直等待直到位置可用才返回.enableHighAccuracy:一个布尔值,指示应用程序希望接收尽可能精确的位置结果.如果为true,且设备能够提供更高精度的位置,则会启用高精度模式;这可能导致响应时间变慢或功耗增加.如果为false,设备可通过更快响应和/或更少功耗来节省资源.默认值:false.
因此,一个简单的欺骗脚本为:
const originalGetCurrentPosition = navigator.geolocation.getCurrentPosition;
navigator.geolocation.getCurrentPosition = function(success, error, options) {
const fakePosition = {
coords: {
latitude: 0.0,
longitude: 0.0,
accuracy: 10,
altitude: null,
altitudeAccuracy: null,
heading: null,
speed: null
},
timestamp: Date.now()
};
success(fakePosition);
};
只需在开发者工具中的控制台执行即可.