一、介绍
基于golang开发每天通过邮件发送天气信息
二、要点
1、获取天气的api
2、发送邮件
3、定时
三、获取天气api
比较百度地图和高德地图,百度地图的天气接口已经取消,高德地图的使用也较为简单。
申请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 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或微信发送天气预报。
如果有问题欢迎询问,上面有邮箱哦