前言
后来又加了每天早晨定时给自己和女朋友发天气预报提醒,开始着手做,gogogo!
运行环境
- 阿里云Linux服务器
- Go开发环境
完整的项目代码:
一、获取接口数据
1、每日一句接口
调用地址: 请求方式:GET 请求参数:
参数 必选 类型 说明 date 否 string 格式为:2013-05-06;如果date为空,则默认取当天 type 否 string 可选值为last和next;以date日期为准的,last返回前一天的,next返回后一天的返回类型:JSON JSON字段解释:
属性名 属性值类型 说明 sid string 每日一句ID tts string 音频地址 content string 英文内容 note string 中文内容 love string 每日一句喜欢个数 translation string 词霸小编 picture string 图片地址 picture2 string 大图片地址 caption string 标题 dateline string 时间 s_pv string 浏览数 sp_pv string 语音评测浏览数 tags array 相关标签 fenxiang_img string 合成图片,建议分享微博用的返回示例:
{ "sid": "3369", "tts": "http://news.iciba.com/admin/tts/2019-04-23-day.mp3", "content": "There is no such thing as a great talent without great will.", "note": "没有伟大的意志力,便没有雄才大略。", "love": "197", "translation": "小编的话:正如爱迪生所说一般,强者容易坚强。只有坚强的意志力才能给我们克服各种困难的勇气和决心。", "picture": "http://cdn.iciba.com/news/word/20190423.jpg", "picture2": "http://cdn.iciba.com/news/word/big_20190423b.jpg", "caption": "词霸每日一句", "dateline": "2019-04-23", "s_pv": "0", "sp_pv": "0", "tags": [ { "id": null, "name": null } ], "fenxiang_img": "http://cdn.iciba.com/web/news/longweibo/imag/2019-04-23.jpg" }
请求示例:
type sentence struct { Content string `json:"content"` Note string `json:"note"` Translation string `json:"translation"` } func getsen() (sentence, string) { resp, err := http.Get("http://open.iciba.com/dsapi/?date") sent := sentence{} if err != nil { fmt.Println("获取每日一句失败", err) return sent, "" } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("读取内容失败", err) return sent, "" } err = json.Unmarshal(body, &sent) if err != nil { fmt.Println("每日一句解析json失败") return sent, "" } fenxiangurl := gjson.Get(string(body), "fenxiang_img").String() fmt.Println(sent) return sent, fenxiangurl }
这里使用了golang自带的http包发起了一次get请求,然后将返回的json数据解析出来,另外使用了gjon这个包,该包可以直接从json字符串中解析出需要的字段,十分方便。(其实这段代码我偷了个懒,如果内部有错误应该将错误return出去,大家不要学我啊 ~~o(>_<)o ~~)
2、获取天气预报接口
调用地址: 请求方式:GET 请求参数:
参数 必选 类型 说明 version 是 string v1(版本标识) cityid 以下参数3选1 string 101120201(城市编号,不要带CN, 以下参数3选1) city 3选1 string 青岛(城市名称,不要带市和区) ip 3选1 string (IP地址) callback string jsonp方式返回类型:JSON 返回示例:
该接口会返回往后一周的天气预报,因为返回的参数过多,我只截取了当天的数据。如果需要其它数据可以自己请求一下。
请求示例代码:
func getweather(city string) (string, string, string, string) { url := fmt.Sprintf("https://www.tianqiapi.com/api?version=%s&city=%s", WeatherVersion, city) resp, err := http.Get(url) if err != nil { fmt.Println("获取天气失败", err) return "", "", "", "" } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("读取内容失败", err) return "", "", "", "" } data := gjson.Get(string(body), "data").Array() thisday := data[0].String() day := gjson.Get(thisday, "day").Str //日期 wea := gjson.Get(thisday, "wea").Str //天气 tem := gjson.Get(thisday, "tem").Str //平均气温 air_tips := gjson.Get(thisday, "air_tips").Str //提示 return day, wea, tem, air_tips }
get请求获得天气数据,gjson包将当天的天气信息解析出来后返回。同样地,偷懒错误没return出去 ?。
1、每日一句模板
- 扫码登录公众平台测试号 申请测试号的地址
- 手机上确认登录
- 找到 新增测试模板 ,添加模板消息 填写模板标题 《每日一句》,填写如下模板内容
{ {content.DATA}} { {note.DATA}} { {translation.DATA}}
注意:后面的.DATA必须保留,前面是你定义的字段。 提交保存之后,记住该模板ID,一会儿会用到
- 找到测试号信息,记住 appid 和 appsecret,一会儿会用到
2、天气预报模板
和每日一句的添加方法一样,区别在于第3步中新增测试模板使用的模板不同:
{ {city.DATA}} { {day.DATA}} { {wea.DATA}} { {tem1.DATA}} { {air_tips.DATA}}
四、设置定时发送
func main() { spec := "0 0 12 * * *" // 每天12:00 spec1 := "0 0 7 * * *" // 每天早晨7:00 c := cron.New() c.AddFunc(spec, everydaysen) c.AddFunc(spec1, weather) c.Start() fmt.Println("开启定时任务") select {} //weather() //everydaysen() }
使用了 包的定时任务,使每天早晨7点和中午12点发送天气预报和每日一句。
spec := “0 0 12 * * *” 这里对应的分别是 “ 秒 分 时 日 月 周 ” 和linux里的crontab定时任务差不多。
在阿里云Linux服务器上后台启动该程序既可。
完整的项目代码: