獲取城市天氣數據

中華萬年曆API

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

	}
}
相關文章
相關標籤/搜索