[舔狗必备] 通过Linux计划任务每天定时自动发送天气预报给女神

Claire ·
更新时间:2024-11-14
· 853 次阅读

Linux计划任务每天定时自动发送天气预报 前言:

本人闲来无事,无意间看到官方一篇python文章,也是实现定时发送邮件的功能;奈何学术不精(目前大二,只接触过一年的编程),始终无法实现功能,于是想着向本专业靠拢,说是shell能不能实现呢?于是动手试了一下,还真被我试出来了;功能的核心是Linux对json格式的处理;可能有人会说这个功能没多大用处;但其实是有很多应用场景的,看你们能不能想出来了;

完成这个功能你需要: 一台云服务器 centos7 和风天气api 一个已经开启了smtp服务的邮箱账户 环境准备:

这里我使用的是一台阿里云的服务器,预装Centos7.2;首先要确保我们的服务器能够发送邮件我们要做两个准备:

1.开通邮箱的 smtp服务,这里我以QQ邮箱为例smtp服务
将第一个服务开启后,然后下载授权码;保存到本地,待会儿会用到

2.Linux下安装mailx,一般来说系统都有预装
我们可以使用管道命令查询系统中是否有mailxmailx
如果没有就直接yum安装

yum install -y mailx

然后我们来配置一下mailx

vim /etc/mail.rc

在配置文件的最后加上这几行

set from=xxxx@qq.com #这里是发送邮件的地址 set smtp=smtp.qq.com #这里是qq邮箱的smtp服务器 set smtp-auth-user=xxxx@qq.com #这里是你的邮箱账号 与第一个相同 set smtp-auth-password= #这里填你刚刚保存的授权码 set smtp-auth=login #这一行不变

到这里你已经完成了基础配置,你的服务器已经能够进行一些简单的邮件发送功能了,我们可以使用mail命令测试一下:

echo ""|mail -v -s "测试" xxxxx@qq.com #-v是显示发送过程 -s是邮件主题

你会收到一封空白邮件
测试

重点!

实现每天获取最新的天气状况,我们需要调用和风天气的api,shell命令行对api返回数据的处理是一个难点,也是一个重点,首先我们要注册成为和风的开发者,并获取api key;这里我不做多的介绍,大家可以看其官方的开发文档,已经很详细了;这边我直接演示在命令行的操作
我们首先可以看到他的免费版请求格式:

https://free-api.heweather.net/s6/weather/{weather-type}?{parameters}

{weather-type}这边我们选择的是forecast参数,返回的是3到十天的预报,Linux这边我们使用的是curl命令,我们可以把返回的数据存到一个txt文件中:

curl 'https://free-api.heweather.net/s6/weather/forecast?location=城市&key=你的key' &> weather.txt

城市填你想要获取的城市,key填你在开发者平台创建应用时获取的key
注意:请求的api一定要打引号,否则curl无法识别?后的内容
这时候已经我们已经把api返回数据写入了weather.txt这个文件中,我们可以cat查看一下:json
是不是头皮发麻,这个时候我们就应该认真阅读和风的开发文档,读懂这些数值的含义,那么我们如何来处理这些数据呢?我们拿cond_txt_d这个参数来举例,官方文档给的描述是:白天天气状况描述,那么我们如何获取到当天的数据呢?
这里就要大家灵活运用管道以及sed命令了:
首先我们要让这些数值的排列看起来整齐一些,我们先

cat weather.txt | sed 's/,/\n/g'

我们将所有的逗号转化为换行符,得到如下输出:在这里插入图片描述
接着我们通过grep找到我们的关键字段:

cat weather.txt | sed 's/,/\n/g'| grep "cond_txt_d"

得到如下输出:
在这里插入图片描述
按照顺序,我们知道第一个描述就是当天的天气状况描述,为了将字段与描述分开,我们将冒号继续替换为换行符:

cat weather.txt | sed 's/,/\n/g' | grep "cond_txt_d" | sed 's/:/\n/g'

得到如下输出:
在这里插入图片描述
这时我们只需要输出第二行的字段,就可以过滤掉其他几行,这边不多加赘述了,直接上终极处理命令!

cat weather.txt | sed 's/,/\n/g' | grep "cond_txt_d" | sed 's/:/\n/g' |sed '3,6d'|sed '1d'|sed 's/"//g'

命令运行后直接输出我们想要的字段
在这里插入图片描述
上述最后一个管道命令是去除双引号
我直接把几个常用参数的管道命令贴在下面,其返回数据可能会有变化,这个时候需要大家按我这个思路来慢慢过滤掉不需要的信息即可:

获取当日天气白天天气状况描述:cat weather.txt | sed 's/,/\n/g' | grep "cond_txt_d" | sed 's/:/\n/g' |sed '3,6d'|sed '1d'|sed 's/"//g' 获取当日天气晚间天气状况描述:cat weather.txt | sed 's/,/\n/g' | grep "cond_txt_n" | sed 's/:/\n/g' |sed '3,6d'|sed '1d'|sed 's/"//g' 获取当日天气最高温:cat weather.txt | sed 's/,/\n/g' | grep "tmp_max" | sed 's/:/\n/g' |sed '3,6d'|sed '1d'|sed 's/"//g' 获取当日天气最低温:cat weather.txt | sed 's/,/\n/g' | grep "tmp_min" | sed 's/:/\n/g' |sed '3,6d'|sed '1d'|sed 's/"//g' 获取当日日出时间:cat weather.txt | sed 's/,/\n/g' | grep "sr" | sed 's/"/\n/g'|sed '1,3d' |sed '2,15d' 获取当日日落时间:cat weather.txt | sed 's/,/\n/g' | grep "ss" | sed 's/"/\n/g'|sed '1,3d' |sed '2,15d' 获取当日月升时间:cat weather.txt | sed 's/,/\n/g' | grep "mr" | sed 's/"/\n/g'|sed '1,3d' |sed '2,15d' 获取当日月落时间:cat weather.txt | sed 's/,/\n/g' | grep "ms" | sed 's/"/\n/g'|sed '1,3d' |sed '2,15d' 获取当日降水概率:cat weather.txt | sed 's/,/\n/g' | grep "pop" | sed 's/"/\n/g'|sed '1,3d' |sed '2,15d'

到现在我们就可以直接写一个简单的shell脚本了

#!/bin/bash curl 'https://free-api.heweather.net/s6/weather/forecast?location=wuhan&key=xxxxxxx' &> /weather/weather.txt sun_up=$(cat weather.txt | sed 's/,/\n/g' | grep "sr" | sed 's/"/\n/g'|sed '1,3d' |sed '2,15d') sun_down=$(cat weather.txt | sed 's/,/\n/g' | grep "ss" | sed 's/"/\n/g'|sed '1,3d' |sed '2,15d') moon_up=$(cat weather.txt | sed 's/,/\n/g' | grep "mr" | sed 's/"/\n/g'|sed '1,3d' |sed '2,15d') moon_down=$(cat weather.txt | sed 's/,/\n/g' | grep "ms" | sed 's/"/\n/g'|sed '1,3d' |sed '2,15d') probability=$(cat weather.txt | sed 's/,/\n/g' | grep "pop" | sed 's/"/\n/g'|sed '1,3d' |sed '2,15d') day=$(cat weather.txt | sed 's/,/\n/g' | grep "cond_txt_d" | sed 's/:/\n/g' |sed '3,6d'|sed '1d'|sed 's/"//g') night=$(cat weather.txt | sed 's/,/\n/g' | grep "cond_txt_n" | sed 's/:/\n/g' |sed '3,6d'|sed '1d'|sed 's/"//g') max=$(cat weather.txt | sed 's/,/\n/g' | grep "tmp_max" | sed 's/:/\n/g' |sed '3,6d'|sed '1d'|sed 's/"//g') min=$(cat weather.txt | sed 's/,/\n/g' | grep "tmp_min" | sed 's/:/\n/g' |sed '3,6d'|sed '1d'|sed 's/"//g') echo "美好的清晨,今天日出时间为${sun_up};今天白天天气为:${day},最高气温${max}度,最低气温${min}度;降水概率为${probability}%,今天的日落会在${sun_down},每一天都要开心,加油!" |mail -v -s "早安" xxxx@qq.com

重要:因为是要写计划任务,所以脚本中一切路径一定要写绝对路径,否则会出bug;再就是我们还要chmod +x weather.sh让它成为一个可执行文件

关于计划任务crontab这里不多介绍,网上以及有很多博客对它有很详细解释了这里就提示一点:他的时间格式 * * * * * 分别代表:分 时 日 月 周,先看一下systemctl status crond服务有没有启动,启动之后:
我们直接crontab -e写下我们的时间即可:
在这里插入图片描述
他将在每天的七点半执行这个脚本,于是我每天七点半在手机上就会收到天气预报邮件
在这里插入图片描述

本文结束
后期排错的话建议大家直接看crond的日志,路径是/var/mail/root


作者:武软吴彦祖



自动 天气预报 Linux 天气

需要 登录 后方可回复, 如果你还没有账号请 注册新账号