python练习——监控网站的nginx健康检查接口状态,确定其联通性及可用性,并通过163邮箱报警
程序员文章站
2022-03-22 16:45:45
...
工作中需要对一个网站的连通性进行监控,为此,我和专业的开发沟通了下,准备直接监控他的nginx健康检查接口,通过访问健康检查接口的页面,抓取状态,用判断是否正常,如果联不通,那就抓不到数据,发邮件报警,如果联通了,但是状态有异常,也会发邮件报警。
再这里,健康检查的接口大概是下面这张图的样子:
所以就是对里面的status这个字段检测,看他是不是up的状态,如果是就ok,不是就出故障了。
其代码实现大概是这个样子的
import requests
#lxml和etree主要是用来抓页面数据用的,也是从网上拼凑,感觉还是蛮好用的,抓表格挺方便,但很多功能还是瞎猫碰死耗子,还需要学习
from lxml import etree
#这个datetime主要是用于显示系统时间用的,再最后吗有用
from datetime import datetime
import time
#这三个是需要用来发邮件的,调用163邮箱
import smtplib
from email.mime.text import MIMEText
from email.header import Header
#欢迎界面
print('欢迎使用"xxxxxxx"状态监控程序,不断优化开发中,技术支持:xxxxxxx')
print('请输入检测https://xx.xx.xx/status页面的时间间隔')
s=input('请输入(单位:秒)')
email=input('请输入邮箱地址:仅限163邮箱')
username=input('请输入邮箱用户名:')
password=input('请输入邮箱密码')
#将健康检查的接口设定个标准值,将其存到list‘infostatus’
info_status = ['192.168.4.103:8090 up','192.168.4.104:8090 up', '192.168.4.103:8091 up', '192.168.4.104:8091 up']
error = 'No Error'
#设定info_check函数,,这个函数的功能就是利用lxml库的etree类来抓取健康检查接口里的表格
def info_check(url):
response = requests.get(url)
html = etree.HTML(response.content.decode('utf-8'))
table = html.xpath("//table//tr[position()>1]")
dep = []
for i in table: # 遍历tr列表
name = ''.join(i.xpath(".//td[3]//text()")) # 获取当前tr标签下的第一个td标签,并用text()方法获取文本内容,赋值给p
status = ''.join(i.xpath(".//td[4]//text()"))
ipstatus = name+' '+status
dep.append(ipstatus)
if dep == info_status:
print('ok')
else:
print('no')
global error
error ='Error Detected'
print(error)
'''
def timercheck(n):
while True:
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
info_check('https://xx.xx.xx/status')
# if error != 'No Error':
# email('no')
time.sleep(n)
timercheck(s)
'''
# 每n秒执行一次
#这块也是从网上抄的实际上,我不会配置,实际上只能用163的邮箱,其他邮箱的话收不到。不过自己用,也无所谓了
while True:
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
info_check('https://xx.xx.xx/status')
if error != 'No Error':
# 第三方 SMTP 服务
mail_host="smtp.163.com" #设置服务器
mail_user=username #用户名
mail_pass=password #口令
sender = email
receivers = [email] # 接收邮件,可设置为你的QQ邮箱或者其他邮
message = MIMEText('发现访问异常', 'plain', 'utf-8')
message['From'] = Header("info", 'utf-8')
message['To'] = Header("info", 'utf-8')
subject = '服务器监控'
message['Subject'] = Header(subject, 'utf-8')
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print('邮件已发送至aaa@qq.com')
time.sleep(int(s))
这个程序,用pyinstaller打包的,直接再cmd中,跑到这个程序的.py文件保存的目录,再cmd中运行下面这句代码就可以了。
pyinstaller -F xxx.py
这个程序执行的样子:
但不得不说,门外汉就是门外汉,这个程序再我的服务器上总是自动关闭,已经再windows定时任务管理器中添加了好几个,但是还是经常被系统关掉,不知道为什么,耽误工作啊