'晴', 1 => '多云', 2 => '阴', 3 => '阵雨', 4 => '雷阵雨', 5 => '雷阵雨伴有冰雹', 6 => '雨夹雪', 7 => '小雨', 8 => '中雨', 9 => '大雨', 10 => '暴雨', 11 => '大暴雨', 12 => '特大暴雨', 13 => '阵雪', 14 => '小雪', 15 => '中雪', 16 => '大雪', 17 => '暴雪', 18 => '雾', 19 => '冻雨', 20 => '沙尘暴', 21 => '小到中雨', 22 => '中到大雨', 23 => '大到暴雨', 24 => '暴雨到大暴雨', 25 => '大暴雨到特大暴雨', 26 => '小到中雪', 27 => '中到大雪', 28 => '大到暴雪', 29 => '浮尘', 30 => '扬沙', 31 => '强沙尘暴', 53 => '霾', 99 => '无', 32 => '浓雾', 49 => '强浓雾', 54 => '中度霾', 55 => '重度霾', 56 => '严重霾', 57 => '大雾', 58 => '特强浓雾', 301 => '雨', 302 => '雪', ]; /** * @param $city_id * @return mixed */ public function getWeatherData($city_id) { $this->city_id = $city_id; $url = sprintf("http://aider.meizu.com/app/weather/listWeather?cityIds=%s", $city_id); $data1 = Curl::get($url); $url = sprintf("https://apip.weatherdt.com/plugin/data?key=j3fsWopid0&location=%s", $city_id); $data2 = Curl::get($url); $data1 = json_decode($data1, true); $data2 = json_decode($data2, true); $data = $this->parseData($data1, $data2); $i = 0; while ($data['Weather']['now']['cond_txt'] == "" && $i < 2) {//数据有误,重试3次 $log_file = APP_DIR . "/logs/" . date("Ymd") . "_null.log"; file_put_contents($log_file, sprintf("%s\t\tcity_id:%s", date("Y-m-d H:i:s"), $city_id) . "\t\tdata1:" . json_encode($data1) . "\t\tdata2:" . json_encode($data2) . "\r\n", FILE_APPEND); Warming::semdMail("no_data", "spare", ALERT_TOTAL, $log_file); $url = sprintf("http://aider.meizu.com/app/weather/listWeather?cityIds=%s", $city_id); $data1 = Curl::get($url); $url = sprintf("https://apip.weatherdt.com/plugin/data?key=j3fsWopid0&location=%s", $city_id); $data2 = Curl::get($url); $data1 = json_decode($data1, true); $data2 = json_decode($data2, true); $data = $this->parseData($data1, $data2); $i++; } return $data; } /** * * * $data=[ * 'Weather' => [ * [ * 'basic' => [ * 'location' => '', * 'update' => '', * ], * 'status' => 'ok', * 'air_now_city' => '', * 'alarm' => '', * 'now' => '', * 'daily_forecast' => [ * [ * "cond_txt_d" => "晴", * "cond_txt_n" => "多云", * "date" => "2019-06-11", * "tmp_max" => "32", * "tmp_min" => "20", * "wind_dir" => "南风", * "wind_sc" => "3-4" * ]], * 'hourly' => [ * [ * "cond_txt" => "晴", * "time" => "2019-06-11 16:00", * "tmp" => "30" * ] * ], * 'lifestyle' => [ * [ * "type" => "comf", * "brf" => "较不舒适", * "txt" => "白天天气晴好,明媚的阳光在给您带来好心情的同时,也会使您感到有些热,不很舒适。" * ] * ], * ] * ] * ]; * * @param $data1 * @param $data2 * @return array */ public function parseData($data1, $data2 = null) { $return = []; $weather = []; $weather['basic'] = [ 'location' => $data2['basic']['city'] ?: "", 'city_code' => $this->city_id, 'update' => $data2['basic']['updateTime'] ?: date("H:i"), ]; $weather['status'] = $data1['status'] ?: "ok"; // $weather['key'] = $k; $weather['air_now_city'] = [ "aqi" => $data1['value'][0]['pm25']['aqi'] ?: "", // ->a3 "qlty" => $data1['value'][0]['pm25']['quality'] ?: "", // ->a4 "pm25" => $data1['value'][0]['pm25']['pm25'] ?: "", // ->a5 "pm10" => $data1['value'][0]['pm25']['pm10'] ?: "", // ->a6 "no2" => $data1['value'][0]['pm25']['no2'] ?: "", // ->a7 "so2" => $data1['value'][0]['pm25']['so2'] ?: "" ]; if ($data1['value'][0]['alarms'][0]) { $weather['alarm'] = [ // "level" => $data1['value'][0]['alarms'][0]['alarmTypeDesc'] ?: "", // ->a9 // "link" => $data1['value'][0]['alarms'][0]['alarmContent'] ?: "", // ->b1 // "type" => $data1['value'][0]['alarms'][0]['publishTime'] ?: "" // ->b2 "level" => "", // ->a9 "link" => $data1['value'][0]['alarms'][0]['alarmTypeDesc'] ? ($data1['value'][0]['alarms'][0]['alarmTypeDesc'] . "预警") : "", // ->b1 "type" => "", // ->b2 'alertId' => $data1['value'][0]['alarms'][0]['alarmId'] ?? "", "title" => $data1['value'][0]['alarms'][0]['alarmDesc'] ?? "",// ->z2 "description" => (string)($data1['value'][0]['alarms'][0]['alarmContent'] ? $data1['value'][0]['alarms'][0]['alarmContent'] : ""), // ->z3 "pubtimestamp" => (string)($data1['value'][0]['alarms'][0]['publishTime'] ? date("Y-m-d H:i", strtotime($data1['value'][0]['alarms'][0]['publishTime'])) : ""), // ->z4 "location" => "", // ->z5 "status" => "预警中" // ->z6 ]; } else { $weather['alarm'] = [ // "level" => $data1['value'][0]['alarms'][0]['alarmTypeDesc'] ?: "", // ->a9 // "link" => $data1['value'][0]['alarms'][0]['alarmContent'] ?: "", // ->b1 // "type" => $data1['value'][0]['alarms'][0]['publishTime'] ?: "" // ->b2 "level" => "", // ->a9 "link" => "", // ->b1 "type" => "", // ->b2 'alertId' => "", "title" => "",// ->z2 "description" => "", // ->z3 "pubtimestamp" => "", // ->z4 "location" => "", // ->z5 "status" => "" // ->z6 ]; } $weather['now'] = [ "cond_txt" => $data2['now']['txt'] ?: "", // ->b3 "fl" => $data1['value'][0]['realtime']['sendibleTemp'] ?: "",// ->b4 "hum" => $data2['now']['hum'] ?: "", // ->b5 "pres" => $data2['now']['pres'] ?: "", // ->b6 "tmp" => $data1['value'][0]['realtime']['temp'] ?: "", // ->b7 "vis" => "", // ->b8 "wind_dir" => $data2['now']['wind_dir_txt'] ?: "", // ->b9 "wind_sc" => $data2['now']['wind_sc'] ?: "", // ->c1 "sr" => $data1['value'][0]['weathers'][0]['sun_rise_time'] ?: "", // ->c2 "ss" => $data1['value'][0]['weathers'][0]['sun_down_time'] ?: "", // ->c3 ]; if (!empty($data2['forecast'])) { $i = 0; $date = date("Y-m-d", strtotime($data2['forecast']['date'])); foreach ($data2['forecast']['forecast'] as $key => $value) { $temp = [ "cond_txt_d" => $this->weather_code[intval($value['tqw_code_d'])] ?: ($value['tqw_code_d'] ?: ""),//$value['tqw_code_d'] ?: "", "cond_txt_n" => $this->weather_code[intval($value['tqw_code_n'])] ?: ($value['tqw_code_n'] ?: ""),//$value['tqw_code_n'] ?: "", "date" => date("Y-m-d", strtotime("+$i days", strtotime($date))), "tmp_max" => $value['tmp_max'] ?: "", "tmp_min" => $value['tmp_min'] ?: "", "wind_dir" => $value['wind_dir_d_txt'] ?: "", "wind_sc" => $value['wind_sc_d_txt'] ?: "", ]; $i++; $weather['daily_forecast'][] = $temp; } } if (!empty($data2['hourly'])) { foreach ($data2['hourly'] as $key => $value) { $temp = [ 'cond_txt' => $this->weather_code[intval($value['tqw_code'])] ?: ($value['tqw_code'] ?: ""), 'time' => date("Y-m-d H:00", strtotime($value['time'])), 'tmp' => $value['tmp'] ?: "", ]; $weather['hourly'][] = $temp; } } if (!empty($data1['value'][0]['indexes'])) { foreach ($data1['value'][0]['indexes'] as $key => $value) { $temp = [ 'type' => $value['name'] ?: "", 'brf' => $value['level'] ?: "", 'txt' => $value['content'] ?: "", ]; $weather['lifestyle'][] = $temp; } } $return['Weather'] = $weather; $return['source'] = "spare"; return $return; } }