我的github地址https://github.com/nongxl/checkLinks
批量測試鏈接地址是否正常,發現網站不能訪問時自動發送郵件,同時運維很多個項目的時候這個腳本就很有用了。
如果需要檢測的系統都在局域網,就把代碼裏的百度測試地址改成局域網中一個穩定的、可以用作基準的地址。但是不能發郵件了。
windows下需要把日誌的路徑改爲絕對路徑。如"c:\\checklinks\\logs.log" 。
urls裏是需要運維的地址;
receivers裏可設置多個收件人郵箱;
發送郵箱我是用163,需要提前設置好smtp,並且建議開啓客戶端授權密碼;
註釋詳細,沒別的可說了。代碼結構寫得不太好,希望高手指教。
運行效果:
from urllib.request import urlopen
from urllib import request
import requests,re,chardet
from prettytable import PrettyTable
import yagmail
import datetime
receivers = ['[email protected]','[email protected]']
#鏈接郵箱服務器
yag = yagmail.SMTP( user="[email protected]", password="passw0rd", host='smtp.163.com')
logs = open('.\logs.log',encoding='utf-8',mode='a+')
urls = [
'https://mail.qq.com',
'https://www.12306.cn/',
'https://www.ithome.com',
'https://www.taobao.com',
'https://www.adobe.com',
'https://www.csdn.net',
'http://www.microsoft.com',
'https://github.com'
'https://www.google.com'
]
#通過正則匹配<title>標籤的內容判斷網頁標題
def get_title(html):
tar = '<title>.*?</title>'
tar = re.compile(tar, re.IGNORECASE)#不區分大小寫,否則不同編碼時<TITLE></TITLE>標籤爲大寫匹配不出來
target = re.findall(tar,html)
if target:
title = target[0]
#對獲取的title做進一步處理,取第七位之後和倒數第八位之前的內容作爲網頁標題
title = title[7:-8]
return title
'''
顏色顯示的格式:
\ 033 [顯示方式;字體色;背景色m ...... [\ 033 [0m]
顯示顏色的參數:
顯示方式 效果 字體色 背景色 顏色描述
0 終端默認設置 30 40 黑色
1 高亮顯示 31 41 紅色
4 使用下劃線 32 42 綠色
5 閃爍 33 43 黃色
7 反白顯示 34 44 藍色
8 不可見 35 45 紫紅色
36 46 青藍色
37 47 白色
'''
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
headers = { 'User-Agent':user_agent }
table = PrettyTable(['編號','系統名稱','系統地址','網絡狀態','耗時(秒)','檢查結果'])
timelap = 0
code = 0
isSandMail = 0
try:
netCheck = urlopen('http://www.baidu.com').getcode()#訪問百度測試網絡連接
print(str(datetime.datetime.now())+"\033[1;32;m 網絡連接正常,開始檢查... \033[0m")
for url in urls:
try:
req = request.Request(url, None, headers)
resp = request.urlopen(req)
#獲取狀態碼
code = resp.getcode()
#獲取響應時間
timelap = requests.get(url).elapsed.total_seconds()
html = resp.read()
#識別網頁編碼方式
charset = chardet.detect(html)
#按網頁的編碼方式解碼,否則會亂碼報錯
html = str(html,charset['encoding'])
title = get_title(html)
#將檢查結果添加到表格中
table.add_row([urls.index(url)+1,title,url,code,timelap,"\033[0;32;m 連接成功 \033[0m"])
except Exception as e:
#將異常也添加到表格中
err = str(e)
table.add_row([urls.index(url) + 1, "null", url, err, timelap, "\033[0;31;m 連接錯誤 \033[0m"])
isSandMail = 1
except Exception as e:
#如果不能訪問百度,判斷爲網絡錯誤
print(str(datetime.datetime.now())+"\033[1;31;m 網絡檢查錯誤,不能訪問外網。請先檢查本機網絡 \033[0m\n",e)
logs.write(str(datetime.datetime.now())+'\t'+'網絡錯誤'+'\n')
print(table)
logs.write(str(datetime.datetime.now())+'\t'+'檢查完成'+'\n')
if isSandMail == 1:
#發送郵件
try:
yag.send(receivers,'運維郵件:網站無法訪問。請儘快處理',str(table))
logs.write(str(datetime.datetime.now())+'\t'+'運維郵件發送成功'+'\n')
except Exception as sendErr:
print('郵件發送失敗'+str(sendErr))
logs.write(str(datetime.datetime.now())+'\t'+'郵件發送失敗'+str(sendErr)+'\n'+str(table)+'\n')
logs.close()