本人闲来无事,无意间看到官方一篇python文章,也是实现定时发送邮件的功能;奈何学术不精(目前大二,只接触过一年的编程),始终无法实现功能,于是想着向本专业靠拢,说是shell能不能实现呢?于是动手试了一下,还真被我试出来了;功能的核心是Linux对json格式的处理;可能有人会说这个功能没多大用处;但其实是有很多应用场景的,看你们能不能想出来了;
完成这个功能你需要: 一台云服务器 centos7 和风天气api 一个已经开启了smtp服务的邮箱账户 环境准备:这里我使用的是一台阿里云的服务器,预装Centos7.2;首先要确保我们的服务器能够发送邮件我们要做两个准备:
1.开通邮箱的 smtp服务,这里我以QQ邮箱为例
将第一个服务开启后,然后下载授权码;保存到本地,待会儿会用到
2.Linux下安装mailx,一般来说系统都有预装
我们可以使用管道命令查询系统中是否有mailx
如果没有就直接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查看一下:
是不是头皮发麻,这个时候我们就应该认真阅读和风的开发文档,读懂这些数值的含义,那么我们如何来处理这些数据呢?我们拿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