基于golang开发每天通过邮件发送天气信息
github地址:https://github.com/betterfor/weather.git
1、获取天气的api
2、发送邮件
3、定时
比较百度地图和高德地图,百度地图的天气接口已经取消,高德地图的使用也较为简单。
申请key
天气查询API服务地址:
https://restapi.amap.com/v3/weather/weatherInfo?parameters
参数名 | 含义 | 规则说明 | 是否必须 | 缺省值 | |
---|---|---|---|---|---|
key | 请求服务权限标识 | 用户在高德地图官网申请web服务API类型KEY | 必填 | 无 | |
city | 城市编码 | 输入城市的adcode,adcode信息可参考城市编码表 | 必填 | 无 | |
extensions | 气象类型 | 可选值:base/all base:返回实况天气 all:返回预报天气 | 可选 | 无 | |
output | 返回格式 | 可选值:JSON,XML | 可选 | JSON |
行政区域查询的响应结果的格式由请求参数output指定。天气对照表>>
名称 | 含义 | 规则说明 | ||
---|---|---|---|---|
status | 返回状态 | 值为0或1 1:成功;0:失败 | ||
count | 返回结果总数目 | |||
info | 返回的状态信息 | |||
infocode | 返回状态说明,10000代表正确 | |||
forecast | 预报天气信息数据 | |||
city | 城市名称 | |||
adcode | 城市编码 | |||
province | 省份名称 | |||
reporttime | 预报发布时间 | |||
casts | 预报数据list结构,元素cast,按顺序为当天、第二天、第三天的预报数据 | |||
date | 日期 | |||
week | 星期几 | |||
dayweather | 白天天气现象 | |||
nightweather | 晚上天气现象 | |||
daytemp | 白天温度 | |||
nighttemp | 晚上温度 | |||
daywind | 白天风向 | |||
nightwind | 晚上风向 | |||
daypower | 白天风力 | |||
nightpower | 晚上风力 |
获取网络请求
func doHttpGetRequest(url string) (rlt string,err error) {
resp,err := http.Get(url)
if err!=nil {
return "",err
} else {
defer resp.Body.Close()
body,err := ioutil.ReadAll(resp.Body)
if err != nil {
return "",err
} else {
return string(body),err
}
}
}
获取天气信息
func getWeather() (string,string,error) {
url := "https://restapi.amap.com/v3/weather/weatherInfo?"
key := "你的appkey"
city := "370211"
ext := "all"
rlt,err:=doHttpGetRequest(url + "city=" + city + "&key=" + key + "&extensions=" + ext)
var data Weather
var fore Forecast
var cast Cast
json.Unmarshal([]byte(rlt),&data)
if err != nil {
return err.Error(),"",err
} else {
fore = data.Forecasts[0]
output := fore.Province + fore.City + " 预报时间:" + fore.Reporttime + "\n"
var str,subject string
for i := 0; i < len(fore.Casts); i++ {
cast = fore.Casts[i]
str += "日期:" +cast.Date+ "\t星期"+NumToStr(cast.Week)+
"\n白天:【天气:"+cast.Dayweather+"\t 温度:"+cast.Daytemp+"\t 风向:"+cast.Daywind+"\t 风力:"+cast.Daypower+"】"+
"\n夜晚:【天气:"+cast.Nightweather+"\t 温度:"+cast.Nighttemp+"\t\t 风向:"+cast.Nightwind+"\t 风力:"+cast.Nightpower+"】\r\n"
}
subject = verity(fore.Casts[0].Dayweather,fore.Casts[0].Nightweather)
return subject,output+str,nil
}
}
一些小工具
func verity(dayweather,nightweather string) string {
var sub string
rain := "雨"
snow := "雪"
sub = "收藏点赞投硬币,新的一天会有好事发生哝 ||今日天气预报"
if strings.Contains(dayweather,rain) || strings.Contains(nightweather,rain) {
sub = sub + "今天将降雨,出门请别忘带伞"
}
if strings.Contains(dayweather,snow) || strings.Contains(nightweather,snow) {
sub = sub + " 下雪了"
}
return sub
}
func NumToStr(str string) string {
switch str {
case "1":
return "一"
case "2":
return "二"
case "3":
return "三"
case "4":
return "四"
case "5":
return "五"
case "6":
return "六"
case "7":
return "日"
}
return ""
}
接受到的天气信息
type Weather struct {
Status string `json:"status"返回状态`
Count string `json:"count"返回结果总条数`
Info string `json:"info"返回的状态信息`
Infocode string `json:"infocode"返回状态说明`
Forecasts []Forecast `json:"forecasts"预报天气信息数据`
}
type Forecast struct {
City string `json:"city"城市名称`
Adcode string `json:"adcode"城市编码`
Province string `json:"province"省份`
Reporttime string `json:"reporttime"预报时间`
Casts []Cast `json:casts预报数据`
}
type Cast struct {
Date string `json:"date"日期`
Week string `json:"week"星期`
Dayweather string `json:"dayweather"白天天气`
Nightweather string `json:"nightweather"晚上天气`
Daytemp string `json:"daytemp"白天温度`
Nighttemp string `json:"nighttemp"晚上温度`
Daywind string `json:"daywind"白天风向`
Nightwind string `json:"nightwind"晚上风向`
Daypower string `json:"daypower"白天风力`
Nightpower string `json:"nightpower"晚上风力`
}
func sendToMail(user,password,host,to,subject,body,mailtype string) error {
hp := strings.Split(host,":")
auth := smtp.PlainAuth("",user,password,hp[0])
var content_type string
if mailtype =="html" {
content_type = "Content_Type: text/" + mailtype + "; charset=UTF-8"
} else {
content_type = "Content_Type: text/plain" + "; charset=UTF-8"
}
msg := []byte("To:" + to +"\r\nFrom: " + user + "<"+
user + ">\r\nSubject: "+ subject + "\r\n" +
content_type + "\r\n\r\n" + body)
send_to := strings.Split(to,";")
err := smtp.SendMail(host,auth,user,send_to,msg)
return err
}
func sendEmail(subject,body string) {
user := "发件箱"
pwd := "发件箱的授权码"
host := "smtp.126.com:25"
to := "收件箱"//可以用;隔开发送多个
fmt.Println("send email")
err := sendToMail(user,pwd,host,to,subject,body,"html")
if err != nil {
fmt.Println("Send mail error!")
fmt.Println(err)
} else {
fmt.Println("Send mail success!")
}
}
可以考虑time.sleep(time.hour*24),就是感觉不高大上。
func main() {
TimeSettle()
}
//定时结算
func TimeSettle() {
d := time.Duration(time.Minute)
t := time.NewTicker(d)
defer t.Stop()
for {
currentTime := time.Now()
if currentTime.Hour() == 8 {
sendinfo()
time.Sleep(time.Hour)
}
<-t.C
}
}