spareAdapter.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. namespace Heanup\Library\WeatherAdapt;
  3. use Heanup\Library\Curl;
  4. use Heanup\Library\Warming;
  5. /**
  6. * Class spareAdapter 备用接口
  7. * @package Heanup\Library\WeatherAdapt
  8. */
  9. class spareAdapter implements Weather
  10. {
  11. private $city_id;
  12. private $weather_code = [
  13. 0 => '晴',
  14. 1 => '多云',
  15. 2 => '阴',
  16. 3 => '阵雨',
  17. 4 => '雷阵雨',
  18. 5 => '雷阵雨伴有冰雹',
  19. 6 => '雨夹雪',
  20. 7 => '小雨',
  21. 8 => '中雨',
  22. 9 => '大雨',
  23. 10 => '暴雨',
  24. 11 => '大暴雨',
  25. 12 => '特大暴雨',
  26. 13 => '阵雪',
  27. 14 => '小雪',
  28. 15 => '中雪',
  29. 16 => '大雪',
  30. 17 => '暴雪',
  31. 18 => '雾',
  32. 19 => '冻雨',
  33. 20 => '沙尘暴',
  34. 21 => '小到中雨',
  35. 22 => '中到大雨',
  36. 23 => '大到暴雨',
  37. 24 => '暴雨到大暴雨',
  38. 25 => '大暴雨到特大暴雨',
  39. 26 => '小到中雪',
  40. 27 => '中到大雪',
  41. 28 => '大到暴雪',
  42. 29 => '浮尘',
  43. 30 => '扬沙',
  44. 31 => '强沙尘暴',
  45. 53 => '霾',
  46. 99 => '无',
  47. 32 => '浓雾',
  48. 49 => '强浓雾',
  49. 54 => '中度霾',
  50. 55 => '重度霾',
  51. 56 => '严重霾',
  52. 57 => '大雾',
  53. 58 => '特强浓雾',
  54. 301 => '雨',
  55. 302 => '雪',
  56. ];
  57. /**
  58. * @param $city_id
  59. * @return mixed
  60. */
  61. public function getWeatherData($city_id)
  62. {
  63. $this->city_id = $city_id;
  64. $url = sprintf("http://aider.meizu.com/app/weather/listWeather?cityIds=%s", $city_id);
  65. $data1 = Curl::get($url);
  66. $url = sprintf("https://apip.weatherdt.com/plugin/data?key=j3fsWopid0&location=%s", $city_id);
  67. $data2 = Curl::get($url);
  68. $data1 = json_decode($data1, true);
  69. $data2 = json_decode($data2, true);
  70. $data = $this->parseData($data1, $data2);
  71. $i = 0;
  72. while ($data['Weather']['now']['cond_txt'] == "" && $i < 2) {//数据有误,重试3次
  73. $log_file = APP_DIR . "/logs/" . date("Ymd") . "_null.log";
  74. 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);
  75. Warming::semdMail("no_data", "spare", ALERT_TOTAL, $log_file);
  76. $url = sprintf("http://aider.meizu.com/app/weather/listWeather?cityIds=%s", $city_id);
  77. $data1 = Curl::get($url);
  78. $url = sprintf("https://apip.weatherdt.com/plugin/data?key=j3fsWopid0&location=%s", $city_id);
  79. $data2 = Curl::get($url);
  80. $data1 = json_decode($data1, true);
  81. $data2 = json_decode($data2, true);
  82. $data = $this->parseData($data1, $data2);
  83. $i++;
  84. }
  85. return $data;
  86. }
  87. /**
  88. *
  89. * <code>
  90. * $data=[
  91. * 'Weather' => [
  92. * [
  93. * 'basic' => [
  94. * 'location' => '',
  95. * 'update' => '',
  96. * ],
  97. * 'status' => 'ok',
  98. * 'air_now_city' => '',
  99. * 'alarm' => '',
  100. * 'now' => '',
  101. * 'daily_forecast' => [
  102. * [
  103. * "cond_txt_d" => "晴",
  104. * "cond_txt_n" => "多云",
  105. * "date" => "2019-06-11",
  106. * "tmp_max" => "32",
  107. * "tmp_min" => "20",
  108. * "wind_dir" => "南风",
  109. * "wind_sc" => "3-4"
  110. * ]],
  111. * 'hourly' => [
  112. * [
  113. * "cond_txt" => "晴",
  114. * "time" => "2019-06-11 16:00",
  115. * "tmp" => "30"
  116. * ]
  117. * ],
  118. * 'lifestyle' => [
  119. * [
  120. * "type" => "comf",
  121. * "brf" => "较不舒适",
  122. * "txt" => "白天天气晴好,明媚的阳光在给您带来好心情的同时,也会使您感到有些热,不很舒适。"
  123. * ]
  124. * ],
  125. * ]
  126. * ]
  127. * ];
  128. * </code>
  129. * @param $data1
  130. * @param $data2
  131. * @return array
  132. */
  133. public function parseData($data1, $data2 = null)
  134. {
  135. $return = [];
  136. $weather = [];
  137. $weather['basic'] = [
  138. 'location' => $data2['basic']['city'] ?: "",
  139. 'city_code' => $this->city_id,
  140. 'update' => $data2['basic']['updateTime'] ?: date("H:i"),
  141. ];
  142. $weather['status'] = $data1['status'] ?: "ok";
  143. // $weather['key'] = $k;
  144. $weather['air_now_city'] = [
  145. "aqi" => $data1['value'][0]['pm25']['aqi'] ?: "", // ->a3
  146. "qlty" => $data1['value'][0]['pm25']['quality'] ?: "", // ->a4
  147. "pm25" => $data1['value'][0]['pm25']['pm25'] ?: "", // ->a5
  148. "pm10" => $data1['value'][0]['pm25']['pm10'] ?: "", // ->a6
  149. "no2" => $data1['value'][0]['pm25']['no2'] ?: "", // ->a7
  150. "so2" => $data1['value'][0]['pm25']['so2'] ?: ""
  151. ];
  152. if ($data1['value'][0]['alarms'][0]) {
  153. $weather['alarm'] = [
  154. // "level" => $data1['value'][0]['alarms'][0]['alarmTypeDesc'] ?: "", // ->a9
  155. // "link" => $data1['value'][0]['alarms'][0]['alarmContent'] ?: "", // ->b1
  156. // "type" => $data1['value'][0]['alarms'][0]['publishTime'] ?: "" // ->b2
  157. "level" => "", // ->a9
  158. "link" => $data1['value'][0]['alarms'][0]['alarmTypeDesc'] ? ($data1['value'][0]['alarms'][0]['alarmTypeDesc'] . "预警") : "", // ->b1
  159. "type" => "", // ->b2
  160. 'alertId' => $data1['value'][0]['alarms'][0]['alarmId'] ?? "",
  161. "title" => $data1['value'][0]['alarms'][0]['alarmDesc'] ?? "",// ->z2
  162. "description" => (string)($data1['value'][0]['alarms'][0]['alarmContent'] ? $data1['value'][0]['alarms'][0]['alarmContent'] : ""), // ->z3
  163. "pubtimestamp" => (string)($data1['value'][0]['alarms'][0]['publishTime'] ? date("Y-m-d H:i", strtotime($data1['value'][0]['alarms'][0]['publishTime'])) : ""), // ->z4
  164. "location" => "", // ->z5
  165. "status" => "预警中" // ->z6
  166. ];
  167. } else {
  168. $weather['alarm'] = [
  169. // "level" => $data1['value'][0]['alarms'][0]['alarmTypeDesc'] ?: "", // ->a9
  170. // "link" => $data1['value'][0]['alarms'][0]['alarmContent'] ?: "", // ->b1
  171. // "type" => $data1['value'][0]['alarms'][0]['publishTime'] ?: "" // ->b2
  172. "level" => "", // ->a9
  173. "link" => "", // ->b1
  174. "type" => "", // ->b2
  175. 'alertId' => "",
  176. "title" => "",// ->z2
  177. "description" => "", // ->z3
  178. "pubtimestamp" => "", // ->z4
  179. "location" => "", // ->z5
  180. "status" => "" // ->z6
  181. ];
  182. }
  183. $weather['now'] = [
  184. "cond_txt" => $data2['now']['txt'] ?: "", // ->b3
  185. "fl" => $data1['value'][0]['realtime']['sendibleTemp'] ?: "",// ->b4
  186. "hum" => $data2['now']['hum'] ?: "", // ->b5
  187. "pres" => $data2['now']['pres'] ?: "", // ->b6
  188. "tmp" => $data1['value'][0]['realtime']['temp'] ?: "", // ->b7
  189. "vis" => "", // ->b8
  190. "wind_dir" => $data2['now']['wind_dir_txt'] ?: "", // ->b9
  191. "wind_sc" => $data2['now']['wind_sc'] ?: "", // ->c1
  192. "sr" => $data1['value'][0]['weathers'][0]['sun_rise_time'] ?: "", // ->c2
  193. "ss" => $data1['value'][0]['weathers'][0]['sun_down_time'] ?: "", // ->c3
  194. ];
  195. if (!empty($data2['forecast'])) {
  196. $i = 0;
  197. $date = date("Y-m-d", strtotime($data2['forecast']['date']));
  198. foreach ($data2['forecast']['forecast'] as $key => $value) {
  199. $temp = [
  200. "cond_txt_d" => $this->weather_code[intval($value['tqw_code_d'])] ?: ($value['tqw_code_d'] ?: ""),//$value['tqw_code_d'] ?: "",
  201. "cond_txt_n" => $this->weather_code[intval($value['tqw_code_n'])] ?: ($value['tqw_code_n'] ?: ""),//$value['tqw_code_n'] ?: "",
  202. "date" => date("Y-m-d", strtotime("+$i days", strtotime($date))),
  203. "tmp_max" => $value['tmp_max'] ?: "",
  204. "tmp_min" => $value['tmp_min'] ?: "",
  205. "wind_dir" => $value['wind_dir_d_txt'] ?: "",
  206. "wind_sc" => $value['wind_sc_d_txt'] ?: "",
  207. ];
  208. $i++;
  209. $weather['daily_forecast'][] = $temp;
  210. }
  211. }
  212. if (!empty($data2['hourly'])) {
  213. foreach ($data2['hourly'] as $key => $value) {
  214. $temp = [
  215. 'cond_txt' => $this->weather_code[intval($value['tqw_code'])] ?: ($value['tqw_code'] ?: ""),
  216. 'time' => date("Y-m-d H:00", strtotime($value['time'])),
  217. 'tmp' => $value['tmp'] ?: "",
  218. ];
  219. $weather['hourly'][] = $temp;
  220. }
  221. }
  222. if (!empty($data1['value'][0]['indexes'])) {
  223. foreach ($data1['value'][0]['indexes'] as $key => $value) {
  224. $temp = [
  225. 'type' => $value['name'] ?: "",
  226. 'brf' => $value['level'] ?: "",
  227. 'txt' => $value['content'] ?: "",
  228. ];
  229. $weather['lifestyle'][] = $temp;
  230. }
  231. }
  232. $return['Weather'] = $weather;
  233. $return['source'] = "spare";
  234. return $return;
  235. }
  236. }