通过 IP 获取地理位置(Spigot 1.8 和 1.13.2)

Posted

技术标签:

【中文标题】通过 IP 获取地理位置(Spigot 1.8 和 1.13.2)【英文标题】:Get Geolocation by IP (Spigot 1.8 & 1.13.2) 【发布时间】:2019-07-04 13:43:26 【问题描述】:

我只想通过提供 IP 地址来找出地理位置。 我的目标是保存城市、国家、邮政编码和其他信息。

CraftPlayer cp = (CraftPlayer)p;
String adress = cp.getAddress();

任何简短的可能性,仅通过使用 ip 就可以找到?

【问题讨论】:

使用这样的 API:baeldung.com/geolocation-by-ip-with-maxmind 您想托管自己的本地数据库进行查询吗?如果是,您可以从lite.ip2location.com/database/…下载并使用免费数据库 是的,托管自己的数据库会很棒。 ip2loc 数据库看起来不错。是否有任何简单的可能性,仅通过提供 ipv4 从文件中返回信息? 【参考方案1】:

我推荐使用http://ip-api.com/docs/api:newline_separated

然后您可以选择您需要的信息并创建您的 HTTP 链接,例如:

http://ip-api.com/line/8.8.8.8?fields=49471

本例中的结果是:

success
United States
US
VA
Virginia
Ashburn
20149
America/New_York

因此,您可以在 Java 中创建一个方法来读取 HTTP 并将其拆分为 \n 以获取行:

private void whatever(String ip) 
    String ipinfo = getHttp("http://ip-api.com/line/" + ip + "?fields=49471");
    if (ipinfo == null || !ipinfo.startsWith("success")) 
        // TODO: failed
        return;
    
    String[] lines = ipinfo.split("\n");
    // TODO: now you can get the info
    String country = lines[1];
    /*
    ...
     */


private static String getHttp(String url) 
    try 
        BufferedReader br = new BufferedReader(new InputStreamReader(new URL(url).openStream()));
        String line;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) 
            sb.append(line).append(System.lineSeparator());
        
        br.close();
        return sb.toString();
     catch (IOException e) 
        e.printStackTrace();
    
    return null;

请确保不要在短时间内创建太多查询,因为 ip-api.com 会禁止您这样做。

【讨论】:

【参考方案2】:

有很多网站提供免费的 IP 地理定位数据库。

示例包括:

MaxMind IP2Location

在插件启动时,您可以下载其中一个数据库,然后在运行时在本地查询它。

如果您选择下载 .bin 格式,则必须初始化本地数据库,然后导入数据。否则,您可以将 csv 文件与 opencsv 之类的 Java 库一起使用。

来自opencsv的文档:

为了阅读,创建一个 bean 来存放你想要阅读的信息, 使用 opencsv 注释对 bean 字段进行注释,然后执行以下操作:

List<MyBean> beans = new CsvToBeanBuilder(FileReader("yourfile.csv"))
    .withType(Visitors.class).build().parse();

文档链接:http://opencsv.sourceforge.net

【讨论】:

以上是关于通过 IP 获取地理位置(Spigot 1.8 和 1.13.2)的主要内容,如果未能解决你的问题,请参考以下文章

django - 如何通过浏览器 IP 获取位置

通过网络请求获取当前IP,并得到大致位置

如何使用 Google API 通过独立的 Java 类获取 IP 地址的位置?

php 怎么通过ip来获取所在位置

前端页面获取访问者的IP地址经纬度和地理位置

php获取了ip地址,用php怎么获取ip的地理位置?请大虾赐教!