序言:
本人闲来无事,无意间听到某网站一篇python文章,也是实现定时发送短信的功能;怎奈学术不精,仍然未能实现功能,于是想着向本专业靠拢,说是shell能不能实现呢?于是动手试了一下,还真被我试下来了;
**功能的核心是Linuxshell对json格式的处理**;
可能有人会说这个功能没多大益处;但也许是有好多应用场景的,看大家能不能想下来了;
完成这个功能你须要:
1.一台云服务器
2.centos7
3.和风天气api
4.一个早已开启了smtp服务的邮箱帐户
环境打算:
这儿我使用的是一台阿里云的服务器,预装Centos7.2;首先要确保我们的服务器才能发送短信我们要做两个打算:
1.开通邮箱的smtp服务,这儿我以QQ邮箱为例
开启smtp服务
将第一个服务开启后,之后下载授权码;保存到本地,到时候会用到
2.Linux下安装mailx,通常来说系统都有预装
我们可以使用管线命令查询系统中是否有mailx
查看是否有mailx
假如没有就直接yum安装:
yum install -y mailx
之后我们来配置一下mailx:
vim /etc/mail.rc
在配置文件的最后加上这几行:
set from=xxxx@qq.com #这里是发送邮件的地址
set smtp=smtp.qq.com:587 #阿里云一定要带上这个端口号,其他云服务商不用
set smtp-auth-user= #这里是你的邮箱用户名
set smtp-auth-password= #这里填你刚刚保存的授权码
set smtp-auth=login #这一行不变
到这儿你已然完成了基础配置,你的服务器早已才能进行一些简单的短信发送功能了,我们可以使用mail命令测试一下:
echo ""|mail -v -s "测试" xxxxx@qq.com #-v是显示发送过程 -s是邮件主题
你会收到一封空白短信:
重点!!!
实现每晚获取最新的天气状况,我们须要调用和风天气的apilinux 目录里的文件自动发邮件,shell命令行对api返回数据的处理是一个难点,也是一个重点,首先我们要注册成为和风的开发者,并获取apikey;这儿我不做空的介绍,你们可以看其官方的开发文档,已然很详尽了;那边我直接演示在命令行的操作
我们首先可以看见他的免费版恳求格式:
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
城市填你想要获取的城市linux系统命令,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'
得到如下输出:
这时我们只须要输出第二行的数组,就可以过滤掉其他几行linux 目录里的文件自动发邮件,那边不多加赘言了,直接上终极处理命令:
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+xweather.sh`让它成为一个可执行文件
关于计划任务crontab这儿不多介绍,网上以及有好多博客对它有很详尽解释了这儿就提示一点:他的时间格式*****分别代表:分时日月周,先看一下`systemctlstatuscrond`服务有没有启动,启动以后:
我们直接`crontab-e`写下我们的时间即可:
他将在每晚的七点半执行这个脚本redhat linux 下载,于是我每晚七点半在手机上都会收到天气预报电邮
本文结束
**后期排错的话建议你们直接看crond的日志,路径是/var/mail/root**