| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- <?php
- namespace Heanup\Library\WeatherAdapt;
- use Heanup\Library\Curl;
- use Heanup\Library\Warming;
- /**
- * Class spareAdapter 备用接口
- * @package Heanup\Library\WeatherAdapt
- */
- class spareAdapter implements Weather
- {
- private $city_id;
- private $weather_code = [
- 0 => '晴',
- 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;
- }
- /**
- *
- * <code>
- * $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" => "白天天气晴好,明媚的阳光在给您带来好心情的同时,也会使您感到有些热,不很舒适。"
- * ]
- * ],
- * ]
- * ]
- * ];
- * </code>
- * @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;
- }
- }
|