Mini天气
by 亦泽
Mini天气是我抓取腾讯天气API之后,制作的一款天气APP,现在开源,支持所抓取的接口支持大部分生活中需要的信息,目前在Mini天气中,添加了必要的信息,后续还会完善。
成品地址:
https://github.com/bestyize/MiniWeather/tree/8ad815282f05ea7065f5d94a2e865db353fc94bb/app/release
开源地址:https://github.com/bestyize/MiniWeather
效果截图
1、腾讯天气API抓取
天气状况请求接口
这是腾讯天气的通用请求接口
https://wis.qq.com/weather/common
请求参数
参数 |
含义 |
source |
请求来源,可以填 pc 即来自PC端 |
province |
省,比如山东省 |
city |
市,比如临沂市 |
country |
县区,比如兰山区 |
weather_type |
请求的天气类型,这里是最重要的,参数有:observe(观测站数据,例如温度大气压),forecast_1h(按小时预报),forecast_24h(按天预报),index(指数,比如穿衣指数等),alarm(警告),limit,tips(小提示),rise(日出日落,月出月落),air(空气质量)等 |
使用说明
GET请求后面的weather_type内容参数之间用 | 分割,然后再进行URL编码。province和city也要经过URL编码。
代码实现
private static String txWeatherURLBuilder(Map<String,String> map){
StringBuilder sb=new StringBuilder();
for(String key:map.keySet()){
try {
sb.append(key+"=");
sb.append(URLEncoder.encode(map.get(key),"utf-8"));
sb.append("&");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
sb.append("source=pc");
String baseApi="https://wis.qq.com/weather/common";
return baseApi+"?"+sb.toString();
}
public static String txWeatherURLBuilder(CityShip ship){
Map<String,String> map=new HashMap<String, String>();
map.put("province",ship.province);
map.put("city",ship.city);
map.put("country",ship.country);
//默认获取观测站的情况,一小时天气预报,24 小时天气预报,指数,小贴士,日出日落,空气质量
map.put("weather_type","observe|forecast_1h|forecast_24h|index|tips|rise|air");
return txWeatherURLBuilder(map);
}
public static String txWeatherURLBuilder(CityDetailBean bean){
Map<String,String> map=new HashMap<String, String>();
map.put("province",bean.getProvince());
map.put("city",bean.getCity());
map.put("country",bean.getCountry());
//默认获取观测站的情况,一小时天气预报,24 小时天气预报,指数,小贴士,日出日落,空气质量
map.put("weather_type","observe|forecast_1h|forecast_24h|index|tips|rise|air");
return txWeatherURLBuilder(map);
}
2、城市列表的接口
下面是通用接口
https://wis.qq.com/city/like
参数 |
含义 |
source |
请求来源,可以填 pc 即来自PC端 |
city |
请求的位置,比如临沂,或者兰山区,返回一个模糊匹配结果集 |
请求示例
https://wis.qq.com/city/like?source=pc&city=临沂
3、天气图标抓取
天气图标是根据weatherCode字段,然后请求不同的链接,weatherCode字段是如同 "00" "01"之类的字符串
比如00表示晴转晴,01表示晴转多云。
判断白天黑夜的方法也很简单,抓取时间转为小时,白天时间为06:00-18:00
下面是使用方法
public static String getWeatherStateIcon(String weatherCode,boolean day){
if(day){
return "http://mat1.gtimg.com/pingjs/ext2020/weather/pc/icon/weather/day/"+weatherCode+".png";
}else {
return "http://mat1.gtimg.com/pingjs/ext2020/weather/pc/icon/weather/night/"+weatherCode+".png";
}
}