搜尋
首頁php教程php手册基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用

我们都知道,在很多的网站都提供了给用户提供天气预报的功能,有时会发现,用户即使不输入任何和自己有关的地理位置信息,同样的网站也可以去判断地理位置并且显示天气信息,我们可能会想到用ip去判断地理位置,的确是这样,但是,如果想自己一样完全的开发,确实有一点麻烦,所以这里简单的说一下这个应用的业务逻辑(以用户第一次打开页面为起点):

1:获取ip:ip按照我自己的说法有两种,一种是独立ip,真实存在,另一种是路由器分配的ip,这个当然不具有某种意义上的唯一性,这两种ip当然都要考虑,第一种非常容易或得,取$_SERVER内的元素值就可以,但问题是第二种,像192.168.1.1这样的是无法判断的,那么就没法处理或得用户的位置信息,这里本来采用curl的扩展来抓取的,但是这个扩展说什么就是无法使用,所以这种情况先放在一边,仅考虑用户使用独立ip访问的情况。

这里补充一下,server的参数不是server_addr而是REMOTE_ADDR,只有这样才能取到用户的真是地址,这样的话就不用麻烦的取另外处理

2:当我们获取ip之后就应该根据ip地址库去查找用户的ip所在地,这里有两个地方需要注意,1:ip地址库必须为utf-8编码,2:或得的信息是一个完整的地址信息,而后面需要城市名称局可以,所以,要做一下字符串的截取,或得简化城市地址。

3:当或得了用户的地址显然还是不行,想想,最终于天气接口对接获取数据的是城市代码,这两个还是要转化一下,这里我采用了暴力的办法遍历城市代码库或得该城市的代码。

4:获取到城市的代码之后,就要去连接数据接口获取数据,这个数据时json数据,需要json_encode()转码,我这里或得的是一个对象,有的接口不一样,具体情况具体分析,然后,最重要的就是分配这些数据,说是这些,其实就是这个对象,后来发现没有逐个分配是正确的,这样有利于代码的移植。

5:在视图去调用模板分配的数据,相信这个都会。

6:其实上面的步骤已经把第一次打开页面的整个业务逻辑给处理完了,还有一个就是我在视图给用户提供了输入城市名查询城市天气的功能,这样按顺序的分析一下,正常的获取用户的输入信息就是城市名

7:这里就已经或得了城市名,直接参与获取城市代码的遍历就可以了,这里有个非常重要的逻辑问题就是先后顺序和如何判断才能够把这两个功能很好的结合在一块,一定是:

先判断是否系统自动获取城市名称是否为空,如果不为空只城市名就是或得的名字,反之,就提示ip地址没有查询到对应地址信息,紧接着,注意一定是紧接着下面,是顺序结构,判断用户的输入是否为空,如果不为空,那么就让城市名为用户输入,总而言之就是用户的输入权限一定要大于系统自动获取的权限,这样就可以完整的把两个代码结合在一起,另外,我是把获取ip和取出城市名分别做成了两个方法。

上面写的比较乱,这样的话,下面是我的部分实例代码,因安全版权各方面原因,数据接口我做了处理不可以使用,仅提供方法参考,粘贴无用,自主研究。

视图weather_test.html:






 
即时天气信息
城市 {$all_info->forecast->city}
基本天气 {$all_info->realtime->weather}
温度 {$all_info->realtime->temp}
风向 {$all_info->realtime->WD}
更新时间 {$all_info->realtime->time}
生活建议
城市 {$all_info->forecast->city}
防嗮建议 {$all_info->index[0]->details}
穿衣建议 {$all_info->index[1]->details}
运动建议 {$all_info->index[2]->details}
洗车建议 {$all_info->index[3]->details}
晾晒建议 {$all_info->index[4]->details}
更新时间 {$all_info->realtime->time}
未来四天天气信息  城市: {$all_info->forecast->city}
项目/日期 今天 明天 后天 大后天
概况 {$all_info->forecast->weather1} {$all_info->forecast->weather2} {$all_info->forecast->weather3} {$all_info->forecast->weather4}
温度 {$all_info->forecast->temp1} {$all_info->forecast->temp2} {$all_info->forecast->temp3} {$all_info->forecast->temp4}
风向 {$all_info->forecast->wind1} {$all_info->forecast->wind2} {$all_info->forecast->wind3} {$all_info->forecast->wind4}
风力 {$all_info->forecast->fl1} {$all_info->forecast->fl2} {$all_info->forecast->fl3} {$all_info->forecast->fl4}
今日空气质量状况
城市 {$all_info->forecast->city}
PM2.5 {$all_info->aqi->pm25}
PM10 {$all_info->aqi->pm10}
SO2 {$all_info->aqi->so2}
NO2 {$all_info->aqi->no2}
更新时间 {$all_info->aqi->pub_time}
类方法:
public function weather_test(){
		require_once './Component/Citycode.php';
		//////这里是根据客户端的ip判断地理位置
		//定义两个标志变量
		$count=0;
		$city_id='101120301';//默认大淄博
		$city_name_cin=$_POST['cityname'];
		$city_sim_name=R('Test/get_user_cityname');
		//这是系统根据ip自动判断的位置
		echo $city_sim_name;
		if($city_sim_name!=null){
			$city_name_cin=$city_sim_name;
		}
		//这是用户输入的位置
		if(!empty($_POST['cityname'])){
			//放置信息覆盖
			$city_name_cin=$_POST['cityname'];
		}
		////////不管是ip定位还是用户输入最终需要遍历获取城市代码的变量只要$city_name_cin
		foreach ($citycode as $key => $value){
			if($key==$city_name_cin){
				$city_id=$citycode[$city_name_cin];
				$count++;
			}
		}
		if($count==0){
			echo 对不起,您输入的地址没有找到!默认淄博哦;
		}else{
			echo $city_name_cin.的天气信息如下;
		}
		//接口已经处理,请勿使用,仅供学习
		$weather_interface_url=http://weatherai.markt.xiaomi.com/wtr-v2/weather?cityId=.$city_id.&mei=e32c88633283737f5d9f381d47&device=HM2013023&miuiVersion=JHBCNBD16.0&modDevice=ce=miuiWeatherAp;
		$all_weather_info = json_decode(file_get_contents($weather_interface_url));
		//分配数据
		$this->assign(all_info,$all_weather_info);
		$this->display();
	}
	///////////////////////////////////////////////////
	/*
	 * 下面两个分别是获取主机ip和ip所在地的两个
	 * 方法,最后的结果数值通过R方法,返回获取
	 */
	//方法1:获取用户ip
	public function get_user_ip(){
		//先通过这种简单的方法获取主机的ip,通过R方法获取
		$host_ip=$_SERVER['SERVER_ADDR'];
 		return $host_ip;
	}
	//方法2:获取地名
	public function get_user_cityname(){
		//得到用户的ip
		$host_ip=R('Test/get_user_ip');
		//这里ip地址库必须这样实例化
		$Ip = new OrgNetIpLocation('UTFWry.dat'); // 实例化类 参数表示IP地址库文件
		//可以同时放ip和域名
		$area = $Ip->getlocation($host_ip); // 获取域名服务器所在的位置
		$city_allname=$area['country'];
		$sim_cityname=explode(市,explode(省, $city_allname)[1])[0];
		return $sim_cityname;
	}


 



陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。