banner

JS+PHP合理调用淘宝查询IP归属API

前段时间做Yuan2.0的时候,要做一个评论者IP地址的归属地查询。

根据网上的资源来看,一般都是通过API查询,虽然提供免费查询的API很多,目前经典可用的就只有淘宝的API了。

ip-address

淘宝API采用的是JSON格式传送,所以我第一时间想到用JS(基于jquery)的Ajax查询。但问题来了,淘宝API不支持JSONP的传送,而JS又不能跨域。

所以,更换第二种方案,直接PHP查询。不过,这种方案刚开始还好,但后面问题来了。淘宝API有一个限制,10qps(每秒10次)。在一个有超过10条评论的页面,PHP的查询请求岂止每秒十次?而PHP也不可能做一个延迟。所以,超过10条评论的页面,直接挂了。

无奈之下,只能换一个折中的办法了。

构思:JS异步请求本站接口,而本站接口通过PHP在淘宝API上获取归属地查询。JS通过计数,每10条停留1秒,然后继续查询。

如此,JS没有了跨域问题,也能合理的请求淘宝API,无需申请什么appkey之类的了。


代码参考:

PHP代码部分

function ActivePlugin_demo(){
    Add_Filter_Plugin('Filter_Plugin_Cmd_Begin','demo_Cmd_Begin');
}
function demo_Cmd_Begin() {
    global $zbp;
    $action = GetVars('act','GET');
    if ($action == 'ipGetInfo') {
        $ip = GetVars('ip','GET');
        $ipjson = file_get_contents('http://ip.taobao.com/service/getIpInfo.php?ip=' . $ip);
        echo $ipjson;
        die();
    }
}

JS代码部分

/**
 * 获取IP归属信息
 * @param {string} ip ip地址
 * @param {string||element} elem 接收信息的选择器或element
 */
function GetIPInfoTBAPI(ip,elem) {
    var cmdComm = {};
    cmdComm.elem = $(elem);
    $.ajax({
        type : 'get',
        url : location.protocol+'//'+location.hostname+'/zb_system/cmd.php?act=ipGetInfo&ip='+ip,
        dataType : 'json',
        success : function(data) {
            if (data.code==0) {
                var str = '';
                if (data.data.country_id=='CN') {
                    str += data.data.region+data.data.city+'['+data.data.isp+']';
                } else {
                    str += data.data.country+' '+data.data.area;
                }
                cmdComm.elem.text("("+str+")")
            } else {
                cmdComm.elem.text('(没查到)');
            }
        },
        error : function(data) {
            console.log(data);
        }
    });
}

function GetIPInfo() {
    var cmdComm = {};
    cmdComm.ipNode = $('IP地址选择器');
    cmdComm.ipSum = cmdComm.ipNode.length;
    cmdComm.ipCount = 0;
    cmdComm.ipNum = 0;
    setTimeout(function(){
        var that = arguments.callee;
        for (var i=0;i<10;i++) {
            var ip = cmdComm.ipNode.eq(cmdComm.ipCount*10+i).attr('data-ip'); // 为了方便读取,我将IP存在data-ip上,不重要
            var elem = cmdComm.ipNode.eq(cmdComm.ipCount*10+i).find('IP归属信息显示选择器'); // 不重要
            GetIPInfoTBAPI(ip,elem);
            cmdComm.ipNum++;
            if (cmdComm.ipNum==cmdComm.ipSum) { // 所查询的数量=总数,停止循环
                break;
            }
        }
        cmdComm.ipCount++;
        if (cmdComm.ipNum!=cmdComm.ipSum) { // 所查询的数量!=总数,每隔1秒自动发起一次循环
            setTimeout(that,1000);
        }
    },300);
}

注意:上面的PHP和JS代码都是Yuan2.0模板主题中的定制性内容,仅供参考,如需使用,需要自行修改。

阅读: 10731
在同意共创许可协议(CC BY-NC-SA-4.0)的前提下,您可以转载本文。
橙色阳光
https://oss.so/article/66

相关阅读

留言评论

3条留言
nobird
提交评论后。。。不会直接显示。。。需要再刷新?
nobird
直接上ip纯真数据库吧,普通应用还是本地数据库靠谱,精准度也非常不错的了。吐槽验证码的input边缘好丑。。。
橙色阳光
纯真数据库这么大……好麻烦