获取真实ip
先获取真实的IP地址,也有可能用户使用了代/理或者其他的,所以不能用PHP自带的函数了,用下面这段函数来获取
//获取真实ip
function real_ip()
{
$ip = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#d{1,3}.d{1,3}.d{1,3}.d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
foreach ($matches[0] as $xip) {
if (!preg_match('#^(10|172.16|192.168).#', $xip)) {
$ip = $xip;
break;
}
}
} elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_CF_CONNECTING_IP']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CF_CONNECTING_IP'])) {
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} elseif (isset($_SERVER['HTTP_X_REAL_IP']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_IP'])) {
$ip = $_SERVER['HTTP_X_REAL_IP'];
}
return $ip;
}
根据IP地址获取城市信息
这里使用百度地图的 api来获取
//根据ip地址获取城市
function get_ip_city($clientip)
{
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown)) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown)) {
$ip = $_SERVER['REMOTE_ADDR'];
}
$url = 'http://api.map.baidu.com/location/ip?ip=' . $ip . '&ak=zyjHt3iUKWVHB5HjQYy7th1DTbKTPcGY';
$html = file_get_contents($url);
$res = json_decode($html);
$cheng = $res->content->address_detail->province; //城市
$sheng = $res->content->address_detail->city; //省份
$city = $cheng . $sheng;
return $city;
}
根据城市名称获取天气
通过上面的代码,已经获取到了IP地址和城市名称。现在获取天气,这里用的是今日头条的 api接口
//获取真实ip
$ip = get_real_ip();
//获取城市
$city = get_ip_city($ip);
//根据城市获取天气
$result = get_curl("https://www.toutiao.com/stream/widget/local_weather/data/?city={$city}");
获取结果
城市我这里是随便选的。因为返回结果的内容挺长,所以这里我只截取一部分在这里展示请求结果
{
"data": {
"city": "北安",
"ip": "119.182.**.**",
"weather": {
"alert": [
{
"content": "北安市气象局2022年06月20日22时30分发布暴雨黄色预警信号:目前我市部分乡镇降水量已达30毫米,预计6小时内我市市区、二井、城郊、东胜、杨家、通北、石泉、红星农场、303林场等乡镇雨量可达50毫米以上,并伴有雷暴大风,请有关单位和个人注意做好预防工作。(预警信息来源:国家预警信息发布中心)",
"infoid": 38,
"level": "黄色",
"name": "暴雨",
"pub_time": "2022-06-20 22:30:00",
"title": "北安市气象局发布暴雨黄色预警[III级/较重]",
"type": "暴雨黄色",
"update_time": "2022-06-20 22:44:46"
},
{
"content": "黑河市气象局于2022年6月20日8时50分发布大风蓝色预警信号:预计今天白天到夜间爱辉、孙吴、逊克、嫩江、五大连池、北安地区将受大风影响,平均风力5-6级,阵风7-8级,局地可能超过9级。请有关单位和个人注意做好预防工作。(预警信息来源:国家预警信息发布中心)",
"infoid": 89,
"level": "蓝色",
"name": "大风",
"pub_time": "2022-06-20 08:50:00",
"title": "黑河市气象局发布大风蓝色预警[IV级/一般]",
"type": "大风蓝色",
"update_time": "2022-06-20 09:09:42"
}
],
"aqi": 19,
"city_name": "北安",
"current_condition": "中雨",
"current_temperature": 17,
"current_time": 1655737090,
"dat_condition": "多云",
"dat_high_temperature": 30,
"dat_low_temperature": 16,
"dat_weather_icon_id": "1",
"day_condition": "小雨",
"forecast_list": [
{
"condition": "多云",
"date": "2022-06-19",
"high_temperature": "28",
"low_temperature": "17",
"weather_icon_id": "1",
"wind_direction": "西北风",
"wind_level": "3-4"
},
{
"condition": "小雨转大雨",
"date": "2022-06-20",
"high_temperature": "23",
"low_temperature": "17",
"weather_icon_id": "7",
"wind_direction": "南风",
"wind_level": "3-4"
}
],
"high_temperature": 23,
"hourly_forecast": [
{
"condition": "中雨",
"hour": "22",
"temperature": "17",
"weather_icon_id": "8",
"wind_direction": "W",
"wind_level": "35.64"
},
{
"condition": "中雨",
"hour": "23",
"temperature": "17",
"weather_icon_id": "8",
"wind_direction": "S",
"wind_level": "32.40"
}
],
"low_temperature": 17,
"moji_city_id": 353,
"night_condition": "大雨",
"origin_data": {
},
"quality_level": "优",
"tips": "天冷了,该加衣服了!",
"tomorrow_aqi": 13,
"tomorrow_condition": "小雨转多云",
"tomorrow_high_temperature": 28,
"tomorrow_low_temperature": 14,
"tomorrow_quality_level": "优",
"tomorrow_weather_icon_id": "7",
"update_time": "2022-06-20 22:50:08",
"weather_icon_id": "8",
"wind_direction": "西风",
"wind_level": 5
}
}
}
然后把它转换成数组
$array = json_decode($result,true);
$weather = $array['data']['weather']['day_condition'];
echo $weather;
这样就获取到了天气结果
评论