PHP实现利用API获取IP所在城市

现在很多IP的接口api很多我例举几个常用的出来:

http://int.dpool.sina.com.cn/iplookup/iplookup.php //新浪
http://ip.ws.126.net/ipquery //网易
http://myip.ustclug.org/ //中科大
http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址] //淘宝

返回值大同小异,有些为json格式,有些为普通的文本格式,我们接下来从新浪的API入手。
首先判断新浪接口,应该是可以加上?ip=[ip地址]来获取的,这样就更加精准获取IP地址。
因为直接使用PHP的 file_get_contents($url) 返回值可能会出现获取到服务器的IP地址,而不是本地访问地址的情况。
所以解决办法如下:

$ip = $_SERVER["REMOTE_ADDR"];
$url="http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=$ip"; //获取API值

这样就能获取到类似:

1 -1 -1 中国 云南 昆明

接下来从获取的参数入手,先考虑下截取字符串,把文字之前的字符删掉,我们可以用:

mb_substr($html,10,30,'gb2312'); //取$html变量的9-29的内容,删掉之前的字符

注意上面的gb2312,因为API的问题,获取的返回值为gb2312格式,取的时候需要带上编码。
截取之后效果如下:

中国 云南 昆明

嗯,效果快出来了,但是还有些莫名其妙的空格。我们接着清除多余的空格:

preg_replace('/[(\xc2\xa0)|\s]+/','', $iip); //删除$iiip中的空格

删除之后效果如下:

云南昆明

我已经把之前的中国删掉了,想保留的可把mb_substr($html,10,30,'gb2312'); 中的10改为7左右,即可出现国家代码,
这样可以统计国外的国家,国内自然没多大必要。
之后把获取的值gb2312转换为utf8,方便存入数据库,防止数据库乱码

iconv("gb2312","utf-8//IGNORE",$iipp); //api默认格式为gb2312,转换为utf-8格式

把获取之后的值存为变量,更新数据库值改为变量值即可存入数据库,就能统计用户登陆地址啦。
附上我的全部代码:

<?php
$ip = $_SERVER["REMOTE_ADDR"]; //获取当前IP
$url="http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=$ip";   //获取API值
$html = file_get_contents($url);   //赋值为html变量
$iip=mb_substr($html,7,30,'gb2312');  //截取9-29的数字,前面为字母,丢弃
$iipp=preg_replace('/[(\xc2\xa0)|\s]+/','', $iip);   //删除字符串中的空格
$iiip = iconv("gb2312","utf-8//IGNORE",$iipp);  //api默认格式为gb2312,转为utf-8
echo  $iiip;
?>

在线使用这个工具,直接调用即可,可返回地区
https://d.3s.work/ip.php
当然,这是我花半天研究出来的一种办法,我相信办法肯定不止一种,还有json截取之类的方法
有其他办法实现获取城市信息的同学欢迎与我交流

» 本文链接:PHP实现利用API获取IP所在城市
» 转载请注明来源:刺客博客
» 如果文章失效或者安装失败,请留言进行反馈。
评论 ( 2)
  1. avatar
    沙发

    Admiring the hard work you put into your website and in depth information you present.

    It’s great to come across a blog every once in a while that isn’t the same old rehashed material.
    Great read! I’ve saved your site and I’m including your RSS feeds to
    my Google account.

  2. avatar
    板凳
    文科 2018-02-09 14:38

    php