前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP实现利用API获取IP所在城市

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

作者头像
刺_猬
发布2018-06-21 15:30:36
3.6K0
发布2018-06-21 15:30:36
举报
文章被收录于专栏:刺客博客

现在很多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://4ker.cc/ip.php

当然,这是我花半天研究出来的一种办法,我相信办法肯定不止一种,还有json截取之类的方法

有其他办法实现获取城市信息的同学欢迎与我交流

» 本文链接:PHP实现利用API获取IP所在城市

» 转载请注明来源:刺客博客

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档