使用 API 和离线库查询 IP 地址方法详解

举报
kwan的解忧杂货铺 发表于 2024/11/04 21:52:03 2024/11/04
【摘要】 @TOC互联网监管部门要求公开 IP 归属地,引起了很大热度,但作为平台或企业的开发者不能只凑个热闹,使用 IP 地址查询尤为重要。IP 地址是实现网络互通的条件之一,通过查询 IP 地址,可获取地理位置、时区、经纬度、运营商等信息,为金融、电商、广告、网安行业提供流量分析、网络安全等技术支持。因为 IP 数据云查询的数据维度多,定位精准,所以下面以它为例,教大家如何进行 IP 地址查询。 ...

@TOC

互联网监管部门要求公开 IP 归属地,引起了很大热度,但作为平台或企业的开发者不能只凑个热闹,使用 IP 地址查询尤为重要。
IP 地址是实现网络互通的条件之一,通过查询 IP 地址,可获取地理位置、时区、经纬度、运营商等信息,为金融、电商、广告、网安行业提供流量分析、网络安全等技术支持。因为 IP 数据云查询的数据维度多,定位精准,所以下面以它为例,教大家如何进行 IP 地址查询。

一、IP 地址查询能获取哪些信息

1.地理位置信息

  • 国家:IP 所属的国家或地区。
  • 城市:IP 所在的城市或省份信息。
  • 区县或街道:用高精准定位的产品,可以定位到街道
  • 经纬度:IP 地址大致对应的地理坐标。

2.网络信息

  • 互联网服务提供商(ISP):提供该 IP 地址的网络服务商。
  • 自治系统编号(ASN):分配给 IP 地址段的自治系统编号,标识网络的运营商。

3.网络类型

  • 数据中心 IP:区分 IP 是否属于家庭用户、商业用户或数据中心。
  • 代理、Tor 节点:识别 IP 地址是否使用了虚拟专用网络、代理服务或 Tor 匿名网络。

开发者或企业可以根据业务需求,使用 IP 归属地、IP 应用场景、IP 风险画像产品等产品,或数据定制。

二、IP 地址查询方法,附代码

个人少量查询可选择在线查询,对企业或平台,需要大量的 IP 地址查询,建议使用 API 或离线库查询方式。

在线 IP 查询 API 查询 离线库查询
更新频率 实时更新 实时更新 依赖于数据库更新频率,可选择日更、周更、月更等
批量查询 不能批量查询 支持大规模批量查询,取决于 API 服务的配额和限制 支持大规模批量查询,查询速度受限于本地硬件
网络 完全依赖网络,需要持续的网络连接 需要网络连接,API 调用需要访问外部服务器 不依赖网络,本地查询,不受网络状态影响
支持 IP 类型 IPv4 和 IPv6 IPv4 和 IPv6 IPv4 和 IPv6
响应速度 受网络延迟和服务器负载影响 取决于 API 响应速度和网络状况 查询在本地进行,无网络延迟
操作复杂度 简单,适合非技术人员使用 需要一定开发集成和配置,但可自动化 需要下载、部署数据库文件和编写查询脚本
适用场景 少量查询、个人或临时使用 批量查询、企业级应用、广告验证、用户分析等场景 大规模数据处理、网络优化、流量调度等场景

1.在线查询 IP 地址方法

查询地址:https://www.ip66.net/?utm-source=kol&utm-keyword=?2753
直接输入 IP 地址,根据套餐返回相应的结果,每日可免费查询

2.使用 API 进行 IP 地址查询

https://www.ipdatacloud.com/?utm-source=kol&utm-keyword=?2752】
首先根据需求购买数据后,获取 api 接口的 key
接口地址:https://api.ipdatacloud.com

image-20241102110141396

请求说明:

image-20241102110155715请求方法(java 示例代码):

public static void main(String[] args) throws IOException, InterruptedException {
    String urlArr = "https://api.ipdatacloud.com/v2/query?ip=&key=";
    HttpClient httpClient = HttpClient.newBuilder().build();
    HttpRequest getRequest = HttpRequest.newBuilder()
            .GET()
            .uri(URI.create(urlArr))
            .build();

    // 发送GET请求并获取响应
    HttpResponse<String> resp = httpClient.send(getRequest, HttpResponse.BodyHandlers.ofString());

    //对返回的json数据做解析
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode rootNode = objectMapper.readTree(resp.body());
    String data = rootNode.get("data").get("location").asText();
    Location location = objectMapper.readValue(data, Location.class);
    System.out.println(location.toString());
}

输出说明:

image-20241102110225519

3.使用离线库进行 IP 地址查询

在需要大规模查询或高效访问时,可以考虑使用本地缓存或 IP 离线库。这种方式可以在本地处理查询请求,减少对外部 API 的依赖
首先获取 IP 离线库【https://www.ipdatacloud.com/?utm-source=kol&utm-keyword=?2752】,以下是查询java代码示例(内存版):

package com.ipdatacloud.search;import java.io.IOException;
public class Test {
    public static void main(String[] args) throws IOException {
        /*
          getInstanceFileIpv4() ipv4文件版查询
          getInstanceFileIpv6() ipv6文件版查询
          getInstanceMemIpv4() ipv4内存版查询
          getInstanceMemIpv6() ipv6内存版查询
         */
        // 1.实例化查询类
        Search finder = Search.getInstanceMemIpv4("file_path");

        // 2.执行查询
        String res = finder.get("ip_address");

        // 3.解析查询结果
        Location location = new Location(res);
        System.out.println(location.getContinent());        // 大洲
        System.out.println(location.getCountry());          // 国家
        System.out.println(location.getProvince());         // 省份
        System.out.println(location.getCity());             // 城市
        System.out.println(location.getDistrict());         // 区县
        System.out.println(location.getIsp());              // 运营商
        System.out.println(location.getAreaCode());         // 区域代码
        System.out.println(location.getCountryEnglish());   // 国家/地区英文
        System.out.println(location.getCountryCode());      // 国家/地区英文简写
        System.out.println(location.getLongitude());        // 经度
        System.out.println(location.getLatitude());         // 纬度
        System.out.println(location.getElevation());        // 海拔
        System.out.println(location.getZipCode());          // 邮编
        System.out.println(location.getCityCode());         // 城市代码
        System.out.println(location.getWeatherStation());   // 气象站
        System.out.println(location.getAsn());              // ASN码
        System.out.println(location.getPreserve());         // 预留
        System.out.println(location.getStreet());           // 街道
        System.out.println(location.getTimeZone());         // 时区
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。