获取城市天气数据

中华万年历API

抓包中华万年历得到的接口(JSON):

http://wthrcdn.etouch.cn/weather_mini?city=北京
通过城市名字获得天气数据,json数据
http://wthrcdn.etouch.cn/weather_mini?citykey=101010100
通过城市id获得天气数据,json数据

数据和中国天气网(www.weather.com.cn)一致

数据:

{
	"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文件数据,
当错误时会有节点
http://wthrcdn.etouch.cn/WeatherApi?city=北京
通过城市名字获得天气数据,xml文件数据

 

数据:


北京
18:45
22
2级
33%
东南风
05:19
19:06



118
61
儿童、老年人及心脏、呼吸系统疾病患者人群应减少长时间或高强度户外锻炼
轻度污染
臭氧8小时
185
1
101
4
24



27日星期三
高温 19℃
低温 12℃

小雨
无持续风向
微风



无持续风向
微风




28日星期四
高温 26℃
低温 13℃

多云
南风
3-4级


多云
无持续风向
微风级



29日星期五
高温 28℃
低温 15℃

多云
无持续风向
微风级



无持续风向
微风级



30日星期六
高温 31℃
低温 15℃


无持续风向
微风级


多云
无持续风向
微风级



1日星期天
高温 29℃
低温 20℃

多云
无持续风向
微风级


小雨
无持续风向
微风级



2日星期一
高温 26℃
低温 13℃

小到中雨
北风
4-5级


多云
北风
3-4级





晨练指数
适宜
天气不错,空气清新,是您晨练的大好时机,建议不同年龄段的人们积极参加户外健身活动。


舒适度
较舒适
白天天气晴好,您在这种天气条件下,会感觉早晚凉爽、舒适,午后偏热。


穿衣指数
舒适
建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。


感冒指数
少发
各项气象条件适宜,无明显降温过程,发生感冒机率较低。


晾晒指数
适宜
天气不错,适宜晾晒。赶紧把久未见阳光的衣物搬出来吸收一下太阳的味道吧!


旅游指数
适宜
天气较好,但丝毫不会影响您出行的心情。温度适宜又有微风相伴,适宜旅游。


紫外线强度
中等
属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。


洗车指数
较适宜
较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。


运动指数
较适宜
天气较好,户外运动请注意防晒,推荐您在室内进行低强度运动。


约会指数
适宜
天气较好,和恋人一起徜徉于熙攘人群中或漫步于柔软草地上,都是不错的主意哦。


雨伞指数
不带伞
天气较好,不会降水,因此您可放心出门,无须带雨伞。



 

java code:

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);

	}
}

  

 

转载于:https://www.cnblogs.com/janederek/p/9647700.html

你可能感兴趣的:(获取城市天气数据)