楊平生
(西安建筑科技大學 圖書館,陜西 西安 710055)
隨著圖書館線上業務的發展,各種電子期刊、電子圖書、學位論文等數字化資源實行7×24h不間斷服務;書目檢索、入館預約、座位預約、研討空間預約等都要在線進行,因此保證圖書館的在線應用系統和網絡設備能夠正常運行成了一項重要任務。系統管理人員需要隨時知道應用系統和關鍵網絡設備的當前運行狀態,尤其在非工作時間,發生故障時才能及時得到預警,并排除故障,因此有一個針對圖書館使用的、便捷的、輕量級的檢測功能模塊就顯得非常有必要。
企業微信是騰訊公司打造的面向企業市場的通訊與移動辦公工具,主要功能有企業通訊錄、視頻會議、考勤打卡、審批模板、企業支付、微文檔、微盤等;企業微信具有開放的生態,開放了13類390個接口(API),包括通訊錄管理、身份驗證、消息推送、OA數據接口、電子發票、移動端SDK等接口。
筆者正是利用企業微信開放的接口實現了針對圖書館應用系統和網絡設備的檢測功能,只要在手機上登錄企業微信,就能隨時接收到檢測程序發送來的檢測結果,實時掌握系統和設備的運行狀況。西安建筑科技大學圖書館自從2018年4月開始使用該檢測功能至今,一直運行良好,尤其在假期和疫情期間,為及時掌握應用系統和設備信息發揮了一定的作用。
利用企業微信發送消息來實現運維監控與告警的研究有周昊實現的將Zabbix和企業微信運用于公安監控網絡[1];韋筱泉等實現的后臺程序向企業微信發送消息[2];李琦實現的以OEMCC與企業微信結合的數據庫集中監管[3];李正等實現的基于企業微信的網絡故障告警系統[4];劉淑影等實現的基于企業微信的機房報警系統[5];崔超實現的基于企業微信推送信息[6]。
筆者采用的方法是將檢測程序部署在服務器上,負責定時檢測圖書館主頁、書目檢索系統、重要數據庫等各項應用系統和UPS、匯聚交換機、監控錄像機、門禁服務器等設備,然后將檢測信息通過企業微信的開放接口傳送至手機端企業微信App,實現的效果如圖1。如果有智能機房管理系統,還可以采用中間庫的方式來采集狀態數據。
文中應用的檢測腳本采用Python2.7編寫,調用的第三方庫包括:requests、json、subprocess、re、BeautifulSoup。

圖1 企業微信檢測結果
注冊企業微信獲取corpid用于識別企業;創建應用獲取AgentId參數用于識別應用;獲取Secret密鑰用于請求驗證身份的Token。所有接口使用HTTPS協議,通過GET或POST方法請求。可以指定消息允許接受的成員ID列表和部門ID列表、標簽ID列表,消息文本最長不超過2 048字節。主要代碼如下:
defToken(self):
url =′https://qyapi.weixin.qq.com/cgi-bin/gettoken′
params = {′corpid′:′ww*****1c2′,′corpsecret′:r′doZJgPM*****bt84′}
r = requests.get(url=url,params=params)
token=json.loads(r.text)[′access_token′]
return token
defsend_message(self):
data={"touser":"@all","toparty":" PartyID1 | PartyID2 ","totag":" TagID1 | TagID2 ",
"msgtype":"text","agentid":′*******′,"text":{ "content":"%s" %(self.text) },"safe":0}
value = json.dumps(data,ensure_ascii=False)
token = self.Token()
url =′https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s′%(token)
r = requests.post(url,data=value)
returnr.text
HTTP狀態碼(HTTP Status Code)指服務器返回的對超文本傳輸協議的響應,是一個包含數字代碼的信息頭,它是由RFC 2616所規范定義的。狀態碼能夠反映服務器的消息、成功、重定向、請求錯誤、服務器錯誤的詳細狀況。狀態碼200即為OK狀態碼,表示請求成功,請求的響應頭或數據體將得到返回,所以如果識別出200 狀態碼,就表示服務器處于正常狀態。筆者使用requests庫,獲取圖書館應用系統網頁的狀態碼,根據狀態碼的狀況返回信息,判斷應用是否處于正常狀態,然后將判斷加入消息列表。主要代碼如下:
defcheck_url(url,name):
response = requests.get(url)
ifresponse.status_code == 200:
msg.append(name +′:網頁正常′)
else:
msg.append(name + ′:網頁異常′)
網絡爬蟲是指能夠按一定的規則抓取網絡信息的一段程序。UPS運行狀態的信息存在于本地UPS的Web頁面中,而這個頁面是需要登錄才能打開的,所以需要網絡爬蟲模擬正常瀏覽器登錄來獲取信息。筆者通過requests的POST方法登錄UPS的Web頁面,使用BeautifulSoup解析文檔,提取其中表示UPS當前報警狀態的數據,轉碼后發送至推送信息列表。主要代碼如下:
defapc(host,referer,url,name):
headers = {′Accept′:′text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8′,′Accept-Encoding′:′gzip,deflate′,′Host′:host,′Referer′:referer,
′User-Agent′:′Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/67.0.3396.99 Safari/537.36′}
form_data = {′login_username′:′***′,′login_password′:′***′,′submit′:′Log On′,}
response = requests.post(url = url,headers = headers,data = form_data)
out = response.content
soup = BS(out,′html.parser′,from_encoding = ′utf-8′)
alarms = soup.find(′td′,width="23%")
tit = alarms.a.attrs[′title′]
titl = repr(tit.decode(′utf-8′).encode(′utf8′))
msg.append(name + ′:′ + titl)
Python通過subprocess庫產生子進程,stdin、stdout和stderr分別表示子程序的標準輸入、標準輸出和標準錯誤。筆者調用subprocess庫中的Popen類,通過“ping”命令來測試圖書館關鍵網絡設備的連通性,返回值進行判斷后將“網絡連接超時”“無法訪問目標主機”“網絡正常”加入消息列表,用以及時反饋設備狀態。主要代碼如下:
defping_ip(ip,name):
p = subprocess.Popen(["ping.exe",ip],
stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
shell = True)
out = p.stdout.read()
ifout.find(′timed out′) != -1:
msg.append (name + ′:網絡連接超時′)
elifout.find(′Destination′) != -1:
msg.append (name + ′:無法訪問目標主機′)
else:
msg.append (name +′:網絡正常′)
通過企業微信及時獲取有關圖書館應用系統和關鍵網絡設備的信息,能夠及時發現問題并解決問題,為圖書館數字資源不間斷開放提供了保障。通過西安建筑科技大學圖書館幾年來的使用顯示,該應用模塊簡單易用,監控范圍可以自己調整,發送信息及時,同時也是一個免費的應用。以后還應當完善功能,拓展監控范圍,充實所反映的信息細節。