package org.springblade.common.utils; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ConnectException; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; @Slf4j public class YiKeYunApiUtils { private static final String API_YIKEYUN_APPID = "97543277"; private static final String API_YIKEYUN_APPSECRET = "PXd7GE2j"; public static Map getTodayWeatherByAdcodeTry(String adcode) { for (int i = 0; i < 3; i++) { try { return getTodayWeatherByAdcode(adcode); } catch (IOException e) { // 重试 try { Thread.sleep(500); } catch (InterruptedException ex) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); return null; } } return null; } /** * 根据城市adcode获取天气信息, 易客云 api * api doc * @param adcode * @return */ public static Map getTodayWeatherByAdcode(String adcode) throws IOException { String getUrl = String.format("http://v1.yiketianqi.com/free/day?appid=%s&appsecret=%s&unescape=1&adcode=%s", API_YIKEYUN_APPID, API_YIKEYUN_APPSECRET, adcode); Map map = new HashMap<>(); URL url = new URL(getUrl); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8)); String res; StringBuilder sb = new StringBuilder(); while ((res = in.readLine()) != null) { sb.append(res.trim()); } log.info("获取当天天气 ======= sb.toString():" + sb); JSONObject jsonData = JSONObject.parseObject(sb.toString()); map.put("temp", jsonData.get("tem").toString()); map.put("weather", jsonData.get("wea").toString()); map.put("high", jsonData.get("tem_day").toString()); map.put("low", jsonData.get("tem_night").toString()); map.put("windLevel", jsonData.get("win_speed").toString()); map.put("nums", jsonData.getInteger("nums").toString()); return map; } /** * 根据城市id获取天气信息, 易客云 api * @param cityId * @return */ public static Map getTodayWeatherByCityId(String cityId) { String getUrl = String.format("http://v1.yiketianqi.com/free/day?appid=%s&appsecret=%s&unescape=1&cityid=%s", API_YIKEYUN_APPID, API_YIKEYUN_APPSECRET, cityId); Map map = new HashMap<>(); try { URL url = new URL(getUrl); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8)); String res; StringBuilder sb = new StringBuilder(); while ((res = in.readLine()) != null) { sb.append(res.trim()); } log.info("获取当天天气 ======= sb.toString():" + sb); JSONObject jsonData = JSONObject.parseObject(sb.toString()); map.put("temp", jsonData.get("tem").toString()); map.put("weather", jsonData.get("wea").toString()); map.put("high", jsonData.get("tem_day").toString()); map.put("low", jsonData.get("tem_night").toString()); map.put("windLevel", jsonData.get("win_speed").toString()); } catch (IOException e) { e.printStackTrace(); return null; } return map; } /** * 根据城市id获取天气信息, 易客云 api * @param cityId * @return */ public static Map> getHistoryWeather(String cityId, Integer year, Integer month) { String getUrl = String.format("http://gfeljm.tianqiapi.com/free/history?appid=%s&appsecret=%s&cityid=%s&year=%d&month=%d", API_YIKEYUN_APPID, API_YIKEYUN_APPSECRET, cityId, year, month); Map> map = new HashMap<>(); try { URL url = new URL(getUrl); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8)); String res; StringBuilder sb = new StringBuilder(); while ((res = in.readLine()) != null) { sb.append(res.trim()); } log.info("获取当天天气 ======= sb.toString():" + sb); JSONObject jsonData = JSONObject.parseObject(sb.toString()); map.put("nums", new HashMap(){{ put("nums", jsonData.getInteger("nums").toString()); }}); JSONArray list = jsonData.getJSONArray("list"); list.forEach(item -> { Map data = new HashMap<>(); JSONObject itemObj = (JSONObject) item; data.put("weather", itemObj.getString("wea_day")); data.put("low", itemObj.getString("tem_night")); data.put("high", itemObj.getString("tem_day")); data.put("windLevel", itemObj.getString("win_speed")); String date = itemObj.getString("date"); // 将 yyyy-MM-dd 转化为 yyyy年MM月dd日 String dateFormat = date.replaceFirst("-", "年"); dateFormat = dateFormat.replaceFirst("-", "月") + "日"; map.put(dateFormat, data); }); } catch (Exception e) { e.printStackTrace(); return null; } return map; } /** * 易客 国内LBS逆地理编码服务 (区县级) 每日免费500次 * 根据经纬度坐标解析地址详情 */ public static Map getPosition(String LatitudeAndLongitude) throws IOException { String getUrl = String.format("http://apia.yikeapi.com/geocode?appid=%s&appsecret=%s&output=json&location=", API_YIKEYUN_APPID, API_YIKEYUN_APPSECRET, LatitudeAndLongitude); URL url = new URL(getUrl); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8)); String res; StringBuilder sb = new StringBuilder(""); while ((res = in.readLine()) != null) { sb.append(res.trim()); } log.info("获取经纬度坐标地址 ======= sb.toString():" + sb); Map map = new HashMap<>(); JSONObject jsonData = JSONObject.parseObject(sb.toString()); map.put("nums", jsonData.get("nums").toString()); JSONObject regeocode = (JSONObject) jsonData.get("regeocode"); JSONObject addressComponent = (JSONObject) regeocode.get("addressComponent"); map.put("province", addressComponent.get("province").toString()); map.put("city", addressComponent.get("city").toString()); map.put("district", addressComponent.get("district").toString()); map.put("adcode", addressComponent.get("adcode").toString()); return map; } }