一、介绍
基于golang开发每天通过邮件发送天气信息
github地址:/betterfor/
二、要点
1、获取天气的api
2、发送邮件
3、定时
三、获取天气api
比较百度地图和高德地图,百度地图的天气接口已经取消,高德地图的使用也较为简单。
申请key
天气查询API服务地址:
https:///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 := (url)
-
if err!=nil {
-
return "",err
-
} else {
-
defer ()
-
body,err := ()
-
if err != nil {
-
return "",err
-
} else {
-
return string(body),err
-
}
-
}
-
}
获取天气信息
-
func getWeather() (string,string,error) {
-
url := "/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
-
([]byte(rlt),&data)
-
if err != nil {
-
return (),"",err
-
} else {
-
fore = [0]
-
output := + + " 预报时间:" + + "\n"
-
var str,subject string
-
for i := 0; i < len(); i++ {
-
cast = [i]
-
str += "日期:" ++ "\t星期"+NumToStr()+
-
"\n白天:【天气:"++"\t 温度:"++"\t 风向:"++"\t 风力:"++"】"+
-
"\n夜晚:【天气:"++"\t 温度:"++"\t\t 风向:"++"\t 风力:"++"】\r\n"
-
}
-
subject = verity([0].Dayweather,[0].Nightweather)
-
return subject,output+str,nil
-
}
-
}
一些小工具
-
func verity(dayweather,nightweather string) string {
-
var sub string
-
rain := "雨"
-
snow := "雪"
-
sub = "收藏点赞投硬币,新的一天会有好事发生哝 ||今日天气预报"
-
if (dayweather,rain) || (nightweather,rain) {
-
sub = sub + "今天将降雨,出门请别忘带伞"
-
}
-
if (dayweather,snow) || (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 := (host,":")
-
auth := ("",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 := (to,";")
-
err := (host,auth,user,send_to,msg)
-
return err
-
}
-
func sendEmail(subject,body string) {
-
user := "发件箱"
-
pwd := "发件箱的授权码"
-
host := "smtp.:25"
-
to := "收件箱"//可以用;隔开发送多个
-
("send email")
-
err := sendToMail(user,pwd,host,to,subject,body,"html")
-
if err != nil {
-
("Send mail error!")
-
(err)
-
} else {
-
("Send mail success!")
-
}
-
}
五、定时发送消息
可以考虑(*24),就是感觉不高大上。
-
func main() {
-
TimeSettle()
-
}
-
-
//定时结算
-
func TimeSettle() {
-
d := ()
-
t := (d)
-
defer ()
-
for {
-
currentTime := ()
-
if () == 8 {
-
sendinfo()
-
()
-
}
-
<-
-
}
-
}
六、结果
每天起床第一眼,先看天气预报( ・᷄৺・᷅ )。
大概输出就是这样,下面可能会考虑如何通过qq或微信发送天气预报。
如果有问题欢迎询问,上面有邮箱哦