123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- 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<String, String> 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 <a href="http://tianqiapi.com/index/doc?version=day"></a>
- * @param adcode
- * @return
- */
- public static Map<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, Map<String, String>> 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<String, Map<String, String>> 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<String, String>(){{
- put("nums", jsonData.getInteger("nums").toString());
- }});
- JSONArray list = jsonData.getJSONArray("list");
- list.forEach(item -> {
- Map<String, String> 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<String, String> 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<String, String> 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;
- }
- }
|