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://4ker.cc/ip.php 当然,这是我花半天研究出来的一种办法,我相信办法肯定不止一种,还有json截取之类的方法 有其他办法实现获取城市信息的同学欢迎与我交流

» 本文链接:PHP实现利用API获取IP所在城市 » 转载请注明来源:刺客博客

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的SOD蜜

PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引

一、框架的由来  快速入门 有关框架的更多信息,请看框架官方主页! 本套框架的思想是借鉴Java平台的Hibernate 和 iBatis 而来,兼有...

2579
来自专栏黑白安全

PHP代码审计入门之路

虽然市面上的代码审计的文章已经一大把了,但是还是决定重复造轮子,打算作为一个系列来写的,近年越来越多的安全研究人员投入到php应用的漏洞挖掘,相对应的代码安全问...

652
来自专栏大前端_Web

解析Web Workers

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

592
来自专栏小狼的世界

Go学习入门

Go语言的历史要从贝尔实验室开始说起,我们知道贝尔实验室计算科学研究中心的肯•汤普逊 Ken Thompson 和丹尼斯 • 里奇 Dennis Ritchie...

892
来自专栏杨建荣的学习笔记

结合EM快速解决复杂的配置问题(r4笔记第91天)

图形工具在学习中一般是不作为推荐工具使用的,很多时候可能工作环境都是字符界面,远程连接,基本没有可能接触到图形工具,图形工具的好处真是一把双刃剑,功能丰富全面而...

2696
来自专栏FreeBuf

灵活布置、可二次开发的乌云公开漏洞及知识库搜索

*本文原创作者:grt1stnull,本文属FreeBuf原创奖励计划,未经许可禁止转载 感谢hanc00l爬取了wooyun的网页,才使乌云关闭后,大家依旧可...

1929
来自专栏大内老A

通过扩展改善ASP.NET MVC的验证机制[使用篇]

ASP.NET MVC提供一种基于元数据的验证方式是我们可以将相应的验证特性应用到作为Model实体的类型或者属性/字段上,但是这依然具有很多的不足。在这篇文章...

1615
来自专栏北京马哥教育

面试分享系列 | 17道Python面试题,让你在求职中无往不利

今天给大家分享的是Python面试题系列的第一篇文章,后续我也会陆续整理Python相关的问题给大家,无论是求职者还是新人都可以通过面试题来考察自己的能力缺陷。...

3134
来自专栏顶级程序员

什么是 C 和 C ++ 标准库?

简要介绍编写C/C ++应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的。

1093
来自专栏owent

Rust的第二次接触-写个小服务器程序

蛮久前入门了一下 Rust 语言。它的设计模型非常地吸引C/C++的开发者。但是学习语言嘛还是要练习一下,之前也用它给我们项目写了个命令行小工具。这回拿来写个小...

1473

扫码关注云+社区