批量測試鏈接地址是否正常訪問

 我的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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章