利用Python自动监控网站并发送邮件告警的方法
admin
2023-08-01 14:11:57
0

前言

因为有一些网站需要每日检查是否有问题,所以需要一个报警监控的机制,这个需要你指定你发送的邮箱和你接收的邮箱,就可以做到对网站自动监控了。

这里用的是python3.5

需要安装的插件:

      1、smtplib:发邮件需要用到

      2、pycurl:访问网站时会需要用到

      3、linecache:在读取txt网站清单时需要用到

具体思路:

python程序从txt里面批量读取到网站的信息,通过Curl.py模拟浏览器去访问网站,并且把访问的结果写入到以自己的网站名称-日期.txt格式的文件中记录;有几种情况:

1、如果发现打不开了,直接发邮件提示网站已经打不开

2、发现可以打开,读取文件中上一次访问的情况(读取txt文件最后一行),

    1)如果发现上一次是打不开的,发邮件提醒网站已经恢复了

    2)如果发现上一次是打得开的(200的返回码),只是记录网站访问的日志就可以了

总共4个文件

Email.py是邮件类,主要用来发邮件的时候调用,这里需要按照你的情况改成你的邮箱(msg[\’From\’]),邮箱服务器地址(SMTP地址),和你的邮箱密码(SMTP.login)

Email.py

#!/usr/bin/python
#-*- coding:utf-8 -*-
import sys
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
class Email_send(object):
 def __init__(self,msgTo,data2,Subject):
  self.msgTo=msgTo
  self.data2=data2
  self.Subject=Subject
 def sendEmail(self):
  # (attachment,html) = content
  msg = MIMEMultipart()
  msg[\'Subject\'] = self.Subject
  msg[\'From\'] = \'xxxx@xxxx.com.cn\'
  msg[\'To\'] = self.msgTo
  html_att = MIMEText(self.data2, \'html\', \'utf-8\')
  #att = MIMEText(attachment, \'plain\', \'utf-8\')
  msg.attach(html_att)
  #msg.attach(att)
  try:
   smtp = smtplib.SMTP()
   smtp.connect(\'smtp.xxxx.com\', 25)
   smtp.login(msg[\'From\'], \'xxxx\') #改成自己的邮箱密码
   smtp.sendmail(msg[\'From\'], msg[\'To\'].split(\',\'), msg.as_string())
   return(\'邮件发送成功\')
  except Exception as e:
   print(\'--------------sss------\',e)
 def curl(self):
  import pycurl
  c=pycurl.Curl()
  #url=\"www.luoan.com.cn\"
  #indexfile=open(os.path.dirname(os.path.realpath(__file__))+\"/content.txt\",\"wb\")
  c.setopt(c.URL,url)
  c.setopt(c.VERBOSE,1)
  c.setopt(c.ENCODING,\"gzip\")
  #模拟火狐浏览器
  c.setopt(c.USERAGENT,\"Mozilla/5.0 (Windows NT 6.1; rv:35.0) Gecko/20100101 Firefox/35.0\")
  return c

Curl.py 主要用来执行模拟浏览器访问网站并返回结果的文件

#!/usr/bin/python
#-*- coding:utf-8 -*-
import sys
import pycurl
class Curl(object):
 def __init__(self,url):
  self.url=url
 def Curl_site(self):
  c=pycurl.Curl()
  #url=\"www.luoan.com.cn\"
  #indexfile=open(os.path.dirname(os.path.realpath(__file__))+\"/content.txt\",\"wb\")
  c.setopt(c.URL,self.url)
  c.setopt(c.VERBOSE,1)
  c.setopt(c.ENCODING,\"gzip\")
  #模拟火狐浏览器
  c.setopt(c.USERAGENT,\"Mozilla/5.0 (Windows NT 6.1; rv:35.0) Gecko/20100101 Firefox/35.0\")
  return c

site_moniter.py 这个文件为主程序,主要执行调用上面的函数,读取txt文件中的网站清单,如果网站打不开就发邮件出来告警

需要注意:

      1、把xxxx@xxxx.com改成你自己的邮箱,

      2、把文件路径改成自己的真实路径

#!/usr/bin/python
#-*- coding:utf-8 -*-
import pycurl
import os
import sys
import linecache
import time #引入事件类,用来获取系统当前时间
#from ceshi import Student
from Email import Email_send
from Curl import Curl

#bart = Student(\'mafei\',59)
#bart.print_score()

def script(urls,type):
 msgTo = \'xxxx@xxxx.com\'
 now_time=time.strftime(\"%Y-%m-%d %H:%M:%S\",time.localtime(time.time()))
 j=1
#  data2=[{\'aa\':\'aa\'}]
 for url_split in urls:
  #print(url_split)
  url_1=url_split.split(\'---\')
  url=url_1[1]
  recovery_title = \"监控通知----%s url:%s\" % (url_1[0], url) + \"在\" + time.strftime(\"%Y-%m-%d %H:%M:%S\",time.localtime(time.time())) + \"已经恢复\"
  down_title = \"监控通知----%s url:%s\" % (url_1[0], url) + \"在\" + time.strftime(\"%Y-%m-%d %H:%M:%S\",time.localtime(time.time())) + \"无法打开\"
  #print(\'~~~~~~~~~~~~~~~~~~~\')
  #print(url)
  #引用爬去网站的类,调用结果
  url_result = Curl(url)
  c = url_result.Curl_site()
  try:
   c.perform()
   code = str(c.getinfo(c.HTTP_CODE))
   print(code+\'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\')
  except Exception as e:
   print(\'--------错误信息:--------\',e)
   #indexfile.close()
   #c.close()
  code = str(c.getinfo(c.HTTP_CODE))
  # print(code+\'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\')
  filename = \'%s-%s.txt\' % (url_1[0], time.strftime(\"%Y-%m-%d\", time.localtime(time.time())))
  #判断如果在网站无法打开的情况下
  if code == \'0\' or code==\'400\' or code==\'500\' or code==\'404\':
   resolveTime = 0
   Connection_Time = 0
   Transfer_Total_Time = 0
   Total_Time = 0
   # print(\'为000000000000000000000000000000000000000000\')
   data3 = \'网站:%s无法打开%s\' % (url_1[0], url)
   # indexfile.close()
   # c.close()
   #判断网站如果挂了就发邮件
   stat3 = Email_send(msgTo, data3, down_title)
   resole=stat3.sendEmail()
   print(resole)
   print(data3 + \'邮件已经发送\')
  else:
   #resolveTime = str(c.getinfo(c.NAMELOOKUP_TIME) * 1000) + \" ms\"
   # Connection_Time=str(float(c.getinfo(c.CONNECT_TIME)*1000-c.getinfo(c.NAMELOOKUP_TIME)*1000))+\" ms\"
   #Connection_Time = str(c.getinfo(c.CONNECT_TIME) * 1000 - c.getinfo(c.NAMELOOKUP_TIME) * 1000) + \" ms\"
   # Connection_Time=round(float(Connection_Time))
   #Transfer_Total_Time = str(c.getinfo(c.TOTAL_TIME) * 1000 - c.getinfo(c.PRETRANSFER_TIME) * 1000) + \" ms\"
   #Total_Time = str(c.getinfo(c.TOTAL_TIME) * 1000) + \" ms\"
   # data2=data
   # data={\'url\':url,\'HTTP CODE\':code,\'resolveTime\':resolveTime,\'Connection_Time\':Connection_Time,\'Transfer_Total_Time\':Transfer_Total_Time,\'Total_Time\':Total_Time}
   print(\'网站可以正常打开\')
   #f = open(filename, \'a\',encoding=\'utf-8\')
   file_exit=os.path.exists(filename)
   #print(file_exit)
   #判断这个日志文件存不存在
   if(file_exit):
    #读取文件最后一行,为了读取出来最后一次的状态值
    file = open(filename, \'r\',encoding=\'utf-8\')
    linecount = len(file.readlines())
    data = linecache.getline(filename, linecount)
    file.close
    if data == \'\':
     print(\'这是\'+data+\'为空的数据\')
    else:
     print(\'其他信息%s\'%(data))
     explode = data.split(\'----\')
     #判断如果读取出来的值,最后一次是异常的情况就告警
     if explode[3]==\'0\\n\' or explode[3]==\'400\\n\' or explode[3]==\'500\' or explode[3]==\'404\':
      data3 = \'网站:%s在%s已经恢复%s\' % (url_1[0], now_time,url)
      stat3 = Email_send(msgTo, data3, recovery_title)
      resole = stat3.sendEmail()
      print(resole)
      print(data3 + \'邮件已经发送\')
     else:
      print(\'最后一次记录为其他值:%s\'%(explode[3])+\'-----\')
   else:
    print(\'文件不存在\')
  data2 = \'\\n\' + url_1[0] + \'----\' + url + \'-----\' + time.strftime(\"%H:%M:%S\", time.localtime(time.time())) + \'-------\' + code
  print(\'data2数据写入成功:\' + data2)
  file = open(filename, \'a\', encoding=\'utf-8\')
  file.write(data2)
  file.close
# bart = Student(data2,59)
# bart.print_score()

if __name__ == \"__main__\":
 type = \"监控通知-测试\" + time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime(time.time()))
 data1=[\'公司门户---www.luoan.com.cn\',\'公司平台---yun.luoan.com.cn\']
 #script(data1,type)


 #中心层面的网站清单
 file=open(\'D:\\python\\site_moniter\\zhongxin.txt\')
 data2=[]
 while 1:
  line2 =file.readline()
  print(line2)
  if not line2:
   break
  data2.append(line2[0:-1])
 #data2=[\'www.luoan.com.cn\',\'yun.luoan.com.cn\',\'www.qq.com\']
 print(data2)
 title=\"监控通知-中心\"+ time.strftime(\"%Y-%m-%d %H:%M:%S\",time.localtime(time.time()))
 script(data2,title)

总结

利用Python自动监控网站并发送邮件告警的方法到这就基本结束了,希望对大家的学习工作能有所帮助。

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...