楊恩波,張 祝,付瑞瀅,鄒海東
(1.貴州省銅仁市氣象局,貴州 銅仁 554300;2.貴州省銅仁市氣象防災減災中心,貴州 銅仁 554300;3.貴州省松桃苗族自治縣氣象局,貴州 松桃 554100)
近年來新媒體技術的應用有效提高了政府部門間協作效率,同時在擴大公共氣象服務覆蓋面上發揮了重要作用。以微信為例,省、市、縣三級氣象部門通過加入其他職能部門工作交流群,可及時將服務信息發送到相關部門,對常規服務手段形成了有利補充[1];通過關注微信公眾號,公眾亦可及時有效地獲取氣象部門的權威預報及服務信息。貴州省氣象服務中心在2019年投入運行的微信機器人已實現將預警信號靶向發布至受影響地區的目標群,而常規預報、決策氣象服務材料等內容的發送仍依賴于各級氣象部門值班服務人員手動操作,面對服務對象較多的現狀,這一做法費時費力,且存在漏發的可能,如何提高服務效率是急需解決的問題。
目前針對微信公眾號的信息推送技術擁有微信官方的技術支持,但針對普通微信號的自動化技術受限制較多。有開發者利用網頁版微信開放協議[2]開發了相關微信自動化工具,但該方法不具備普適性,部分微信賬號特別是新申請的賬號無法使用網頁版微信開放協議;部分開發者使用其他相關通信協議實現了微信自動化功能,但使用方法未開源,且未獲得官方認可,存在一定違規風險。
本文介紹基于UI Automation技術[3-4](以下簡稱UIA)的桌面版微信軟件自動化的應用,實現對桌面版微信程序的控制,從而達到自動轉發文字類、文件類(含圖片)等信息的目的,減輕服務人員的工作壓力并提升工作效率,同時以12379網站為例介紹預警信息的獲取及入庫等關鍵步驟執行過程,以FTP方式為例介紹文件類信息的獲取及入庫過程。
本文所介紹的關鍵技術為通過UIA實現對桌面版微信程序的控制,從而達到使其自動執行指定操作的目的。UIA是由微軟公司開發的界面自動化測試框架,為技術人員提供通過編程控制Windows操作系統絕大多數程序界面元素的方法,從而實現模擬相關操作。該框架主要用于桌面程序編寫階段對界面穩定性進行測試,支持Win32應用程序、.NET Windows窗體應用程序和WPF應用程序。
為減小開發難度,利用Python語言開發,UIA采用封裝后的UI Automation模塊[3],界面使用PyQt5構建,使用SQLite輕型數據庫實現任務記錄及日志記錄等功能,數據庫讀寫使用Python自帶的sqlite3庫。使用Request庫實現12379網站預警信息獲取[5],使用FTPlib模塊實現文件類信息的獲取[6];消息發送過程中為提高執行速度借助Pyperclip模塊實現對剪貼板的控制[7]。
如圖1所示,應用的主要運行流程為主進程依據時鐘定時連接SQLite數據庫,檢索是否存在待發消息,如果有則依據消息類型分別通過UIA操控桌面版微信執行不同的信息發送操作,并及時在數據庫中將發送完的消息標記為已執行。SQLite數據庫中的消息記錄由信息采集/入庫程序負責,該功能可集成于主程序中,通過多線程的方式開啟,也可使用獨立程序執行。

圖1 應用運行流程Fig.1 The logic diagram of the app
桌面版微信界面中涉及自動控制的元素主要包含5個:主界面、搜索框、消息輸入框、打開文件按鈕、發送按鈕。使用UI Automation對桌面版微信軟件進行解析,經梳理后關鍵元素相關數據如表1所示。獲得相關元素數據后可通過指定程序根據控件的深度及控件名稱來查找控件的位置,并進行操作。

表1 微信軟件關鍵元素解析表Tab.1 The Analyzing result of WeChat's key elements
若要完成查找“銅仁氣象微信工作群”,并進入消息編輯界面,方法如下:
import uiautomation as auto
wechatWindow=auto.WindowControl(searchDepth=1,ClassName=′WeChatMainWndForPC′)
TargetName=‘銅仁氣象微信工作群’
wechatWindow.SendKeys(′{Ctrl}f′, waitTime=1.0)
search.SendKeys(TargetName, waitTime=1.0)
choice=wechatWindow.TextControl(searchDepth=12, Name=′′)
if choice.Exists(maxSearchSeconds=3):
choice.Click(simulateMove=False)
return True
else:
wechatWindow.SendKeys(′{Esc}′)
return False
若要在消息輸入框中輸入“天氣預報”4個字并發送,方法如下:
import uiautomation as auto
wechatWindow=auto.WindowControl(searchDepth=1,ClassName=′WeChatMainWndForPC′)
msg=“天氣預報”
edit=wechatWindow.TextControl(searchDepth=4) # 查找消息輸入框
edit.SendKeys(msg)
edit.SendKeys(′{Enter}′)
若要打開指定位置的雨量圖并發送,方法如下:
import uiautomation as auto
wechatWindow=auto.WindowControl(searchDepth=1,ClassName=′WeChatMainWndForPC′)
file_path=′D: ain.png′
sendfilebtn=wechatWindow.ButtonControl(searchDepth=14, Name=′發送文件′)
filepathinput=wechatWindow.EditControl(searchDepth=4, Name=′文件名(N):′)
fileopenbtn=wechatWindow.SplitButtonControl(Name=′打開(O)′)
sendfilebtn.Click(simulateMove=False)
filepathinput.SendKeys(′%s′ %file_path)
fileopenbtn.Click(simulateMove=False, waitTime=1.0)
edit.SendKeys(′{Enter}′)
在實際操作過程中可通過Pyperclip模塊將消息內容存儲在剪貼板中,同時利用發送快捷鍵(Ctrl+C/V)的方式提升執行速度及效率。
數據庫包含2張表,表名分別為Schedule(用于存儲消息記錄)和Log(用于存儲日志),表結構如表2、表3所示:

表2 Schedule表結構Tab.2 The structure of Schedule Table

表3 Log表結構Tab.3 The structure of Log Table
目前,各級氣象臺在國家突發事件預警信息發布系統中發布預警信號后,信息將逐級匯總到國家級服務器,同時在12379網站(www.12379.cn)上呈現,通過解析12379網站的alarm_list_all.html文件,將數據返回為json格式,然后逐一檢索每一條預警信號,判斷是否有指定地點氣象臺新發布的預警信號,方法如下:
alarmsite=′http://www.12379.cn/data/alarm_list_all.html′
alarmzone=‘銅仁市氣象臺’
def readalarm():
alarm=msgpara()[′alarmmsg′]
alarmjson=requests.get(alarmsite)
alarmjson.encoding=′utf-8′
alarmjson=json.loads(alarmjson.text)[′alertData′] # 舊的預警信號
i=0
while i if alarmzone in alarmjson[i][′description′]: alarm=(alarmjson[i][′description′]) break else: alarm=msgpara()[′alarmmsg′] i=i+1 return alarm 取得需要入庫的預警信號文本內容后將其寫入SQLite數據庫Schedule表中即可,寫入時需指定好需要發布的對象,即表2中target字段。 在應用開發過程中,曾嘗試局域網共享及FTP服務器等2種方式獲取文件類消息,二者均可實現設計目標。綜合考慮網絡安全及銅仁市氣象臺業務環境等因素后,采取了FTP服務器作為唯一途徑。具體做法為: ①預報員將需要發布的文檔或圖片上傳到FTP服務器指定目錄; ②信息采集程序(主要使用FTPlib模塊)定時掃描FTP服務器中指定目錄,如果發現其中有文件,則將文件下載至本地,將本地路徑(對應表2中content字段)等信息寫入SQLite數據庫Schedule表中,同時刪除FTP服務器中的文件。 ③主程序監測到文件類待發消息并執行完發送流程后,將本地文件刪除。 基于本文所介紹方法開發的微信機器人軟件已在銅仁市氣象局正式投入運行。最新版本在完善文件類消息發送功能后于2021年4月下旬開始運行。截止目前共計向30余個黨政工作交流群及公眾氣象服務群轉發各類信息505條。其中文本類消息(含預警信號和1060121短信)209條,文檔類消息160條(主要是決策氣象服務材料),圖片類消息136條,在歷次重大天氣過程中第一時間為政府相關部門應對重大天氣過程提供了服務信息,同時為部分公眾提供日常氣象預報作為出行的參考。 本文介紹了基于UI Automation技術的桌面版微信自動化方法,為解決相關自動化需求提供了新的開發思路。該方法可解決因微信賬號權限無法使用網頁版微信開放協議的難題,同時避免使用第三方微信自動化閉源協議,安全性較高。需要注意的是該方法無法實現消息發送的并發,即需要向目標群或好友逐一發送。盡管執行效率低于基于網頁版API的相關工具,但相較于人工發送的方式已經有了很大提高,避免了漏發、誤發等問題,同時對微信賬號安全無影響。此外,該方法也可用于對值班人員的告警提醒,如在達到特定告警條件時,向值班人員撥打微信語音電話。2.5 FTP方式獲取文件類消息
3 應用成效
4 結束語