本文目录导读:

在浏览器中获取用户位置,或在服务器端通过IP获取位置,下面分别介绍,并附上可直接运行的脚本示例。
前端浏览器获取(HTML5 Geolocation)
这是最常用的方法,需要用户授权,精度高(GPS/基站/WiFi)。
原生 JavaScript 脚本
<!DOCTYPE html>
<html>
<body>
<button onclick="getLocation()">获取我的位置</button>
<p id="demo"></p>
<script>
function getLocation() {
if (navigator.geolocation) {
// 核心API,第三个参数是配置项
navigator.geolocation.getCurrentPosition(showPosition, showError, {
enableHighAccuracy: true, // 高精度,定位更准但更耗电
timeout: 5000, // 超时时间(毫秒)
maximumAge: 0 // 不缓存旧位置
});
} else {
document.getElementById("demo").innerHTML = "浏览器不支持地理定位";
}
}
// 成功回调
function showPosition(position) {
const lat = position.coords.latitude;
const lon = position.coords.longitude;
document.getElementById("demo").innerHTML =
`纬度: ${lat}, 经度: ${lon}`;
// 可选:反向地理编码(需要额外API)
// fetch(`https://api.map.baidu.com/reverse_geocoding/v3/?ak=你的密钥&location=${lat},${lon}&output=json`)
}
// 失败回调
function showError(error) {
switch(error.code) {
case error.PERMISSION_DENIED:
alert("用户拒绝授权");
break;
case error.POSITION_UNAVAILABLE:
alert("位置信息不可用");
break;
case error.TIMEOUT:
alert("请求超时");
break;
default:
alert("未知错误");
}
}
</script>
</body>
</html>
一行命令调用(Node.js 环境需借助包,浏览器环境直接执行)
注意:浏览器中无法用
curl,但可以在控制台执行:navigator.geolocation.getCurrentPosition(console.log)
后端根据 IP 获取地理位置(无需用户授权)
适用于任何有外网 IP 的环境,精度到城市级别。
Python 脚本(使用免费IP库)
import requests
import json
def get_location_by_ip(ip=None):
# ip为空则获取本机公网IP
if not ip:
# 使用这个API获取公网IP
ip = requests.get('https://api.ipify.org').text
# 免费IP定位API(无需密钥)
url = f'http://ip-api.com/json/{ip}?lang=zh-CN'
try:
response = requests.get(url, timeout=5)
data = response.json()
if data['status'] == 'success':
return {
'IP': data['query'],
'国家': data['country'],
'省份': data['regionName'],
'城市': data['city'],
'经纬度': [data['lat'], data['lon']],
'运营商': data.get('isp', '未知')
}
else:
return {'error': '查询失败'}
except Exception as e:
return {'error': str(e)}
# 使用示例
if __name__ == '__main__':
# 获取本机位置
result = get_location_by_ip()
print(json.dumps(result, ensure_ascii=False, indent=2))
# 或指定IP查询
# print(get_location_by_ip('8.8.8.8'))
Python 脚本(使用高德开放平台,更准确)
需要先去高德开放平台注册获取 key(免费配额够用),
import requests
def get_location_by_ip_amap(ip, key='你的高德KEY'):
url = 'https://restapi.amap.com/v3/ip'
params = {
'key': key,
'ip': ip
}
response = requests.get(url, params=params)
data = response.json()
if data['status'] == '1':
return {
'省份': data.get('province'),
'城市': data.get('city'),
'区域': data.get('adcode'),
'矩形范围': data.get('rectangle')
}
else:
return {'error': data.get('info')}
# 查询本机公网IP的位置
# print(get_location_by_ip_amap('本机公网IP', '你的KEY'))
纯 Bash 脚本(Linux/Mac 可用)
#!/bin/bash
# 获取本机IP(几种方式任选)
# IP=$(curl -s ifconfig.me)
IP=$(curl -s https://api.ipify.org)
echo "你的公网IP: $IP"
# 查询位置(使用 ip-api 免费接口)
curl -s "http://ip-api.com/json/${IP}?lang=zh-CN" | python3 -m json.tool
# 如果不装Python,用 jq 解析(Mac需 brew install jq)
# curl -s "http://ip-api.com/json/${IP}?lang=zh-CN" | jq '{country, regionName, city, lat, lon}'
常见问题与注意事项
| 问题 | 解决方案 |
|---|---|
| 浏览器拒绝授权 | 必须通过HTTPS才能调用定位API;或引导用户设置浏览器隐私允许定位 |
| 免费IP库不准确 | 使用高德/百度地图API,但需要注册开发者 |
| 局域网IP无法定位 | ip-api 只能查公网IP,局域网会返回“country: 局域网” |
| Node.js 环境 | 不能直接用navigator,需安装 node-geocoder 或 axios 配合IP库 |
更进阶:Node.js 一键执行(只需安装一个库)
npm install axios -g
node -e "
const axios = require('axios');
(async () => {
const ip = (await axios.get('https://api.ipify.org')).data;
const res = await axios.get('http://ip-api.com/json/' + ip + '?lang=zh-CN');
console.log('你的位置:', res.data.country, res.data.regionName, res.data.city);
})();
"
选择哪种方式取决于你的场景:用户设备位置用 navigator.geolocation;服务器IP位置用 IP 查询库,如果有更具体的需求(比如需要获取浏览器设备的具体联系方式或精确到街道),可以告诉我,我再帮你定制脚本。