范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

PHPPython二分查找法获取IP地理位置

  最近今日头条上线了在创作者个人主页"更多信息"里显示创作者的地理位置。今日头条是为了加强建设健康、优质、有益、多元的网络生态。但功能上线后曝光了一些人性虚伪的层面。有些V账号的个人主页的地理位置与创作内容说的地理位置不同。让大众着实笑笑解千仇了一下。今天为大家介绍PHP/Python两种编程语言利用二分查找法获取IP地理位置。功能考虑IP段和指定IP两种情况的地理位置处理。
  一、PHP二分查找法获取IP地理位置
  1、PHP获取用户客户端IP地址<?php function getClientIp() { 	$strUip = ""; 	if (isset($_SERVER["HTTP_X_BD_USERIP"]) && $_SERVER["HTTP_X_BD_USERIP"] && strcasecmp($_SERVER["HTTP_X_BD_USERIP"], "unknown")) {             $strUip = $_SERVER["HTTP_X_BD_USERIP"];         } else if (!empty($_SERVER["HTTP_CLIENTIP6"])) {             $strUip = $_SERVER["HTTP_CLIENTIP6"];         } else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]) && strcasecmp($_SERVER["HTTP_X_FORWARDED_FOR"], "unknown")) {             $strUip = $_SERVER["HTTP_X_FORWARDED_FOR"];             strpos($strUip, ",") && list($strUip) = explode(",", $strUip);         } else if (!empty($_SERVER["HTTP_CLIENT_IP"]) && strcasecmp($_SERVER["HTTP_CLIENT_IP"], "unknown")) {             $strUip = $_SERVER["HTTP_CLIENT_IP"];         } else if (!empty($_SERVER["REMOTE_ADDR"]) && strcasecmp($_SERVER["REMOTE_ADDR"], "unknown")) {             $strUip = $_SERVER["REMOTE_ADDR"];         }                  return $strUip; }  $strUip = getClientIp(); var_dump($strUip); 执行结果: string(15) "183.199.168.188"
  2、PHP二分查找法获取IP地理位置<?php function search_ip_addr_recursion($arrIp, $intLow, $intHigh, $intIp) {   $intMiddle = intval(($intLow + $intHigh) / 2);   if ($intLow > $intHigh) {         return -1;   }   //处理指定ip逻辑   if (isset($arrIp[$intMiddle]["ip"])) {     $intMiddleIp = ip2long($arrIp[$intMiddle]["ip"]);   } else {     //处理ip段逻辑     $intMiddleStartIp = ip2long($arrIp[$intMiddle]["range"]["s"]);     $intMiddleEndIp = ip2long($arrIp[$intMiddle]["range"]["e"]);   }   if (isset($intMiddleIp) && $intMiddleIp == $intIp) {     return $intMiddle;   }   if (isset($intMiddleStartIp) && $intIp >= $intMiddleStartIp && $intIp <= $intMiddleEndIp) {     return $intMiddle;   }   //处理指定ip逻辑   if (isset($intMiddleIp) && $intIp > $intMiddleIp) {     return search_ip_addr_recursion($arrIp, $intMiddle + 1, $intHigh, $intIp);   } elseif (isset($intMiddleIp) && $intIp < $intMiddleIp) {     return search_ip_addr_recursion($arrIp, $intLow, $intMiddle - 1, $intIp);   }   //处理ip段逻辑   if (isset($intMiddleEndIp) && $intIp > $intMiddleEndIp) {     return search_ip_addr_recursion($arrIp, $intMiddle + 1, $intHigh, $intIp);   } elseif (isset($intMiddleEndIp) && $intIp < $intMiddleEndIp) {     return search_ip_addr_recursion($arrIp, $intLow, $intMiddle - 1, $intIp);   }   //if代码是一条垂线下来 }  //ip测试 $arrIp = array(   array("ip" => "202.132.13.12", "addr" => "北京"),   array("range" => array("s" => "212.12.24.12", "e" => "212.13.25.14"), "addr" => "山西"),   array("range" => array("s" => "212.13.25.15", "e" => "212.15.25.14"), "addr" => "河北"), ); $intIp = ip2long("212.12.24.13"); //$intIp = ip2long("202.132.13.12"); $intIndex = search_ip_addr_recursion($arrIp, 0, count($arrIp), $intIp); var_dump($intIndex); if (-1 === $intIndex) {   var_dump("None"); } else {   var_dump($arrIp[$intIndex]); } 执行结果: int(1) array(2) {   ["range"]=>   array(2) {     ["s"]=>     string(12) "212.12.24.12"     ["e"]=>     string(12) "212.13.25.14"   }   ["addr"]=>   string(6) "山西" }
  二、Python二分查找法获取IP地理位置
  1、Python获取用户客户端IP地址import requests  def getClientIp(res):     strUip = "";     if res.headers.get("HTTP_CLIENTIP6") is not None:         strUip = res.headers.get("HTTP_CLIENTIP6")     elif res.headers.get("HTTP_X_FORWARDED_FOR") is not None and res.headers.get("HTTP_X_FORWARDED_FOR") != "unknown":         strUip = res.headers.get("HTTP_X_FORWARDED_FOR")     elif res.headers.get("HTTP_CLIENT_IP") is not None and res.headers.get("HTTP_CLIENT_IP") != "unknown":         strUip = res.headers.get("HTTP_CLIENT_IP")     elif res.headers.get("REMOTE_ADDR") is not None and res.headers.get("REMOTE_ADDR") != "unknown":         strUip = res.headers.get("REMOTE_ADDR")     elif res.headers.get("HTTP_X_BD_USERIP") and res.headers.get("HTTP_X_BD_USERIP") != "unknown":         strUip = res.headers.get("HTTP_X_BD_USERIP")      return strUip;  res = requests.get("https://www.baidu.com")  strUip = getClientIp(res); print(strUip); 执行结果: 183.199.168.188
  2、Python二分查找法获取IP地理位置import socket, struct  def isset(arr, key): 	try: 		type(arr[key]) 	except: 		return False 	return True  def ip2long(strIp): 	return struct.unpack("!L", socket.inet_aton(strIp))[0]  def search_ip_addr_recursion(arrIp, intLow, intHigh, intIp):   intMiddle = int((intLow + intHigh) / 2)   if intLow > intHigh:         return -1   if isset(arrIp[intMiddle], "ip"):     intMiddleIp = ip2long(arrIp[intMiddle]["ip"])     if intMiddleIp == intIp:         return intMiddle     if intIp > intMiddleIp:         return search_ip_addr_recursion(arrIp, intMiddle + 1, intHigh, intIp)     elif intIp < intMiddleIp:         return search_ip_addr_recursion(arrIp, intLow, intMiddle - 1, intIp)   else:     intMiddleStartIp = ip2long(arrIp[intMiddle]["range"]["s"])     intMiddleEndIp = ip2long(arrIp[intMiddle]["range"]["e"])     if intIp >= intMiddleStartIp and intIp <= intMiddleEndIp:         return intMiddle     if intIp > intMiddleEndIp:         return search_ip_addr_recursion(arrIp, intMiddle + 1, intHigh, intIp)     elif intIp < intMiddleEndIp:         return search_ip_addr_recursion(arrIp, intLow, intMiddle - 1, intIp)  arrIp = [    {"ip": "202.132.13.12", "addr":"北京"},   {"range": {"s": "212.12.24.12", "e": "212.13.25.14"}, "addr": "山西"},   {"range": {"s": "212.13.25.15", "e": "212.15.25.14"}, "addr": "河北"}, ] intIp = ip2long("212.12.24.13"); #intIp = ip2long("202.132.13.12"); intIndex = search_ip_addr_recursion(arrIp, 0, len(arrIp), intIp); print(intIndex) if -1 == intIndex:   print("None") else:   print(arrIp[intIndex]) 执行结果: 1 {"range": {"s": "212.12.24.12", "e": "212.13.25.14"}, "addr": "山西"}
  三、总结Python的代码是根据PHP代码平移过来的。PHP函数用Python函数替换或def定义。语言语法按标准替换就行。 查找方法需要将ip段按从小到大排好顺序可以写入内存中减少不必要的查询。 头条有定义"I P属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区) "。表示IP需要实时或定时的与运营商IP信息同步。数据上可能存在时差的情况。IP信息的定义可以更丰富更全个人只是测试代码用。
  大家有什么更好的解决方案或算法可以发评论沟通。业务上都是调别人的接口像百度都是调用百度地图的开放API接口。
  Go语言的等我把Golang学的再深入一点再介绍给大家[呲牙]。
  感谢大家的评论、点赞、分享、关注…

Windows11真的来了,版本号21H2,预计RTM正式版今年10月份发布据可靠消息,近日微软发布了Windows11InsiderPreviewBuild22000。100。之前流出的是Dev版,即开发版,面向广大开发者,Bug比较多。现在,微软通过B迎战双11优惠季,看华为MateStationX一体机打造至简第一趴随着5G时代的来临,智能科技产品自然成为了这个时代下不可或缺的必备品,无论是办公亦或是家用,大家似乎都会格外注重它的颜值以及内在品质。正如我们日常形影不离的电脑,如何做到简约而不简极氪001口碑加速破圈,趁限时尊享权益10月31日结束前速速下手最近,一场颇具仪式感的交车仪式惹得众网友纷纷化身柠檬精。而举办这场交车仪式的品牌,正是纯电车圈的当红炸子鸡极氪。作为一家用户型企业,为了回馈用户的期待,从产品到服务,极氪一直在创造高合汽车成立西部软件研发基地,高质量服务汽车智能化发展近年来,汽车电动化和智能化趋势不断加快,软件定义汽车的时代正在到来,以场景定义设计软件定义汽车共创定义价值三大理念为基础的高合汽车也在不断加快探索人工智能智能网联等前沿技术。日前,如何使用戴尔官方工具制作Windows或Linux安装U盘?本文适用于初级IT工程师或桌面运维工程师,IT大神请直接忽略。问题描述个别情况下,自己制作的安装U盘无法安装,或稳定性不能保证,如果使用品牌官方提供的制作工具,制作安装U盘?现在以华为nova9系列影像实力尽显,让你怎么拍都好看随着智能手机走进人们的生活,当下的年轻人对于手机也有了更高的要求。华为为了满足当下年轻人对于手机的需求,最近上市了一款全新华为nova9系列手机,这款手机满足当下年轻人对于智能手机家电科普蒸箱烤箱蒸烤一体机和蒸烤一体集成灶有哪些不同随着人们的生活水平在不断地提高,科技也在不断地发展,为了生活能更便捷,家电本着为使用者提供便利的原则,也在不断地进步。说起家电,在日常生活中,家电需求占比最大的就是厨房家电,大到蒸会不会是升级鸿蒙系统HarmonyOS之前的最后一个安卓版本更新?由于花粉俱乐部突然宣布维护15天(自2021年7月26日0点2021年8月9日22点),详见华为花粉俱乐部维护15天所以,针对荣耀X10机型的鸿蒙系统HarmonyOSnolog内大多数人不知道的WPSOffice隐藏功能,不买会员也可以关闭广告作为一家源自中国的科技公司,过去三十一年金山办公始终致力于把最简单高效的办公体验和服务带给每个人每个家庭每个组织,帮助个人更轻松快乐的创作和生活,帮助企业和组织更高效的运行与发展。以退为进,教你如何发现潜在的市场拐点准确预测市场底部和顶部并不是一件容易的任务,即使是最有经验的交易员和投资者。大多数情况下,预测市场是涨是跌都是对半开。尽管某些情况会让我们产生倾向性,但这都不足以做出预测。相反,思外汇局正研究论证允许个人在5万美元额度内开展境外投资国家外汇管理局资本项目管理司司长叶海生今日在中国外汇微信公号撰文指出,外汇局正在研究有序放宽个人资本项下业务限制,以及取消年度购付汇额度限制,优化管理流程。叶海生称,外汇局正在研究
男子在路边玩手机,看到正在掉头的特斯拉,下一秒求生欲爆发了近日,路边监控拍下了这一幕,隔着屏幕都能感受到,蹲在路边玩手机的小伙求生欲有多强!画面中显示,一男子在马路边蹲着玩手机,这时候他一抬头发现了准备掉头的特斯拉,下一秒男子的求生欲爆发一个7人的iOS开发团队竟然三个月左右才能兼职完成像微信类的社交软件项目,难道都是这样?做个百度你竟然要10天,不就一个页面吗确实有点慢!正常来说睡一宿觉做个梦,活就应该出来了!你这样说叫腾讯张小龙拿上亿年薪情何以堪啊!7个人三个月做出来的只是一个能看样子,先来个10为什么现在没有2K分辨率的直屏手机了?正在挑选手机的网友可能会发现了,今年曲面屏手机虽然仍然占据主流,但手机厂商也开始推出一些非全面屏的直屏手机了,这说明直屏手机还是有一定市场需求的。事实上很多网友都对曲面屏手机产生了520快到了,想送一台手机给女友,老哥们FindX3怎么样?我觉得买FindX3这台手机送给女朋友是可以的,我个人也在用这款手机,各方面感觉都不错,就说一下我的使用感受吧,给楼主一个参考。首先FindX3的手感我是很喜欢的,当初一拿到手机的能不能分享一张你手机相册里最美的日出或日落的照片?天还蒙蒙亮,就准备好了各种钓鱼的用具,穿上了保暖钓鱼服。上了事先租好的船,开船的师傅嗓门很大声寒暄几句,我们就开启了钓鱼的旅途出海了。清风习习,一片寂静。只听见船的马达声和海水水撞换手机,通讯录怎么转移?现在大家每隔两三年就会换手机,快的可能一两年。换手机其实很简单,有钱就行。但是,旧手机上的东西怎么转移出来呢?今天,我们就先来聊聊转移通讯录的问题。通用法一导入SIM卡通讯录我们可互联网厨电领域领导企业,纯米科技完成1。1亿元D轮融资商道创投网5月9日官方获悉纯米科技近日正式宣布完成1。1亿元D轮融资,投资方是由鼎晖百孚独家投资。用四品牌布局万亿厨电市场成立于2013年5月的纯米科技,以互联网厨电为起点,以物联什么样的创业团队是高质量团队?创业绝对不是一个人孤军奋战,它是一项聚合人力物力,实现资源最优化配置和最合理运营的行为。创业需要团队,尤其是高质量的团队。但什么样的团队是高质量呢?1学习能力强。创业初期,我们会遇为啥大学生一定要学Python,这六大理由还不够嘛?我们知道Python已经有30多年历史了,然而真正火起来是最近几年。随着人工智能的热潮,Python逐渐成为一门非常受年轻猿们喜爱的语言。那么为什么要学习Python呢?今天就来告什么手机有电视机遥控器功能?你好,我是极客小何。什么手机有电视机遥控器功能?emmm,只要手机有红外线硬件,理论就可以进行遥控电视。而这类手机十分多。小米自米3以后系列(除了部分红米)几乎全都可以进行遥控电视AirPods3或将在本月发布,新功能抢眼相信有不少朋友都在等AirPods3。毕竟作为TWS耳机的引领者,苹果AirPods一直都很受消费者的欢迎,全新新品自然是备受期待的。此前苹果春季新品发布会上,虽然有iPadPro