工具及用途
fiddler
抓包,分析网络流量,劫持请求和响应- 一个好用的文本编辑器或者
IDE
,比如notepad++
或者vs code
nodejs
或者python
或者java
或者其他,选一种你喜欢的编程语言来写服务器端应用
准备
先去高德地图开放平台申请一个
Web端应用
,得到key
然后参考文档快速的写一个简单的定位的网页,为了节约时间,我这里给出一个简单的示例demo,使用时将下面的代码保存到本地,可以命名为
a.html
或者其他,然后将自己申请好的key
,填入源代码对应位置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1 id="showLocation">获取定位中。。。</h1>
</body>
</html>
<script src="https://webapi.amap.com/loader.js"></script>
<script type="text/javascript">
AMapLoader.load({
"key": "申请好的Web端开发者Key", // 申请好的Web端开发者Key,首次调用 load 时必填
"version": "1.4.15", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
"plugins": [], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
"AMapUI": { // 是否加载 AMapUI,缺省不加载
"version": '1.1', // AMapUI 缺省 1.1
"plugins": ['overlay/SimpleMarker'], // 需要加载的 AMapUI ui插件
},
"Loca": { // 是否加载 Loca, 缺省不加载
"version": '1.3.2' // Loca 版本,缺省 1.3.2
},
}).then((AMap) => {
AMap.plugin('AMap.Geolocation', function () {
var geolocation = new AMap.Geolocation({
// 是否使用高精度定位,默认:true
enableHighAccuracy: true,
// 定位按钮的停靠位置的偏移量,默认:Pixel(10, 20)
buttonOffset: new AMap.Pixel(10, 20),
// 定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
zoomToAccuracy: true,
// 定位按钮的排放位置, RB表示右下
buttonPosition: 'RB'
})
geolocation.getCurrentPosition(function (status, result) {
if (status == 'complete') {
onComplete(result)
} else {
onError(result)
}
});
function onComplete(data) {
// data是具体的定位信息
console.log('定位成功')
document.getElementById('showLocation').innerText = data.formattedAddress
console.log(JSON.stringify(data))
}
function onError(data) {
// 定位出错
console.log('定位出错')
console.log(data)
}
})
}).catch((e) => {
console.log(e); //加载错误提示
});
</script>然后双击使用浏览器打开该
html
文件,推荐chorme浏览器
,不出意外的话(定位是个耗时操作,可能需要等一下),你应该可以看到类似下面这样的网页,没什么特别的,就是定位到了你的当前位置(小声bb:当然,我这是伪装过的)
开始
配置fiddler
打开fiddler
,菜单栏选择Tools->Options->Connections
,如下图配置就行,然后重启fiddler
抓包分析定位报文
浏览器打开a.html
,定位成功后查看fiddler
中抓到的报文,如下:
1 | # 请求 |
1 | # 响应 |
编写服务器端应用模拟响应报文
我使用的是IDE
是IntelliJ IDEA 2019.3.3
,编程语言是java
,另外使用了springboot
框架快速构建服务器端应用,当然,你可以选择你熟悉的其他方式,不再赘述相关内容,在此直接贴出controller
类的代码
1 | package wiki.zimo.demo.controller; |
修改fiddler自定义规则
修改fiddler
的自定义规则(快捷键 Ctrl + R),使之劫持请求定位的接口https://restapi.amap.com/v3/geocode/regeo
将它定向到请求我们自己编写的模拟响应报文的服务器端应用,从而实现伪装定位的目的,脚本如下(此处我是在OnBeforeRequest
方法的最后插入了下面这段脚本,当然,也可以处理其他的,比如处理响应之前的):
1 | var origin_host="https://restapi.amap.com/v3/geocode/regeo"; |
下面定位到天安门试试
修改服务器端应用,将json
替换为你想定位到的地方,并且需要保证是合法的高德地图定位接口所返回的内容,我这里提供一段python
脚本,主要功能是利用高德地图的地理/逆地理编码api
得到合法的json
位置,使用前需要安装python
和requests
库,参考命令pip install requests
,并申请高德地图Web服务
应用,获取到相应的key
(注意:这个key
和上面的Web端
的key
并不相同)
1 | # location 就是你想定位到的经纬度坐标,可以使用坐标拾取系统得到 |
浏览器console
输出如下:
1 | {"type":"complete","info":"SUCCESS","status":1,"ZDa":"jsonp_590192_","position":{"Q":30.58052,"R":103.9923,"lng":103.9923,"lat":30.58052},"message":"Get ipLocation success.Get address success.","location_type":"ip","accuracy":null,"isConverted":true,"addressComponent":{"citycode":"010","adcode":"110101","businessAreas":[{"name":"东单","id":"110101","location":{"Q":39.913479,"R":116.41680400000001,"lng":116.416804,"lat":39.913479}},{"name":"王府井","id":"110101","location":{"Q":39.913505,"R":116.41203100000001,"lng":116.412031,"lat":39.913505}},{"name":"东四","id":"110101","location":{"Q":39.929561,"R":116.42517099999998,"lng":116.425171,"lat":39.929561}}],"neighborhoodType":"","neighborhood":"","building":"","buildingType":"","street":"东华门大街","streetNumber":"60号","country":"中国","province":"北京市","city":"","district":"东城区","township":"东华门街道"},"formattedAddress":"北京市东城区东华门街道东华门大街东华门大街小区","roads":[],"crosses":[],"pois":[]} |
详细地址如下: