基于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
}
}
每天起床第一眼,先看天气预报( ・᷄৺・᷅ )。
大概输出就是这样,下面可能会考虑如何通过qq或微信发送天气预报。
如果有问题欢迎询问,上面有邮箱哦