利用Python自動(dòng)監(jiān)控網(wǎng)站并發(fā)送郵件告警的方法
前言
因?yàn)橛幸恍┚W(wǎng)站需要每日檢查是否有問題,所以需要一個(gè)報(bào)警監(jiān)控的機(jī)制,這個(gè)需要你指定你發(fā)送的郵箱和你接收的郵箱,就可以做到對(duì)網(wǎng)站自動(dòng)監(jiān)控了。
這里用的是python3.5
需要安裝的插件:
1、smtplib:發(fā)郵件需要用到
2、pycurl:訪問網(wǎng)站時(shí)會(huì)需要用到
3、linecache:在讀取txt網(wǎng)站清單時(shí)需要用到
具體思路:
python程序從txt里面批量讀取到網(wǎng)站的信息,通過Curl.py模擬瀏覽器去訪問網(wǎng)站,并且把訪問的結(jié)果寫入到以自己的網(wǎng)站名稱-日期.txt格式的文件中記錄;有幾種情況:
1、如果發(fā)現(xiàn)打不開了,直接發(fā)郵件提示網(wǎng)站已經(jīng)打不開
2、發(fā)現(xiàn)可以打開,讀取文件中上一次訪問的情況(讀取txt文件最后一行),
1)如果發(fā)現(xiàn)上一次是打不開的,發(fā)郵件提醒網(wǎng)站已經(jīng)恢復(fù)了
2)如果發(fā)現(xiàn)上一次是打得開的(200的返回碼),只是記錄網(wǎng)站訪問的日志就可以了
總共4個(gè)文件
Email.py是郵件類,主要用來發(fā)郵件的時(shí)候調(diào)用,這里需要按照你的情況改成你的郵箱(msg['From']),郵箱服務(wù)器地址(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('郵件發(fā)送成功') 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 主要用來執(zhí)行模擬瀏覽器訪問網(wǎng)站并返回結(jié)果的文件
#!/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 這個(gè)文件為主程序,主要執(zhí)行調(diào)用上面的函數(shù),讀取txt文件中的網(wǎng)站清單,如果網(wǎng)站打不開就發(fā)郵件出來告警
需要注意:
1、把xxxx@xxxx.com改成你自己的郵箱,
2、把文件路徑改成自己的真實(shí)路徑
#!/usr/bin/python #-*- coding:utf-8 -*- import pycurl import os import sys import linecache import time #引入事件類,用來獲取系統(tǒng)當(dāng)前時(shí)間 #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 = "監(jiān)控通知----%s url:%s" % (url_1[0], url) + "在" + time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())) + "已經(jīng)恢復(fù)" down_title = "監(jiān)控通知----%s url:%s" % (url_1[0], url) + "在" + time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())) + "無法打開" #print('~~~~~~~~~~~~~~~~~~~') #print(url) #引用爬去網(wǎng)站的類,調(diào)用結(jié)果 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('--------錯(cuò)誤信息:--------',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()))) #判斷如果在網(wǎng)站無法打開的情況下 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 = '網(wǎng)站:%s無法打開%s' % (url_1[0], url) # indexfile.close() # c.close() #判斷網(wǎng)站如果掛了就發(fā)郵件 stat3 = Email_send(msgTo, data3, down_title) resole=stat3.sendEmail() print(resole) print(data3 + '郵件已經(jīng)發(fā)送') 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('網(wǎng)站可以正常打開') #f = open(filename, 'a',encoding='utf-8') file_exit=os.path.exists(filename) #print(file_exit) #判斷這個(gè)日志文件存不存在 if(file_exit): #讀取文件最后一行,為了讀取出來最后一次的狀態(tài)值 file = open(filename, 'r',encoding='utf-8') linecount = len(file.readlines()) data = linecache.getline(filename, linecount) file.close if data == '': print('這是'+data+'為空的數(shù)據(jù)') 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 = '網(wǎng)站:%s在%s已經(jīng)恢復(fù)%s' % (url_1[0], now_time,url) stat3 = Email_send(msgTo, data3, recovery_title) resole = stat3.sendEmail() print(resole) print(data3 + '郵件已經(jīng)發(fā)送') 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數(shù)據(jù)寫入成功:' + data2) file = open(filename, 'a', encoding='utf-8') file.write(data2) file.close # bart = Student(data2,59) # bart.print_score() if __name__ == "__main__": type = "監(jiān)控通知-測(cè)試" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) data1=['公司門戶---www.luoan.com.cn','公司平臺(tái)---yun.luoan.com.cn'] #script(data1,type) #中心層面的網(wǎng)站清單 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="監(jiān)控通知-中心"+ time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())) script(data2,title)
總結(jié)
利用Python自動(dòng)監(jiān)控網(wǎng)站并發(fā)送郵件告警的方法到這就基本結(jié)束了,希望對(duì)大家的學(xué)習(xí)工作能有所幫助。
相關(guān)文章
解決import tensorflow as tf 出錯(cuò)的原因
這篇文章主要介紹了解決import tensorflow as tf 出錯(cuò)的原因,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04python 基本數(shù)據(jù)類型占用內(nèi)存空間大小的實(shí)例
今天小編就為大家分享一篇python 基本數(shù)據(jù)類型占用內(nèi)存空間大小的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06python 函數(shù)中的內(nèi)置函數(shù)及用法詳解
這篇文章主要介紹了python 函數(shù)中的內(nèi)置函數(shù) 及用法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07python?pip安裝的包目錄(site-packages目錄的位置)
這篇文章主要介紹了python?pip安裝的包放在哪里(site-packages目錄的位置),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Python astype(np.float)函數(shù)使用方法解析
這篇文章主要介紹了Python astype(np.float)函數(shù)使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06簡單實(shí)現(xiàn)Python爬取網(wǎng)絡(luò)圖片
這篇文章主要教大家如何簡單實(shí)現(xiàn)Python爬取網(wǎng)絡(luò)圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Python數(shù)據(jù)結(jié)構(gòu)棧實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換簡單示例
眾所周知計(jì)算機(jī)的內(nèi)存都是以二進(jìn)制的形式進(jìn)行數(shù)據(jù)存儲(chǔ),下面這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)結(jié)構(gòu)棧實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02