阿里云

如何通过IP地址获取用户所在城市?

在日常开发过程中,经常有通过IP去获取用户位置,或在服务器日志中查看到各种各样的ip地址,如何通过ip地址去获取用户的信息呢?比如所在城市,网络提供商是联通,移动,电信呢,通过接口我们可以实现这些功能。


IP地址


一、前言


使用聚合数据的ip接口实现功能,thinkphp框架在3.2版本中有ip定位功能,至于3.2之前的版本就不清楚了,没用过,哈哈~~~~,为啥使用聚合数据的呢,有两个点吧,一接口完全免费,二接口代码明了简洁。接口需要appkey,到聚合官网自行申请。


二、接口示例


演示地址:https://www.shenlin.ink/open/tool/index.html


三、代码


1、控制器代码

<?php
/**
 * Created by PhpStorm.
 * User: 申霖
 * Date: 2019/7/25 0025
 * Time: 下午 6:18
 */
namespace app\api\controller;

use think\Controller;

class Tool extends Controller
{
    /**
     * view
     * @return \think\response\View
     * @author 申霖
     * @time 2019/7/25 0025 下午 7:08
     */
    public function index()
    {
        return view('tool/index');
    }
    /**
     * ip地址查询
     * @return \think\response\Json|\think\response\View
     * @author 申霖
     * @time 2019/7/25 0025 下午 6:37
     */
    public function ip()
    {
        $ip = input('post.ip');
        if($ip) {
            header('Content-type:text/html;charset=utf-8');
            //配置您申请的appkey
            $appkey = "ef25bc7b023de945d316b6a5*****";
            //************1.根据IP/域名查询地址************
            $url         = "http://apis.juhe.cn/ip/ip2addr";
            $params      = [
                "ip"    => $ip,//需要查询的IP地址或域名
                "key"   => $appkey,//应用APPKEY(应用详细页查询)
                "dtype" => "json",//返回数据的格式,xml或json,默认json
            ];
            $paramString = http_build_query($params);
            $content     = $this->juheCurl($url, $paramString);
            $result      = json_decode($content, true);
            if($result) {
                            if($result['error_code'] == '0') {
                                return json([
                                    'code' => 200,
                                    'msg' => 'success',
                                    'data' => $result['result']
                                ]);
                            } else {
                                return json([ 
                                    'code' => $result['error_code'],
                                    'msg' => $result['reason'],
                                    'data' => '' 
                                ]);
                            }
                        } else {
                            return json([ 'code' => 101, 'msg' => '请求失败', 'data' => '' ]);
                        }
        } else {
            return json(['code'=>100,'msg'=>'请输入IP']);
        }
    }

    /**
     *  请求接口返回内容
     * @param $url
     * @param bool $params
     * @param int $ispost
     * @return bool|mixed
     */
    public  function juheCurl($url, $params = false, $isPost = 0)
    {
        $httpInfo = [];
        $ch       = curl_init();

        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_USERAGENT, 'JuheData');
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        if($isPost) {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
            curl_setopt($ch, CURLOPT_URL, $url);
        } else {
            if($params) {
                curl_setopt($ch, CURLOPT_URL, $url . '?' . $params);
            } else {
                curl_setopt($ch, CURLOPT_URL, $url);
            }
        }
        $response = curl_exec($ch);
        if($response === FALSE) {
            //echo "cURL Error: " . curl_error($ch);
            return false;
        }
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $httpInfo = array_merge($httpInfo, curl_getinfo($ch));
        curl_close($ch);
        return $response;
    }
}


2、视图代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>IP地址查询</title>
    <meta name="keywords" content="IP,地址,查询">
    <meta name="description" content="IP地址查询">
    <link rel="icon" href="https://www.shenlin.ink/favicon.ico" type="image/x-icon"/>
    <link rel="stylesheet" href="/blog/css/layui.css">
    <style>
         .layui-form-item .layui-input-inline {
        width: 100%;
          }
           .layui-form {
        padding-top: 130px;
               width: 60%;
               margin: 0 auto;
               height: 100px;
         }

     .layui-btn {
        width: 100%;
         }
    </style>
</head>
<body>
<div class="layui-container">
    <form class="layui-form">
        <div class="layui-form-item">
            <div class="layui-input-inline">
                <input placeholder="请填写IP" name="ip" required lay-verify="required"
 class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-inline">
                <button class="layui-btn" lay-submit lay-filter="*">立即提交</button>
            </div>
        </div>
    </form>
</div>
<script src="/blog/jquery-2.1.4.min.js"></script>
<script src="/blog/layui.js"></script>
<script>
 layui.use(['layer', 'form'], function () {
      var form = layui.form, layer = layui.layer;
         form.on('submit(*)', function (data) {
        $.ajax({
            type: 'post',
                     url: '/open/tool/ip.html',
                     data: data.field,
                     async: false,
                     dataType: "json",
                     success: function (data) {
               if (data.code === 200) {
                 layer.open({
                    title: data.msg,
                                       content: "<p>地区:"
                                        + data.data.area + 
                                        "</p><p>服务商:" 
                                        + data.data.location + 
                                        "</p>"
                                   })
               } else {
                  layer.msg(data.data);
                             }
            },
                        error: function () {
               layer.msg("接口错误");
                       }
         });
             return false;
         });
     });
</script>
</body>
</html>


Html代码看起来永远是那么乱的~~~~~

喜欢就点个赞吧