【Java、Python】获取电脑当前网络IP进行位置获取(附源码)

我相信看到这篇博客的时候心里肯定是想解决自己的一个问题的,而这篇博客我就以简单快速的方式解决这些烦恼!

一、获取当前IP

在Java中自带了一些自己的流对象来获取当前的IP地址,不多说我们直接上代码。

java 复制代码
//获取当前网络ip地址
ipAddress = InetAddress.getLocalHost().getHostAddress();

正如所见,一行代码获取你当前的IP。

  1. InetAddress.getLocalHost() - 此方法返回一个表示本地主机的InetAddress对象。本地主机是在运行Java代码的计算机上。

  2. getHostAddress() - 此方法返回本地主机的IP地址作为字符串。InetAddress类表示互联网地址,并具有getHostAddress()方法,该方法返回IP地址的字符串表示形式。

二、获取当前位置信息

我相信很多人在这个地方遇到了难处,有人去使用过国产的地图API去调用,但是流程比较复杂,而在这里我推荐一个免费、好调用的API接口IP-API.com - Geolocation APIFree IP Geolocation API - lookup any IP addresshttps://ip-api.com/我在这里用简单的方法来实现一个可观数据的显示
设置好我们的API的接口

java 复制代码
    //接口api
    private static final String IP_API_URL = "http://ip-api.com/json/";

创建URl对象接受内容类型,把我们要查询的IP放进去

java 复制代码
// 创建URL对象,指定IP_API_URL
        URL url = new URL(IP_API_URL + "?ip=" + ipAddress);
        // 创建HttpURLConnection对象
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        // 设置请求方式
        conn.setRequestMethod("GET");
        // 设置接受的内容类型
        conn.setRequestProperty("Accept", "application/json");

        // 判断是否请求成功
        if (conn.getResponseCode() != 200) {
            throw new RuntimeException("失败 : HTTP 错误码 : " + conn.getResponseCode());
        }

创建BufferedReader对象,用来返回我们的数据

java 复制代码
// 创建BufferedReader对象,用于读取响应
        BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
        String output;
        StringBuilder response = new StringBuilder();
        // 循环读取响应
        while ((output = br.readLine()) != null) {
            response.append(output);
        }
        // 断开连接
        conn.disconnect();
         // 返回响应
        System.out.println(response.toString());

我们把这些封装起来

java 复制代码
    //接口api
    private static final String IP_API_URL = "http://ip-api.com/json/";
/**
     * 获取IP,并且根据IP拿到位置信息
     *
     * @return
     * @throws Exception
     */
    public static String getGeoLocation() throws Exception {
        String ipAddress = "";
//            获取当前网络ip地址
        ipAddress = InetAddress.getLocalHost().getHostAddress();
        System.out.println("IP地址: " + ipAddress);

        // 创建URL对象,指定IP_API_URL
        URL url = new URL(IP_API_URL + "?ip=" + ipAddress);
        // 创建HttpURLConnection对象
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        // 设置请求方式
        conn.setRequestMethod("GET");
        // 设置接受的内容类型
        conn.setRequestProperty("Accept", "application/json");

        // 判断是否请求成功
        if (conn.getResponseCode() != 200) {
            throw new RuntimeException("失败 : HTTP 错误码 : " + conn.getResponseCode());
        }

        // 创建BufferedReader对象,用于读取响应
        BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
        String output;
        StringBuilder response = new StringBuilder();
        // 循环读取响应
        while ((output = br.readLine()) != null) {
            response.append(output);
        }
        // 断开连接
        conn.disconnect();
        // 返回响应
        return response.toString();
    }

这样我就可以获得API接口返回的信息

  1. status: 这是状态码,显示为"success",表示查询成功。
  2. country: 国家名,显示为"China",即中国。
  3. countryCode: 国家代码,显示为"CN",这是中国的国际ISO标准代码。
  4. region: 地区名,显示为"HN",这很可能是指湖南省(Hunan Province)的缩写。
  5. regionName: 同region,也表示为"Hunan"。
  6. city: 城市名。
  7. zip: 邮编。
  8. lat: 纬度。
  9. lon: 经度。
  10. timezone: 时区,显示为"Asia/Shanghai",即东八区。
  11. isp: 互联网服务提供商,显示为"Chinanet",即中国电信。
  12. org: 组织/机构名,显示为"Chinanet HN"。
  13. as: AS号码,表示一个特定的网络运营商或机构。这里显示为"AS4134 CHINANET-BACKBONE",表示这是一个中国电信的骨干网络。
  14. query: 这可能是原始查询的IP地址或其他标识符。

三、解析JSON数据

如果你使用的是maven项目,则可以进行依赖的引入

XML 复制代码
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20160810</version>
        </dependency>

如果你不是使用的maven项目,则可以使用自己的JSON工具,或者找其他的JSON工具。

首先我们拿到JSON数据,创建JSON实例

java 复制代码
        // 解析JSON数据
        JSONObject jsonObject = new JSONObject("你的json数据");

再根据键值拿到对应的数据

java 复制代码
jsonObject.getString("键值");

四、完整代码

Java

java 复制代码
    //接口api
    private static final String IP_API_URL = "http://ip-api.com/json/";

/**
     * 获取IP,并且根据IP拿到位置信息
     *
     * @return
     * @throws Exception
     */
    public static String getGeoLocation() throws Exception {
        String ipAddress = "";
//            获取当前网络ip地址
        ipAddress = InetAddress.getLocalHost().getHostAddress();
        System.out.println("IP地址: " + ipAddress);


        // 创建URL对象,指定IP_API_URL
        URL url = new URL(IP_API_URL + "?ip=" + ipAddress);
        // 创建HttpURLConnection对象
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        // 设置请求方式
        conn.setRequestMethod("GET");
        // 设置接受的内容类型
        conn.setRequestProperty("Accept", "application/json");

        // 判断是否请求成功
        if (conn.getResponseCode() != 200) {
            throw new RuntimeException("失败 : HTTP 错误码 : " + conn.getResponseCode());
        }

        // 创建BufferedReader对象,用于读取响应
        BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
        String output;
        StringBuilder response = new StringBuilder();
        // 循环读取响应
        while ((output = br.readLine()) != null) {
            response.append(output);
        }
        // 断开连接
        conn.disconnect();

        //拿到response里面的json参数
        String country = response.toString();
        System.out.println("数据: " + country);
        // 解析JSON数据
        JSONObject jsonObject = new JSONObject(country);
        // 获取国家名称
        String countryName = jsonObject.getString("country");
        System.out.println("国家名称: " + countryName);
        // 获取省名称
        String provinceName = jsonObject.getString("region");
        System.out.println("省名称: " + provinceName);
        // 获取城市名称
        String cityName = jsonObject.getString("city");
        System.out.println("城市名称: " + cityName);
        // 获取经纬度
        double longitude = jsonObject.getDouble("lon");
        double latitude = jsonObject.getDouble("lat");
        System.out.println("经纬度: " + longitude + "," + latitude);
        // 获取IP地址
        String ip = jsonObject.getString("query");
        System.out.println("IP地址: " + ip);
        // 获取运营商
        String isp = jsonObject.getString("isp");
        System.out.println("运营商: " + isp);
        // 获取时区
        String timezone = jsonObject.getString("timezone");
        System.out.println("时区: " + timezone);
        // 获取省
        String province = jsonObject.getString("regionName");
        System.out.println("省: " + province);

        // 返回响应
        return response.toString();
    }
    public static void main(String[] args) {
        try {
            String response = getGeoLocation();
            System.out.println(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

python

python 复制代码
import json
import socket
from urllib.request import urlopen, Request
from urllib.parse import urlencode

IP_API_URL = "http://ip-api.com/json/"

def get_geo_location():
    try:
        ip_address = socket.gethostbyname(socket.gethostname())
        print("IP地址: ", ip_address)

        url = IP_API_URL + "?ip=" + ip_address
        request = Request(url)
        request.add_header("Accept", "application/json")
        response = urlopen(request)
        data = json.loads(response.read().decode())

        country = data["country"]
        print("国家名称: ", country)

        province = data["regionName"]
        print("省名称: ", province)

        city = data["city"]
        print("城市名称: ", city)

        longitude = data["lon"]
        latitude = data["lat"]
        print("经纬度: ", longitude, ",", latitude)

        isp = data["isp"]
        print("运营商: ", isp)

        timezone = data["timezone"]
        print("时区: ", timezone)

        return data

    except Exception as e:
        print("获取位置信息失败: ", e)
        return None

if __name__ == "__main__":
    get_geo_location()

我的分享就到这里,欢迎大家在评论区讨论!

相关推荐
xieliyu.1 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
love530love1 小时前
LiveTalking 数字人项目 Windows 部署完全指南(EPGF 架构)
人工智能·windows·python·架构·livetalking·epgf
遇事不決洛必達2 小时前
【Python基础】GIL 锁是什么及其对爬虫的影响
爬虫·python·线程·进程·gil锁
星辰徐哥2 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥2 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约2 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee2 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐2 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs2 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐2 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计