
JS+PHP合理调用淘宝查询IP归属API
😂 这篇文章最后更新于1841天前,您需要注意相关的内容是否还可用。
前段时间做Yuan2.0的时候,要做一个评论者IP地址的归属地查询。
根据网上的资源来看,一般都是通过API查询,虽然提供免费查询的API很多,目前经典可用的就只有淘宝的API了。
淘宝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模板主题中的定制性内容,仅供参考,如需使用,需要自行修改。