初亦泽 发表于 2020-2-29 20:43

开源一个天气APP,Mini天气

本帖最后由 初亦泽 于 2020-2-29 23:02 编辑

# Mini天气

by 亦泽

---

Mini天气是我抓取腾讯天气API之后,制作的一款天气APP,现在开源,支持所抓取的接口支持大部分生活中需要的信息,目前在Mini天气中,添加了必要的信息,后续还会完善。

成品地址:
      https://github.com/bestyize/MiniWeather/tree/8ad815282f05ea7065f5d94a2e865db353fc94bb/app/release

开源地址:https://github.com/bestyize/MiniWeather

## 效果截图

![效果截图](http://freedraw.xyz/download/show.png)

## 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编码。

#### 代码实现

```java
    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

下面是使用方法

```java
    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";
      }
    }

```



初亦泽 发表于 2020-4-14 11:33

527979279952 发表于 2020-4-12 14:08
可不可以显示昨天的天气

可以,在下面七天天气预报里面实际上有8个,也就是加上了昨天的天气预报

527979279952 发表于 2020-4-14 11:54

初亦泽 发表于 2020-4-14 11:33
可以,在下面七天天气预报里面实际上有8个,也就是加上了昨天的天气预报

VERY GOOD!!!{:1_927:}

梦幻王子刘 发表于 2020-2-29 20:56

支持一个哦

hunter0611 发表于 2020-2-29 21:03

谢谢分享

andyle 发表于 2020-2-29 21:03

感谢分享,支持一下

lss1155 发表于 2020-2-29 21:04

支持楼主,学习了

启示 发表于 2020-2-29 21:27

感谢分享,学习

多幸运遇见baby 发表于 2020-3-1 09:27

鼓励转贴优秀软件安全工具和文档!

多幸运遇见baby 发表于 2020-3-1 09:28

效果图挂了

VICENAYA 发表于 2020-3-1 10:30

支持一个哦

suifeng165 发表于 2020-3-3 20:45

支持开源共享!!
页: [1] 2 3 4
查看完整版本: 开源一个天气APP,Mini天气