You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-library/service/baidu/weather.go

104 lines
4.4 KiB

package baidu
import (
"context"
"github.com/dtapps/go-library/utils/gojson"
"github.com/dtapps/go-library/utils/gorequest"
"net/http"
)
type WeatherResponse struct {
Status int `json:"status"`
Result struct {
Location struct {
Country string `json:"country"` // 国家名称
Province string `json:"province"` // 省份名称
City string `json:"city"` // 城市名称
Name string `json:"name"` // 区县名称
Id string `json:"id"` // 区县id
} `json:"location"` // 地理位置信息
Now struct {
Text string `json:"text"` // 天气现象
Temp int `json:"temp"` // 温度(℃)
FeelsLike int `json:"feels_like"` // 体感温度(℃)
Rh int `json:"rh"` // 相对湿度(%)
WindClass string `json:"wind_class"` // 风力等级
WindDir string `json:"wind_dir"` // 风向描述
Prec1h float64 `json:"prec_1h"` // 1小时累计降水量(mm)
Clouds int `json:"clouds"` // 云量(%)
Vis int `json:"vis"` // 能见度(m)
Aqi int `json:"aqi"` // 空气质量指数数值
Pm25 int `json:"pm25"` // pm2.5浓度(μg/m3)
Pm10 int `json:"pm10"` // pm10浓度(μg/m3)
No2 int `json:"no2"` // 二氧化氮浓度(μg/m3)
So2 int `json:"so2"` // 二氧化硫浓度(μg/m3)
O3 int `json:"o3"` // 臭氧浓度(μg/m3)
Co float64 `json:"co"` // 一氧化碳浓度(mg/m3)
Uptime string `json:"uptime"` // 数据更新时间,北京时间
} `json:"now"` // 实况数据
Alert []struct {
Type string `json:"type"` // 预警事件类型
Level string `json:"level"` // 预警事件等级
Title string `json:"title"` // 预警标题
Desc string `json:"desc"` // 预警详细提示信息
} `json:"alert"` // 气象预警数据
Indexes []struct {
Name string `json:"name"` // 生活指数中文名称
Brief string `json:"brief"` // 生活指数概要说明
Detail string `json:"detail"` // 生活指数详细说明
} `json:"indexes"` // 生活指数数据
Forecasts []struct {
Date string `json:"date"` // 日期,北京时区
Week string `json:"week"` // 星期,北京时区
High int `json:"high"` // 最高温度(℃)
Low int `json:"low"` // 最低温度(℃)
WcDay string `json:"wc_day"` // 白天风力
WcNight string `json:"wc_night"` // 晚上风力
WdDay string `json:"wd_day"` // 白天风向
WdNight string `json:"wd_night"` // 晚上风向
TextDay string `json:"text_day"` // 白天天气现象
TextNight string `json:"text_night"` // 晚上天气现象
} `json:"forecasts"` // 预报数据
ForecastHours []struct {
Text string `json:"text"` // 天气现象
TempFc int `json:"temp_fc"` // 温度(℃)
WindClass string `json:"wind_class"` // 风力等级
WindDir string `json:"wind_dir"` // 风向描述
Rh int `json:"rh"` // 相对湿度
Prec1h float64 `json:"prec_1h"` // 1小时累计降水量(mm)
Clouds int `json:"clouds"` // 云量(%)
DataTime string `json:"data_time"` // 数据时间
} `json:"forecast_hours"` // 未来24小时逐小时预报
} `json:"result"`
Message string `json:"message"`
}
type WeatherResult struct {
Result WeatherResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
}
func newWeatherResult(result WeatherResponse, body []byte, http gorequest.Response) *WeatherResult {
return &WeatherResult{Result: result, Body: body, Http: http}
}
// Weather 国内天气查询服务
// https://lbsyun.baidu.com/index.php?title=webapi/weather
func (c *Client) Weather(ctx context.Context, districtId string, notMustParams ...gorequest.Params) (*WeatherResult, error) {
// 参数
params := gorequest.NewParamsWith(notMustParams...)
params.Set("ak", c.GetAk())
params.Set("district_id", districtId)
params.Set("output", "json")
// 请求
request, err := c.request(ctx, apiUrl+"/weather/v1/", params, http.MethodGet)
if err != nil {
return newWeatherResult(WeatherResponse{}, request.ResponseBody, request), err
}
// 定义
var response WeatherResponse
err = gojson.Unmarshal(request.ResponseBody, &response)
return newWeatherResult(response, request.ResponseBody, request), err
}