172 lines
4.7 KiB
Go
172 lines
4.7 KiB
Go
package api
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"github.com/kataras/iris/v12"
|
||
"github.com/sirupsen/logrus"
|
||
"io"
|
||
"main/database"
|
||
"main/model"
|
||
"main/utils"
|
||
"net/http"
|
||
"net/url"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
// 获取location
|
||
func getLocation(ctx iris.Context) {
|
||
param := ctx.URLParam("location")
|
||
res, err := http.Get(fmt.Sprintf("https://wis.qq.com/city/like?source=pc&city=%s", param))
|
||
if utils.ErrHandle(ctx, err) {
|
||
return
|
||
}
|
||
defer func(Body io.ReadCloser) {
|
||
err = Body.Close()
|
||
if utils.ErrHandle(ctx, err) {
|
||
return
|
||
}
|
||
}(res.Body)
|
||
body, _ := io.ReadAll(res.Body)
|
||
var r resLocation
|
||
//解析json结构
|
||
err = json.Unmarshal(body, &r)
|
||
if utils.ErrHandle(ctx, err) {
|
||
return
|
||
}
|
||
err = ctx.JSON(utils.FormatRes(200, "", r.Data))
|
||
if utils.ErrHandle(ctx, err) {
|
||
return
|
||
}
|
||
}
|
||
|
||
// 获取天气方法
|
||
func getWeather(ctx iris.Context) {
|
||
user := utils.GetLoginUser(ctx)
|
||
if utils.DataIsNil(user) {
|
||
return
|
||
}
|
||
var info model.Userinfo
|
||
db := database.GetInstance().GetMysqlDb()
|
||
if err := db.Where("username = ?", user.Username).First(&info).Error; err != nil {
|
||
logrus.Errorln("sql执行失败:", err)
|
||
}
|
||
var location []string
|
||
if info.Location == "" {
|
||
location = []string{"北京", "北京", "顺义"}
|
||
} else {
|
||
info.Location = strings.ReplaceAll(info.Location, " ", "")
|
||
location = strings.Split(info.Location, ",")
|
||
if len(location) < 3 {
|
||
location = append(location, "")
|
||
}
|
||
}
|
||
res, err := getMyWeather(location[0], location[1], location[2])
|
||
if utils.ErrHandle(ctx, err) {
|
||
return
|
||
}
|
||
err = ctx.JSON(utils.FormatRes(200, "", res))
|
||
if utils.ErrHandle(ctx, err) {
|
||
return
|
||
}
|
||
}
|
||
|
||
// 获取地点对应地址天气
|
||
func getMyWeather(province string, city string, county string) (string, error) {
|
||
var weather []model.Weather
|
||
var respWeather string
|
||
db := database.GetInstance().GetMysqlDb()
|
||
if err := db.Where(&model.Weather{Date: time.Now().Format("2006-01-02"), Location: fmt.Sprintf("%s,%s,%s", province, city, county)}).Find(&weather).Error; err != nil {
|
||
logrus.Errorln("sql执行失败:", err)
|
||
}
|
||
if len(weather) == 0 {
|
||
resp, err := http.Get(fmt.Sprintf("https://wis.qq.com/weather/common?"+
|
||
"source=pc&weather_type=forecast_24h&province=%s&city=%s&county=%s", url.QueryEscape(province), url.QueryEscape(city), url.QueryEscape(county)))
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
defer func(Body io.ReadCloser) {
|
||
err = Body.Close()
|
||
if err != nil {
|
||
}
|
||
}(resp.Body)
|
||
body, err := io.ReadAll(resp.Body)
|
||
if err != nil {
|
||
fmt.Println(err)
|
||
}
|
||
var r resWeather
|
||
//解析json结构
|
||
err = json.Unmarshal(body, &r)
|
||
if err != nil {
|
||
//fmt.Println(fmt.Sprintf("https://wis.qq.com/weather/common?"+
|
||
// "source=pc&weather_type=forecast_24h&province=%s&city=%s&county=%s", url.QueryEscape(province), url.QueryEscape(city), url.QueryEscape(county)))
|
||
//fmt.Println(resp.Body, "----------", string(body), "----------", err)
|
||
return "", err
|
||
}
|
||
todayWeather := formatWeather(r.Data.Forecast24h.D0)
|
||
tomWeather := formatWeather(r.Data.Forecast24h.D1)
|
||
respWeather = fmt.Sprintf("%s;%s", todayWeather, tomWeather)
|
||
if err1 := db.Create(&model.Weather{
|
||
Date: time.Now().Format("2006-01-02"),
|
||
Location: fmt.Sprintf("%s,%s,%s", province, city, county),
|
||
Weather: respWeather,
|
||
}).Error; err1 != nil {
|
||
logrus.Errorln("sql执行失败:", err1)
|
||
}
|
||
} else {
|
||
respWeather = weather[0].Weather
|
||
}
|
||
return respWeather, nil
|
||
}
|
||
|
||
// 天气格式化
|
||
func formatWeather(data res24h) string {
|
||
var weather string
|
||
var windPower string
|
||
var windDirection string
|
||
var degree string
|
||
if data.DayWeather == data.NightWeather {
|
||
weather = data.DayWeather
|
||
} else {
|
||
weather = fmt.Sprintf("%s转%s", data.NightWeather, data.DayWeather)
|
||
}
|
||
if data.DayWindDirection == data.NightWindDirection {
|
||
windDirection = data.DayWindDirection
|
||
} else {
|
||
windDirection = fmt.Sprintf("%s转%s", data.NightWindDirection, data.DayWindDirection)
|
||
}
|
||
if data.DayWindPower == data.NightWindPower {
|
||
windPower = data.DayWindPower + "级"
|
||
} else {
|
||
windPower = fmt.Sprintf("%s~%s级", data.NightWindPower, data.DayWindPower)
|
||
}
|
||
degree = fmt.Sprintf("%s~%s℃", data.MinDegree, data.MaxDegree)
|
||
return fmt.Sprintf("%s, %s, %s %s", weather, degree, windDirection, windPower)
|
||
}
|
||
|
||
func testWeather(ctx iris.Context) {
|
||
var location []string
|
||
loc := ctx.URLParam("location")
|
||
fmt.Println(loc)
|
||
if loc == "" {
|
||
location = []string{"北京", "北京", "顺义"}
|
||
fmt.Println(location)
|
||
} else {
|
||
loc = strings.ReplaceAll(loc, " ", "")
|
||
location = strings.Split(loc, ",")
|
||
if len(location) < 3 {
|
||
location = append(location, "")
|
||
}
|
||
fmt.Println(location)
|
||
}
|
||
res, err := getMyWeather(location[0], location[1], location[2])
|
||
if utils.ErrHandle(ctx, err) {
|
||
return
|
||
}
|
||
err = ctx.JSON(utils.FormatRes(200, "", res))
|
||
if utils.ErrHandle(ctx, err) {
|
||
return
|
||
}
|
||
}
|