123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- package api
- import (
- "context"
- "errors"
- "fmt"
- "github.com/gogf/gf/v2/frame/g"
- "strconv"
- "time"
- )
- const (
- api = "https://api.seniverse.com/v3/weather/now.json?language=zh-Hans&unit=c&location="
- dayApi = "https://api.seniverse.com/v3/weather/daily.json?language=zh-Hans&unit=c&start=-1&days=5&location="
- airApi = "https://api.seniverse.com/v3/air/now.json?language=zh-Hans&scope=city&location="
- )
- // WeatherResp 天气
- type WeatherResp struct {
- Results []struct {
- Location struct {
- Id string `json:"id"`
- Name string `json:"name"`
- Country string `json:"country"`
- Path string `json:"path"`
- Timezone string `json:"timezone"`
- TimezoneOffset string `json:"timezone_offset"`
- } `json:"location"`
- Now struct {
- Text string `json:"text"`
- Code string `json:"code"`
- Temperature string `json:"temperature"`
- FeelsLike string `json:"feels_like"`
- Pressure string `json:"pressure"`
- Humidity string `json:"humidity"`
- Visibility string `json:"visibility"`
- WindDirection string `json:"wind_direction"`
- WindDirectionDegree string `json:"wind_direction_degree"`
- WindSpeed string `json:"wind_speed"`
- WindScale string `json:"wind_scale"`
- Clouds string `json:"clouds"`
- DewPoint string `json:"dew_point"`
- } `json:"now"`
- LastUpdate time.Time `json:"last_update"`
- }
- }
- type XinZhiDayWeatherInfo struct {
- Results []struct {
- Location struct {
- Id string `json:"id"`
- Name string `json:"name"`
- Country string `json:"country"`
- Path string `json:"path"`
- Timezone string `json:"timezone"`
- TimezoneOffset string `json:"timezone_offset"`
- } `json:"location"`
- Daily []struct {
- Date string `json:"date"`
- TextDay string `json:"text_day"`
- CodeDay string `json:"code_day"`
- TextNight string `json:"text_night"`
- CodeNight string `json:"code_night"`
- High string `json:"high"`
- Low string `json:"low"`
- Rainfall string `json:"rainfall"`
- Precip string `json:"precip"`
- WindDirection string `json:"wind_direction"`
- WindDirectionDegree string `json:"wind_direction_degree"`
- WindSpeed string `json:"wind_speed"`
- WindScale string `json:"wind_scale"`
- Humidity string `json:"humidity"`
- } `json:"daily"`
- LastUpdate time.Time `json:"last_update"`
- } `json:"results"`
- }
- type AirInfo struct {
- Results []struct {
- Location struct {
- Id string `json:"id"`
- Name string `json:"name"`
- Country string `json:"country"`
- Path string `json:"path"`
- Timezone string `json:"timezone"`
- TimezoneOffset string `json:"timezone_offset"`
- } `json:"location"`
- Air struct {
- City struct {
- Aqi string `json:"aqi"` // 空气质量指数(AQI)是描述空气质量状况的定量指数
- Pm25 string `json:"pm25"` // PM2.5颗粒物(粒径小于等于2.5μm)1小时平均值。单位:μg/m³
- Pm10 string `json:"pm10"` // PM10颗粒物(粒径小于等于10μm)1小时平均值。单位:μg/m³
- So2 string `json:"so2"` // 二氧化硫1小时平均值。单位:μg/m³
- No2 string `json:"no2"` // 二氧化氮1小时平均值。单位:μg/m³
- Co string `json:"co"` // 一氧化碳1小时平均值。单位:mg/m³
- O3 string `json:"o3"` // 臭氧1小时平均值。单位:μg/m³
- PrimaryPollutant string `json:"primary_pollutant"` // 首要污染物
- Quality string `json:"quality"` // 空气质量类别,有“优、良、轻度污染、中度污染、重度污染、严重污染”6类
- LastUpdate time.Time `json:"last_update"` // 数据发布时间
- } `json:"city"`
- } `json:"air"`
- LastUpdate time.Time `json:"last_update"`
- }
- }
- type WeatherInfoResp struct {
- Location string `json:"location"`
- Text string `json:"text"`
- Code string `json:"code"`
- Temperature int `json:"temperature"`
- Humidity int `json:"humidity"`
- AQI int `json:"aqi"`
- PM25 int `json:"pm25"`
- PM10 int `json:"pm10"`
- Quality string `json:"quality"`
- LastUpdate time.Time `json:"last_update"`
- }
- func GetWeatherInfo(location, key string) (*WeatherInfoResp, error) {
- result := new(WeatherInfoResp)
- info, err := GetWeatherInfoByLocation(location, key)
- if err != nil {
- return nil, err
- }
- if len(info.Results) == 0 {
- return nil, errors.New(fmt.Sprintf("天气查询失败:%s", location))
- }
- result.Location = info.Results[0].Location.Name
- result.Text = info.Results[0].Now.Text
- result.Code = info.Results[0].Now.Code
- result.Temperature, _ = strconv.Atoi(info.Results[0].Now.Temperature)
- result.Humidity, _ = strconv.Atoi(info.Results[0].Now.Humidity)
- result.LastUpdate = info.Results[0].LastUpdate
- airInfo, err := GetAirInfoByLocation(location, key)
- if err != nil {
- return nil, err
- }
- result.PM25, _ = strconv.Atoi(airInfo.Results[0].Air.City.Pm25)
- result.AQI, _ = strconv.Atoi(airInfo.Results[0].Air.City.Aqi)
- result.PM10, _ = strconv.Atoi(airInfo.Results[0].Air.City.Pm10)
- result.Quality = airInfo.Results[0].Air.City.Quality
- return result, nil
- }
- func GetWeatherInfoByLocation(location, key string) (*WeatherResp, error) {
- ctx := context.Background()
- url := fmt.Sprintf("%s%s&key=%s", api, location, key)
- res := g.Client().GetVar(ctx, url)
- var result WeatherResp
- err := res.Scan(&result)
- if err != nil {
- return nil, errors.New("天气查询失败")
- }
- return &result, nil
- }
- func GetDayWeatherInfoByLocation(location, key string) (*XinZhiDayWeatherInfo, error) {
- ctx := context.Background()
- url := fmt.Sprintf("%s%s&key=%s", dayApi, location, key)
- res := g.Client().GetVar(ctx, url)
- var result XinZhiDayWeatherInfo
- err := res.Scan(&result)
- if err != nil {
- return nil, errors.New("天气查询失败")
- }
- return &result, nil
- }
- func GetAirInfoByLocation(location, key string) (*AirInfo, error) {
- ctx := context.Background()
- url := fmt.Sprintf("%s%s&key=%s", airApi, location, key)
- res := g.Client().GetVar(ctx, url)
- var result AirInfo
- err := res.Scan(&result)
- if err != nil {
- return nil, errors.New("天气查询失败")
- }
- return &result, nil
- }
|