1. 引言
随着智能手机和移动网络的发展,微信作为智能手机热潮下推出的免费即时通信工具,目前已经成为我国装机量及活跃用户最多的通讯软件 [1],截至2019年Q3,微信月活跃账户数11.51亿。微信(WeChat)支持跨通信运营商、跨操作系统平台通过网络快速发送免费(需消耗少量网络流量)语音短信、视频、图片和文字 [2]。微信强大的功能和便捷性,使其广泛应用于各类场景。贵州属于我国气象灾害多发地区之一,各级政府部门都建立了微信群用于组织防汛抗旱救灾工作。气象部门利用微信这一应用来开展气象信息服务已经成为新时代不可避免的趋势潮流 [3]。
微信机器人是通过将微信个人号托管于计算机程序,实现计算机系统与微信用户之间数据交互的技术,应用的场景主要有企业客服智能应答、政务服务自助问询、预警信息自动传播等。其实现原理有三种:1、微信机器人接口;2、微信机器人协议;3、HOOK代码机器人(侵入式)。本文主要是通过微信机器人接口方式设计一个运行于气象内网和互联网互通环境下的气象微信机器人。用户可通过微信实时获取气象内网数据,同时气象微信机器人也可智能化地向指定用户推送气象数据。提供了一个在互联网移动端获取气象内网数据和监控数据的解决方案。
2. 系统结构设计与组成
本文设计的气象微信机器人运行于气象内网和互联网互通的网络环境中,主要实现两大功能:一是通过定时监控程序对气象内网中的气象自动站设备运行情况和气象自动站采集的雨量数据(主要针对暴雨天气)进行监控,并将报警消息通过微信推送给指定的用户或者微信群组;二是微信用户与微信机器人的交互式消息获取,微信机器人接收到用户发送的消息命令后,立即进行响应,在数据库中查找对应的气象数据,并将数据发送给发送消息命令的用户。
2.1. 系统网络拓扑结构
运行微信机器人的服务器必须同时能访问气象内网和互联网,为保障网络安全性,服务器到内网和互联网之间均配置防火墙(如图1所示)。通过气象内网,对气象数据进行访问和监控,通过互联网将微信个人号登录到WEB微信,并让系统托管,实现消息的自动监听和发送。
2.2. 系统模块设计
系统采用了多线程运行方式,将智能监控功能和人机交互功能分为了三个主要功能模块:1) 雨情自动监控报警模块;2) 自动站运行自动监控报警模块;3) 人机交互气象数据获取模块。如图2所示。
![](//html.hanspub.org/file/5-2610307x8_hanspub.png?20220815094934505)
Figure 1. Network topology of meteorological WeChat robot system
图1. 气象微信机器人系统网络拓扑图
![](//html.hanspub.org/file/5-2610307x9_hanspub.png?20220815094934505)
Figure 2. Module composition diagram of meteorological WeChat robot system
图2. 气象微信机器人系统模块组成图
2.2.1. 雨情自动监控报警模块
雨情自动监控报警模块,会在全省气象自动站数据报文进入CIMISS数据库后,开始执行(一般入库时间为正点后6~7分钟,这里为了保障数据准确,预设时间为正点后8分钟)。该线程启动后,会采用REST方法读取CIMISS数据库1、3、6小时累积雨量数据,返回数据格式为JSON。通过对JSON文件解析,当监测到有站点累积雨量超过预设的阈值(阈值标准:1小时降水达30毫米,3小时降水达50毫米,6小时降水达100毫米),立即自动生成雨量报警信息,然后调用itchat库中消息发送接口,发送给指定的微信群或微信好友,提醒业务人员及时开展监测预警。效果如图3所示。
2.2.2. 自动站运行自动监控报警模块
自动站运行自动监控报警模块与雨情自动监控报警模块原理基本一致,数据来源于《贵州省综合气象观测和信息网络管理系统》后台数据库。在每小时预设时间访问数据库,获取该小时内,自动站报文到报状态,当出现不正常状态时,自动生成一条故障报警消息发送给指定的微信群或者微信好友。可支持同时监控多个地区,并将该地区的报警信息分别发送给不同的微信群或微信好友。效果如图4所示,微信机器人正点后20分钟会启动监控程序,当有站点出现未到报、缺报、逾限等情况时,将报警信息发送到指定的微信群。
2.2.3. 人机交互气象数据获取模块
人机交互气象数据获取模块主使用了itchat的消息监听功能。当监听到已注册的消息类型时,程序会对消息进行匹配,并调用对应的函数,将运行结果返回给消息发送者。目前已开发了,自动站到报时间查询,市州或县辖区内雨情信息自动生成,自动站单点实况信息查询,实时雷达、云图查询等几项功能。
![](//html.hanspub.org/file/5-2610307x10_hanspub.png?20220815094934505)
Figure 3. WeChat robot rainfall over threshold alarm
图3. 微信机器人雨量超阈值报警
![](//html.hanspub.org/file/5-2610307x11_hanspub.png?20220815094934505)
Figure 4. WeChat robot automatic station operation monitoring
图4. 微信机器人自动站运行监控
![](//html.hanspub.org/file/5-2610307x12_hanspub.png?20220815094934505)
Figure 5. Regional automatic station message query
图5. 区域自动站报文查询
![](//html.hanspub.org/file/5-2610307x13_hanspub.png?20220815094934505)
Figure 6. Live inquiry of regional automatic station
图6. 区域自动站实况查询
![](//html.hanspub.org/file/5-2610307x15_hanspub.png?20220815094934505)
Figure 8. Acquisition of radar and cloud image data
图8. 雷达和云图资料获取
通常气象自动站维修人员在完成区域自动站维修后,无法知道该站点是否已经恢复正常,而通过向微信机器人发送“站号,报文”或者“站号,实况”,查询自动站报文到报时间或者实况,就可以确定该站点通讯状态是否正常,采集数据是否正常。如图5、图6所示。
业务人员发送“地名,雨情”即可快速获取当日辖区内各站点累积降雨情况,发送“雷达”和“云图”即可获取最新雷达和卫星云图资料。如图7,图8所示。
2.3. 系统流程设计
系统启动后通过扫码登录WEB微信,并同时运行两个计时监控进程和一个消息监听进程。两个计时进程按照设定时间在数据库中查询气象自动站运行情况和累积小时雨量,当达到报警触发条件时,调用itchat消息发送接口,向指定微信群或好友发送报警消息。消息监听进程对微信好友发送的消息和微信群内被@的消息进行监听,并进行命令匹配调用数据查询处理函数,并将按预设格式生成的消息查询结果反馈给消息命令发送者,以实现人机交互。系统流程如图9所示。
3. 气象微信机器人开发
3.1. 系统开发及运行环境
硬件环境:可同时访问气象业务内网和互联网的服务器或工作站一台;
软件环境:Python3.6 + Windows2008r2 + Pycharm2017。
![](//html.hanspub.org/file/5-2610307x16_hanspub.png?20220815094934505)
Figure 9. WeChat robot system flow chart
图9. 微信机器人系统流程图
3.2. 数据来源
1) 贵州省综合气象观测和信息网络管理系统后台数据库,采用SQL方式连接。用于获取自动站到报信息;
2) 贵州省气象局区域自动站中心站接收数据库,采用SQL方式连接,用于获取自动站报文到报时间;
3) CIMISS数据库,采用REST方式获取数据,用于获取实时气象数据;
4) 气象网站,采用爬虫方式获取雷达图和云图。
3.3. 主要使用类库
Python是一款功能强大,集开放性、扩展性和简易性于一体的语言 [4],具有丰富、强大的类库,能极大简化开发过程。本系统的开发引用了Python的微信个人号接口类库、HTML解析器类库、数据解析类库、数据库访问类库。
3.3.1. Ithat
Python的itchat库是一个开源的微信个人号接口 [5],功能十分强大,我们可以扫码登录WEB微信,然后通过它提供的一些接口,实现监听是否接收到好友发送信息,或者群内是否有人@自己发送信息,并给予响应,同时也可以将想要发送的信息,发送给指定的微信群或者用户。
3.3.2. BeautifulSoup和Requests
BeautifulSoup是用Python编程语言编写的HTML解析器,可以用来从网页中提取内容,BeautifulSoup不能单独用作网络爬虫 [6]。Requests是Python的第三方库,是一个可用于实现爬虫功能的简单易用的HTTP库。在本程序开发中主要用于获取WEB页面源码,配合BeautifulSoup库对HTML标签进行解析,实现爬取网页上的雷达图和云图。当接受到微信好友或微信群指令时,进行爬取,并将爬取结果返回给微信好友或微信群。
3.3.3. Urbllib.request
Urbllib.request也是一种可以用于爬取WEB页面数据的库。由于开发工具选取了Python3.6,而CIMISS接口客户端访问方式只支持Python2.6,因此只能依赖urllib.request库,采用REST方法读取CIMISS数据库气象资料。
3.3.4. JSON
JSON作为一种轻量级的数据交换语言 [7],易于人阅读和编写。这里导入JSON库,主要是因为使用REST方法获取CIMISS资料时,返回格式选择了JSON这一数据格式,因此需要使用JSON库的方法对获取的数据格式进行解析。
3.3.5. Pyodbc
Pyodbc提供了Python使用ODBC方式连接MSSQL数据库的方法,用于访问MSSQL类型数据库。
3.4. 系统关键技术实现
3.4.1. 微信机器人登录
系统启动后会先调用itchat的WEB微信登录方法itchat.auto_login(),生成微信登录二维码,如图10所示。通过微信扫描二维码登入系统后 [8],气象微信机器人的微信号就已登录到WEB微信,并处于程序托管状态。如图11所示。
![](//html.hanspub.org/file/5-2610307x17_hanspub.png?20220815094934505)
Figure 10. WeChat robot generates login QR code
图10. 微信机器人生成登录二维码
![](//html.hanspub.org/file/5-2610307x18_hanspub.png?20220815094934505)
Figure 11. WeChat robot successfully logged in and is in the hosting state
图11. 微信机器人登录成功并处于托管状态
3.4.2. itchat消息监听与消息发送
消息发送是气象微信机器人的核心功能,无论是监控报警还是人机交互功能的实现,都需要向用户进行消息发送。消息发送分为两种itchat.send (msg,toUserName=chatroom)发送消息到微信群,itchat.send (msg,toUserName=userName)发送消息给微信好友。
消息监听主要用于实现人机交互气象数据获取模块监听微信群或好友发送的消息。itchat规定了首先要对监听的消息类型进行注册,接收到的消息会寻找对应的注册方法,如果一个消息类型没有对应的注册方法,该消息将会被舍弃 [9]。可注册的数据类型有:TEXT (文本)、MAP (地图)、CARD (名片)、NOTE (通知)、SHARING (分享)、PICTURE (图片/表情)、RECORDING (语音)、ATTACHMENT (附件)、VIDEO (视频)、FRIENDS (好友邀请)、SYSTEM (系统消息)。本系统中,注册了两个消息类型FRIENDS和TEXT。FRIENDS消息类型@itchat.msg_register (FRIENDS),用于自动通过好友申请,当接收到好友请求时,自动添加该好友。注册TEXT消息类型时,分为两种情况@itchat.msg_register (TEXT, isGroupChat = True)和@itchat.msg_register (TEXT),分别用于监听微信群内消息和微信好友送的消息。由于微信群聊内可能会出现多个无效的消息,如其他群成员的聊天信息,因此这里为减少微信机器人消息处理量,对微信群内的聊天内容进行了一个过滤处理if msg['isAt']:,只有当微信机器人在群内被@时,才对消息进行响应。
3.4.3. 多线程并发运行
由于计时器与itchat消息监听不能同时进行,所以这里使用了多线程方法。Python实现多线程编程,主要用到的是threading.Thread对象,只需给Thread对象的target属性赋值即可为,如:threading.Thread (target = 函数名),即为该函数建立了一条子线程。将定时运行的监控模块和itchat监听微信接收信息模块写在了不同的线程内。主程序登录后主要运行三个线程,其中两个为计时监控线程,一个为消息监听线程。两个计时监控线程分别根据设置的时间循环运行自动站运行自动监控报警和雨情自动监控报警两个功能模块,当监控结果满足条件时发送报警消息到微信群,或是微信好友。另一个线程执行itchat消息监听,对微信机器人的微信好友和微信群进行监听,当接收到微信好友消息,或者在微信群内被@后,都会被itchat所监听到。该线程根据对监听到的内容进行自动匹配,调用相关的查询功能函数并按预设格式生成查询结果再反馈给微信好友或者微信群,即可实现有趣的人机互动。
4. 应用效果与不足
气象微信机器人将微信作为了互联网移动端和气象内网数据交换的桥梁,通过微信实现了对暴雨、自动站运行情况的自动化监控。成效主要有两点:一是提升气象自动站设备可用性,通过几年的业务运行,气象自动站故障监控由过去人工巡检(3~4小时巡检一次),变为现在每小时自动化监控,在减轻人工工作量的同时,极大提升了维修的时效性。二是气象监测预警服务能力的提升,2021年黔东南州境内“6.28~7.4”持续暴雨、“9.7”大暴雨和“8.23”凯里市城区内涝等几次重大灾害性天气过程中都及时向州、县两级气象台值班员和值班领导微信发布了暴雨报警消息,为气象防灾减灾工作争取了宝贵的时间。
系统还有一些需要完善的地方:比如人机交互时只能对特定的命令进行匹配识别,对话过程僵硬,智能化程度不够,需要改进让气象微信机器人能对命令库进行模糊匹配,加强气象信息的通俗性和互动性 [10],提供一个更为友好的人机交互环境。
基金项目
黔东南州科技计划项目(黔东南科合J字[2021] 76号):强降水对清水江流域水库调度和水灾隐患点的影响研究。