树莓派应用——每日天气预报邮件

**DIY目标:**
使用树莓派实现每日自动发送天气预报邮件的功能。
**平台:**
树莓派4b
**步骤:**
1.注册 和风天气 获取一个免费的Key  
2.使用Postman测试网站的API,了解参数和返回的天气数据格式。
3.写一个sh脚本,获取天气信息,并使用jq对信息进行提取。
4.自动发送邮件

1.注册 和风天气 获取一个免费的key

API是Application Programming Interface的英文缩写,我们将使用互联网API获取天气预报信息。
首先在和风天气网站注册账户:
https://id.heweather.com/login?redirect=https://console.heweather.com/my/service。
登录,进入 应用管理 新建应用,输入应用名称,然后添加KEY,类型选择WebAPI,前两种类型无法当作普通的站点。之后就可以看到一串数字和字母组成的key,记住她,并妥善保管。
树莓派应用——每日天气预报邮件_第1张图片
2.使用Postman测试网站的API,了解参数和返回的天气数据格式。
我们可以使用Postman软件对目标网络API进行测试。了解API的输入参数和返回值格式。
postman下载地址:https://www.postman.com/downloads/
打开postman,新建标签页,选择GET,输入目标网址,这里我们可以参考和风天气的帮助文档:https://dev.heweather.com/docs/api/weather
树莓派应用——每日天气预报邮件_第2张图片
通过这份文档可以发现,Postman中的网址可以输入https://free-api.heweather.net/s6/weather/{weather-type}?{parameters},其中,weather-type是你想知道的天气预报类型,比如now,lifestyle等,这里我们写成lifestyle,parameters需要填写城市和key的信息。在Postman中按照下图配置即可。
树莓派应用——每日天气预报邮件_第3张图片
点击发送,就可以得到API返回值。
树莓派应用——每日天气预报邮件_第4张图片
注意,这里的返回值格式是JSON,我们后期还需要用jq软件对其进行信息提取。
3.写一个sh脚本,获取天气信息,并使用jq对信息进行提取。
在树莓派中,我们要用到curl指令访问API站点,然后使用jq指令处理返回的信息。curl程序已经在系统中了,我们还需要下载jq程序。

sudo apt-get install jq

最后,来编写bash脚本:

#!/usr/bin/env bash
WEATHER=$(curl "https://free-api.heweather.net/s6/weather/lifestyle?location=你所在的城市名&key=你的key码")
SUGGESTIONS=$(echo ${WEATHER} | jq -r '.HeWeather6[0].lifestyle | values[].txt') 

上述bash指令中,curl一行从目标站点获取了天气信息。echo一行,通过管道将多个指令连接起来,也就是,把WEATHER送入jq指令,在jq指令中对信息进行提取,这里有必要说明一下jq指令的使用方法。

jq [options] filter [files]
**options:**
--version:输出jq的版本信息并退出
--slurp/-s:读入整个输入流到一个数组。
--raw-input/-R:不作为JSON解析,将每一行的文本作为字符串输出到屏幕。
--null-input/ -n:不读取任何输入,过滤器运行使用null作为输入。一般用作从头构建JSON数据。
--compact-output /-c:使输出紧凑,而不是把每一个JSON对象输出在一行。
--colour-output / -C:打开颜色显示
--monochrome-output / -M:关闭颜色显示

--ascii-output /-a:指定输出格式为ASCII

-raw-output /-r :如果过滤的结果是一个字符串,那么直接写到标准输出(去掉字符串的引号)

**filter:**
.   : 默认输出
.foo: 输出指定属性,foo代表属性。
.[foo] :输出指定数组元素。foo代表数组下标。
.[]:输出指定数组中全部元素
, :指定多个属性作为过滤条件时,用逗号分隔
| : 将指定的数组元素中的某个属性作为过滤条件

**files:**
    JOSN格式文件。

这里我们来看WEATHER是什么。
执行echo $WEATHER

pi@raspberrypi:~ $ WEATHER=$(curl "https://free-api.heweather.net/s6/weather/lifestyle?location=shijiazhuang&key=a9e3cd9e0e9548f98dd4d79d394c67b2")
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1458  100  1458    0     0  10414      0 --:--:-- --:--:-- --:--:-- 10489
pi@raspberrypi:~ $ echo $WEATHER
{"HeWeather6":[{"basic":{"cid":"CN101090101","location":"石家庄","parent_city":"石家庄","admin_area":"河北","cnty":"中国","lat":"38.04547501","lon":"114.50246429","tz":"+8.00"},"update":{"loc":"2020-06-28 05:55","utc":"2020-06-27 21:55"},"status":"ok","lifestyle":[{"type":"comf","brf":"舒适","txt":"白天温度适宜,风力不大,相信您在这样的天气条件下,应会感到比较清爽和舒适。"},{"type":"drsg","brf":"热","txt":"天气热,建议着短裙、短裤、短薄外套、T恤等夏季服装。"},{"type":"flu","brf":"少发","txt":"各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。"},{"type":"sport","brf":"较不宜","txt":"有降水,且风力较强,气压较低,推荐您在室内进行低强度运动;若坚持户外运动,须注意避雨防风。"},{"type":"trav","brf":"一般","txt":"有降水,请尽量不要外出,若外出,请注意防雷。风稍大但温度适宜,还是可以外出游玩的。"},{"type":"uv","brf":"最弱","txt":"属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。"},{"type":"cw","brf":"不宜","txt":"不宜洗车,未来24小时内有雨,如果在此期间洗车,雨水和路上的泥水可能会再次弄脏您的爱车。"},{"type":"air","brf":"良","txt":"气象条件有利于空气污染物稀释、扩散和清除。"}]}]}

所以,我们用jq指令,将其中lifestyle项中的所有txt文本提取出来。


pi@raspberrypi:~ $ echo $SUGGESTIONS
白天温度适宜,风力不大,相信您在这样的天气条件下,应会感到比较清爽和舒适。 天气热,建议着短裙、短裤、短薄外套、T恤等夏季服装。 各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。 有降水,且风力较强,气压较低,推荐您在室内进行低强度运动;若坚持户外运动,须注意避雨防风。 有降水,请尽量不要外出,若外出,请注意防雷。风稍大但温度适宜,还是可以外出游玩的。 属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。 不宜洗车,未来24小时内有雨,如果在此期间洗车,雨水和路上的泥水可能会再次弄脏您的爱车。 气象条件有利于空气污染物稀释、扩散和清除。

4.自动发送邮件
安装步骤参考:https://www.jianshu.com/p/6366e279a9d3
配置之后,在我们之前的sh脚本中添加以下代码:

echo ${SUGGESTIONS} | mutt -s "Shijiazhuang $(date)" [email protected]

最后,配置自动进程文件。
在终端中输入如下命令:

crontab -e

打开文件的最底端添加一行:

00 7 * * * sh /home/pi/call_weather_api.sh

至此,就可以实现用树莓派自动发送天气邮件啦!
最后,这个应用还可以有几点扩展:
1.尝试获取不同的天气信息,比如当前天气,3-10天天气预报等,当然,也需要修改后边的jq指令,获取不同的信息。
2.自动发送邮件的内容可以不局限于天气,比如日常问候等等,有了这一点,可以做到的事情是不是很多呢(≧∇≦)ノ

https://www.jianshu.com/p/6366e279a9d3
https://blog.csdn.net/u011641885/article/details/45559031

你可能感兴趣的:(树莓派)