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

时间:2019-07-04 13:43:26

标签: java geolocation minecraft bukkit

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

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

有什么可能的可能性,仅使用ip就能找到?

2 个答案:

答案 0 :(得分:0)

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

示例包括:

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

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

来自opencsv的文档:

  

要阅读,请创建一个Bean,以包含您要阅读的信息,   用opencsv批注对bean字段进行批注,然后执行以下操作:

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

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

答案 1 :(得分:0)

我建议使用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会禁止您这样做。