Files
web_ylsa/api_iris/service/api/weather.go
2025-07-11 16:54:11 +08:00

172 lines
4.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}