怎么用脚本获取地理位置

wen 实用脚本 2

本文目录导读:

怎么用脚本获取地理位置

  1. 场景一:前端浏览器获取(HTML5 Geolocation)
  2. 场景二:后端根据 IP 获取地理位置(无需用户授权)
  3. 常见问题与注意事项
  4. 更进阶:Node.js 一键执行(只需安装一个库)

在浏览器中获取用户位置,或在服务器端通过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-geocoderaxios 配合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 查询库,如果有更具体的需求(比如需要获取浏览器设备的具体联系方式或精确到街道),可以告诉我,我再帮你定制脚本。

抱歉,评论功能暂时关闭!