抓包中华万年历获得的接口(JSON):java
http://wthrcdn.etouch.cn/weather_mini?city=北京
经过城市名字得到天气数据,json数据
http://wthrcdn.etouch.cn/weather_mini?citykey=101010100
经过城市id得到天气数据,json数据apache
数据和中国天气网(www.weather.com.cn)一致json
数据:app
{ "desc": "OK", "status": 1000, "data": { "wendu": "22", "ganmao": "各项气象条件适宜,无明显降温过程,发生感冒机率较低。", "forecast": [{ "fengxiang": "南风", "fengli": "3-4级", "high": "高温 26℃", "type": "多云", "low": "低温 13℃", "date": "28日星期四" }, { "fengxiang": "无持续风向", "fengli": "微风级", "high": "高温 28℃", "type": "多云", "low": "低温 15℃", "date": "29日星期五" }, { "fengxiang": "无持续风向", "fengli": "微风级", "high": "高温 31℃", "type": "晴", "low": "低温 15℃", "date": "30日星期六" }, { "fengxiang": "无持续风向", "fengli": "微风级", "high": "高温 29℃", "type": "多云", "low": "低温 20℃", "date": "1日星期天" }, { "fengxiang": "北风", "fengli": "4-5级", "high": "高温 26℃", "type": "小到中雨", "low": "低温 13℃", "date": "2日星期一" }], "yesterday": { "fl": "微风", "fx": "无持续风向", "high": "高温 19℃", "type": "小雨", "low": "低温 12℃", "date": "27日星期三" }, "aqi": "118", "city": "北京" } }
XML工具
http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100测试
经过城市id得到天气数据,xml文件数据,
当错误时会有<error>节点
http://wthrcdn.etouch.cn/WeatherApi?city=北京
经过城市名字得到天气数据,xml文件数据url
数据:code
<resp> <city>北京</city> <updatetime>18:45</updatetime> <wendu>22</wendu> <fengli>2级</fengli> <shidu>33%</shidu> <fengxiang>东南风</fengxiang> <sunrise_1>05:19</sunrise_1> <sunset_1>19:06</sunset_1> <sunrise_2/> <sunset_2/> <environment> <aqi>118</aqi> <pm25>61</pm25> <suggest>儿童、老年人及心脏、呼吸系统疾病患者人群应减小长时间或高强度户外锻炼</suggest> <quality>轻度污染</quality> <MajorPollutants>臭氧8小时</MajorPollutants> <o3>185</o3> <co>1</co> <pm10>101</pm10> <so2>4</so2> <no2>24</no2> <time>18:00:00</time> </environment> <yesterday> <date_1>27日星期三</date_1> <high_1>高温 19℃</high_1> <low_1>低温 12℃</low_1> <day_1> <type_1>小雨</type_1> <fx_1>无持续风向</fx_1> <fl_1>微风</fl_1> </day_1> <night_1> <type_1>阴</type_1> <fx_1>无持续风向</fx_1> <fl_1>微风</fl_1> </night_1> </yesterday> <forecast> <weather> <date>28日星期四</date> <high>高温 26℃</high> <low>低温 13℃</low> <day> <type>多云</type> <fengxiang>南风</fengxiang> <fengli>3-4级</fengli> </day> <night> <type>多云</type> <fengxiang>无持续风向</fengxiang> <fengli>微风级</fengli> </night> </weather> <weather> <date>29日星期五</date> <high>高温 28℃</high> <low>低温 15℃</low> <day> <type>多云</type> <fengxiang>无持续风向</fengxiang> <fengli>微风级</fengli> </day> <night> <type>晴</type> <fengxiang>无持续风向</fengxiang> <fengli>微风级</fengli> </night> </weather> <weather> <date>30日星期六</date> <high>高温 31℃</high> <low>低温 15℃</low> <day> <type>晴</type> <fengxiang>无持续风向</fengxiang> <fengli>微风级</fengli> </day> <night> <type>多云</type> <fengxiang>无持续风向</fengxiang> <fengli>微风级</fengli> </night> </weather> <weather> <date>1日星期天</date> <high>高温 29℃</high> <low>低温 20℃</low> <day> <type>多云</type> <fengxiang>无持续风向</fengxiang> <fengli>微风级</fengli> </day> <night> <type>小雨</type> <fengxiang>无持续风向</fengxiang> <fengli>微风级</fengli> </night> </weather> <weather> <date>2日星期一</date> <high>高温 26℃</high> <low>低温 13℃</low> <day> <type>小到中雨</type> <fengxiang>北风</fengxiang> <fengli>4-5级</fengli> </day> <night> <type>多云</type> <fengxiang>北风</fengxiang> <fengli>3-4级</fengli> </night> </weather> </forecast> <zhishus> <zhishu> <name>晨练指数</name> <value>适宜</value> <detail>天气不错,空气清新,是您晨练的大好时机,建议不一样年龄段的人们积极参加户外健身活动。</detail> </zhishu> <zhishu> <name>温馨度</name> <value>较温馨</value> <detail>白每天气晴好,您在这种天气条件下,会感受迟早凉爽、温馨,午后偏热。</detail> </zhishu> <zhishu> <name>穿衣指数</name> <value>温馨</value> <detail>建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。</detail> </zhishu> <zhishu> <name>感冒指数</name> <value>少发</value> <detail>各项气象条件适宜,无明显降温过程,发生感冒机率较低。</detail> </zhishu> <zhishu> <name>晾晒指数</name> <value>适宜</value> <detail>天气不错,适宜晾晒。赶忙把久未见阳光的衣物搬出来吸取一下太阳的味道吧!</detail> </zhishu> <zhishu> <name>旅游指数</name> <value>适宜</value> <detail>天气较好,但丝绝不会影响您出行的心情。温度适宜又有微风相伴,适宜旅游。</detail> </zhishu> <zhishu> <name>紫外线强度</name> <value>中等</value> <detail>属中等强度紫外线辐射天气,外出时建议涂擦SPF高于1五、PA+的防晒护肤品,戴帽子、太阳镜。</detail> </zhishu> <zhishu> <name>洗车指数</name> <value>较适宜</value> <detail>较适宜洗车,将来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。</detail> </zhishu> <zhishu> <name>运动指数</name> <value>较适宜</value> <detail>天气较好,户外运动请注意防晒,推荐您在室内进行低强度运动。</detail> </zhishu> <zhishu> <name>约会指数</name> <value>适宜</value> <detail>天气较好,和恋人一块儿徜徉于熙攘人群中或漫步于柔软草地上,都是不错的主意哦。</detail> </zhishu> <zhishu> <name>雨伞指数</name> <value>不带伞</value> <detail>天气较好,不会降水,所以您可放心出门,无须带雨伞。</detail> </zhishu> </zhishus> </resp>
java code:cdn
package com.topsports.util; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.zip.GZIPInputStream; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /** * 天气预报工具类(调用中华万年历接口获取) * @author sun.xh * @date 2018-08-02 */ public class WeatherUtil { private static Logger logger = LogManager.getLogger(WeatherUtil.class); /** * 获取今天实时天气 * @param cityName 城市名称 * @return type */ public static String getTodayWeather(String cityName){ String res = null; try { JSONArray array = getWeather(cityName); if (array != null && !array.isEmpty()) { JSONObject today = array.getJSONObject(0); res = today.getString("type"); } } catch (Exception e) { logger.error("获取天气失败", e); } return res; } /** * 获取最近几每天气 + 昨日天气 * @param cityName * @return jsonArray */ public static JSONArray getWeather(String cityName) { String url = "http://wthrcdn.etouch.cn/weather_mini?city=" + cityName; JSONArray array = null; CloseableHttpClient httpClient = HttpClients.createDefault(); try { HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = httpClient.execute(httpGet); String result = getJsonStringFromGZIP(httpResponse);// 获取到解压缩以后的字符串 JSONObject jsonData = JSONObject.fromObject(result); logger.info("请求天气接口返回状态以下:cityName:{}, status:{},desc:{}", cityName, jsonData.getString("status"), jsonData.getString("desc")); if (jsonData.getString("desc").equals("OK")) { JSONObject data = jsonData.getJSONObject("data"); array = data.getJSONArray("forecast"); } } catch (Exception e) { logger.error("获取一周天气数据失败", e); } finally { try { httpClient.close(); } catch (IOException e) { logger.error("IO异常", e); } } return array; } /** * 解压缩gzip * @param response * @return */ private static String getJsonStringFromGZIP(HttpResponse response) { String jsonString = null; try { InputStream is = response.getEntity().getContent(); BufferedInputStream bis = new BufferedInputStream(is); bis.mark(2); // 取前两个字节 byte[] header = new byte[2]; int result = bis.read(header); // reset输入流到开始位置 bis.reset(); // 判断是不是GZIP格式 int headerData = getShort(header); if (result != -1 && headerData == 0x1f8b) { is = new GZIPInputStream(bis); } else { is = bis; } InputStreamReader reader = new InputStreamReader(is, "utf-8"); char[] data = new char[100]; int readSize; StringBuffer sb = new StringBuffer(); while ((readSize = reader.read(data)) > 0) { sb.append(data, 0, readSize); } jsonString = sb.toString(); bis.close(); reader.close(); } catch (Exception e) { logger.error("解压JSON异常", e); } return jsonString; } private static int getShort(byte[] data) { return (int) ((data[0] << 8) | data[1] & 0xFF); } public static void main(String[] args) { //测试获取实时天气 String res = getTodayWeather("深圳"); System.out.println(res); } }