抓包中華萬年曆獲得的接口(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); } }