通过 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)的主要内容,如果未能解决你的问题,请参考以下文章