用curl对ip地址归属地查询

作者: ymengyue | 来源:发表于2016-11-08 21:52 被阅读1299次

上一节测试题目

上一节测试题目都是将那些命令自己手动测试下。

curl 命令

curl命令是可以完成http和https协议的GET、POST、PUT等http请求的命令行工具,并且支持对请求设置代理。功能非常强大,可以用它来做linux的爬虫。由于今天我们不是主要介绍curl命令,所以我们只简单说下curl命令的GET请求。

用curl 发送GET请求

先看下命令:

curl -s http://ip.taobao.com/service/getIpInfo.php?ip=223.5.5.5

上面这个命令,就是向http://ip.taobao.com/servicce/getIpInfo.php发送http的get请求,并且带有参数ip=223.5.5.5。执行命令后显示的结果就是返回的查询结果,其中-s参数是不显示进度日志。

返回的json数据

看上图可以看到ip.taobao.com给我们返回的数据是json格式(一种数据存储格式)的,我们要想看具体的地理位置需要对此数据进行处理分析,将地理位置筛选出来。所以,需要将这些输出交给一个jq工具进行处理。那么如何将数据交个jq呢?用|管道符就可以将curl的结果转交给jq

|管道符

| 这个竖线符合,在linux下有特殊意义,它就是管道符号。

什么是管道

我们如果把linux下的命令都比喻成一个净水器的滤芯,它们分别可以过滤水中不同的杂质,那么管道符合就相当于连接两个滤芯的水管。而这个水管内运送的水,就代表上一个滤芯的标准输出,由管道将此标准输出送给下一个滤芯。然后这些水作为下一个滤芯的标准输入。

下面我们来简单演示下,先用vim test创建并编辑文件并输入下面内容:

hello wrold
hi 52robot.org

cat命令可以查看文件内容

#cat 命令可以将文件内容输出的终端
cat test

grep可以查找test文件含有52robot字符的行,并且在终端输出

grep "52robot" test

上面我门了解了catgrep命令,现在我们就可以用|将他们连接起来。

cat test| grep "52robot"

这个操作是先有cat命令将test文件的内容放到标准输出,然后通过管道符合|传给grep作为它的标准输入,这样grep命令最后也就不用再写文件名了。

发送请求并处理数据

上面我们了解了管道符,下面我们用将curl的结果交给jq试下:

curl http://-s ip.taobao.com/service/getIpInfo.php?ip=223.5.5.5|jq '.'
对json数据解析

这里我们简单介绍下jq怎么提取json里面的部分字段:
我们把json的数据理解成一个树状结构的一个字典,其中.代表这个最顶级的一个字典。而
.data代表json里面data关键字对应的键值;.data.country代表上文结果的中国.data.region代表上文的浙江省.data.city代表上文的杭州市
下面我们再来试试:

# 用+ 号可以将多个字段合并
curl -s http://ip.taobao.com/service/getIpInfo.php?ip=223.5.5.5|jq '.data.country + .data.region + .data.city'
只显示json的国家、省和市字段

可以看到这个结果这就是我们想要的地理位置,它包括了国家、省、市。

本节测试

自己尝试改改输出,可以将所属区域和网络接入运营商也加入的查询的结果。

下一节预告

下节我们会将本节的这个命令写入脚本,让它支持传入IP参数,并同时可以直接作为系统命令来调用。

关注我们了解更多原创文章

52Robot社区-二维码.jpg

相关文章

网友评论

  • luke_bei_:非常好,本来就像找一个在命令行下可以查IP的工具,作者用自己的思路提供了了一个很好的解决方案。

本文标题:用curl对ip地址归属地查询

本文链接:https://www.haomeiwen.com/subject/qymyuttx.html