使用 GeoIP2 获取 IP 的地理位置

 准备工作

  • 数据库 : 解析 IP 地理位置的的数据库来自 GeoLite2 开源数据库: https://dev.maxmind.com/geoip/geoip2/geolite2/ 。
  • C 语言 API : 使用的 API 是 maxmind 官网的开源项目 libmaxminddb, 地址是 https://github.com/maxmind/libmaxminddb 。

准备好这两个就可以了。


 2. 敲代码

我使用的操作系统是 CentOS7.1。

2.1 编译 libmaxminddb
把 libmaxminddb 的代码下载下来,随便放在什么地方, 然后解压,进入解压后的目录,执行 bootstrap,configure,make

复制代码
$ tar xzf libmaxminddb-1.3.1.tar.gz
$ cd libmaxminddb-1.3.1
$ ./bootstrap
$ ./configure
$ make
复制代码

1.在执行 bootstrap 的时候可能会报错,应该是缺少 autoconf 之类的自动构建工具导致的,到谷歌或者百度查询一下安装即可。

2.在执行 make 命令的时候,也会报错,不过报错信息指向的是 libmaxminddb-1.3.1/t 里面缺少 libtap/tap.h。 https://github.com/pozorvlak/libtap 是 libtap 在 GitHub 上的地址, 其项目首页上的注释是:Testing library for C, implementing the Test Anything Protocol. Written by Nik Clayton.

既然是测试使用的,那么不编译应该也没什么大问题。

3.看 make 命令后的编译记录,可以发现 libmaxminddb.a 静态链接库已经编译好了, 并且放在了 libmaxminddb-1.3.1/src/.libs 目录里面。

复制代码
[root@fengbo libmaxminddb-1.3.1]# ls src/.libs/ -l
total 312
-rw-r--r--. 1 root root  12632 Dec  8 22:30 data-pool.o
-rw-r--r--. 1 root root 111620 Dec  8 22:30 libmaxminddb.a
lrwxrwxrwx. 1 root root     18 Dec  8 22:30 libmaxminddb.la -> ../libmaxminddb.la
-rw-r--r--. 1 root root    959 Dec  8 22:30 libmaxminddb.lai
lrwxrwxrwx. 1 root root     21 Dec  8 22:30 libmaxminddb.so -> libmaxminddb.so.0.0.7
lrwxrwxrwx. 1 root root     21 Dec  8 22:30 libmaxminddb.so.0 -> libmaxminddb.so.0.0.7
-rwxr-xr-x. 1 root root  79477 Dec  8 22:30 libmaxminddb.so.0.0.7
-rw-r--r--. 1 root root 100104 Dec  8 22:30 maxminddb.o
复制代码

2.2 编写示例代码

示例代码是从 maxmind 的官方 GitHub 上直接复制下来的。不过我加了几条日志信息。 https://github.com/maxmind/libmaxminddb/blob/master/doc/libmaxminddb.md#example

代码如下:$cat example.c

  View Code

编译我们的示例代码:

把 libmaxminddb 源码中的 libmaxminddb-1.3.1/include/maxminddb_config.h 和 libmaxminddb-1.3.1/include/maxminddb.h 放到 example.c 所在的目录下。 还有 libmaxminddb-1.3.1/src/.libs/libmaxminddb.a 也要放进来。

复制代码
$ gcc -o example example.c ./libmaxminddb.a
$ ls 
example  example.c libmaxminddb.a  maxminddb_config.h  maxminddb.h
复制代码

2.3 下载 GeoLite2 开源数据库
到网页 https://dev.maxmind.com/geoip/geoip2/geolite2/ 中,下载 GeoLite2 的数据库。

Downloads

Database MaxMind DB binary, gzipped CSV format, zipped
GeoLite2 City Download (md5 checksum) Download (md5 checksum)
GeoLite2 Country Download (md5 checksum) Download (md5 checksum)
GeoLite2 ASN (Autonomous System Number) Download (md5 checksum) Download (md5 checksum)

我下载的是 GeoLite2 City 数据库。解压后的文件如下:

[root@fengbo maxmind]# ls GeoLite2-City_20171205/
COPYRIGHT.txt  GeoLite2-City.mmdb  LICENSE.txt  README.txt

2.4 测试一下这个程序的效果
先拿到一个 IP,比如 www.fengbohello.top 的 IP。

[root@fengbo maxmind]$ ping www.fengbohello.top
PING www.fengbohello.top (139.199.212.133) 56(84) bytes of data.
64 bytes from 139.199.212.133: icmp_seq=1 ttl=48 time=41.7 ms

运行一下 example 试试看:

  View Code

我擦,解析结果居然是北京。我问了十三哥,他说我们的服务器是腾讯云的,当时选择的是深圳机房。

下面是使用不同的厂商得到的结果:

厂商 地理位置
百度 广东省广州市 腾讯集团
ip.cn 广东省深圳市 腾讯云
freegeoip.net China.Beijing
新浪:int.dpool.sina.com.cn 中国.广东.广州
淘宝:ip.taobao.com 中国.华南.广东省.广州市.电信
腾讯:ip.qq.com 中国广东省广州市 未知

有意思吧,我也不知道该信谁的。



本文转自郝峰波博客园博客,原文链接:http://www.cnblogs.com/fengbohello/p/8144788.html,如需转载请自行联系原作者

你可能感兴趣的:(使用 GeoIP2 获取 IP 的地理位置)