叶佳宁, 何 霆
(1.广东省地震局,广州 510070;2. 中国地震局地震监测与减灾技术重点实验室,广州 510070;3. 广东省地震预警与重大工程安全诊断重点实验室(筹),广州 510070)
地震信息微信自动发布系统的设计与实现
叶佳宁1,2,3, 何 霆1,2,3
(1.广东省地震局,广州 510070;2. 中国地震局地震监测与减灾技术重点实验室,广州 510070;
3. 广东省地震预警与重大工程安全诊断重点实验室(筹),广州 510070)
地震信息微信自动发布系统基于原有的地震速报系统,以微信为平台,实现“南粤防震减灾”官方微信对国内地震信息在微信平台的快速、自动发布。介绍了系统的设计模式,实现的关键技术和在地震行业中的应用,以及系统未来开发的思路拓展。
地震信息;微信;自动发布
越来越多的用户使用微信,是一个不争的事实。2013年初,微信用户突破三亿。微信模仿了微博的模式,微博上的名人,会有很多粉丝关注,同样,在微信上,也是如此的模式,但却在细节方面,优于微博。因此微信作为一种新的信息传播方式使人们能够更加方便、快捷、全面地认知各种信息。许多行业意识到微信的发展前景及用户量,将其作为自身信息的发布平台之一,或者作为扩大影响力的重要宣传手段之一。在地震行业,微信正慢慢成为民众与政府的重要媒介平台。
地震部门可通过微信平台对民众提供实时有效的地震信息,并以此作为地震信息发布的主要渠道之一。因此,只要稍加开发,地震部门便可以将其作为与民众良好的沟通桥梁。
1.1 总体结构
地震信息微信自动发布系统总体上分为客户端和服务器端,其基本架构如图1所示:
图1 地震信息微信自动发布系统模块组成图
系统采用轻量级、松耦合架构,通过微信公众平台自定义接口作为I/O通道,构建基于微信平台的地震速报服务端,负责地震信息和用户信息处理,向48小时活跃的关注用户发送图文并茂的地震讯息,客户端进行接收。
1.2 系统流程
当某个地方发生地震,由地震速报系统进行地震三要素(时间、地点、震级)的确定并将地震信息录入地震讯息数据库,之后触发地震信息微信发布模块,将地震信息以图文并茂的方式推送给48小时活跃的关注用户。简单来说系统采用自动化方式将收集到的地震信息通过微信平台公布在互联网上,全过程采用自动处理方式进行,保证了数据传递的快速、稳定和准确(图1)。
2.1 地震速报系统
地震自动速报系统[1-2]采用实时仿真技术,以地震仪原理为基础,以摆的反应作为仿真平台提出仿真算法,整合测震、强震等多类型资源对地震进行三要素的确定,最后通过部署在国家地震台网中心的自动EQIM 服务器进行汇集和转发,并将自动地震速报信息以短信形式发送至地震系统内部人员。
2.2 微信平台地震信息发布模块
微信公众平台的开发可以使用PHP、ASP、JSP等多种技术构建。本系统以南粤防震减灾的微信公众号为基础,采用PHP技术搭建服务端,客户端网页的呈现采用JQuery技术来搭建。具体环境配置如下:
(1) 操作系统:windows 2008;
(2) 数据库:SQL Server 2000;
(3) Web服务器:Apache,端口:80。
2.2.1 接口的申请和接入
首先,到微信公众平台(http://mp.weixin.qq.com)申请公众平台帐号,然后到指定页面申请消息接口,填写网址url和token,其中:token可以任意填写,用作生成签名[3]。
提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上4个参数,如表1所示:
表1 微信校验参数
Server端通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,原样返回echostr参数内容,接入生效,否则接入失败。
具体代码如下:
function wxVerify(){
$signature=$_GET["signature"];
$timestamp=$_GET["timestamp"];
$nonce=$_GET["nonce"];
$token=TOKEN;
$tmpArr=array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr=implode( $tmpArr );
$tmpStr=sha1( $tmpStr );
return $tmpStr==$signature?$_GET["echostr"]:"";
}
正确接入后执行后续开发流程。
2.2.2 触发机制
为了保证服务器端资源的最低损耗,系统摒弃对数据库轮询的传统方式,采用有地震则触发的机制。当地震发生时,通过地震速报系统获取地震三要素并通过POST方式获取最新地震信息的三要素并录入数据库,关键代码如下:
$action=$_REQUEST["do"];//传递有新的地震信息
if(false);
else if($action);
else {
$time = $_REQUEST["time"];//获取发震时间
$loc = $_REQUEST["loc"];//获取发震地点
$lon = $_REQUEST["lon"];//获取发震经度
$lat = $_REQUEST["lat"];//获取发震纬度
$mag = $_REQUEST["mag"];//获取发震震级
$depth = $_REQUEST["depth"];//获取震源深度
if($conn = getConn()) {
sqlExec($conn, "INSERT INTO eqimlogs VALUES ('${status}', '${time}', GETDATE(), '".$loc."', ${lon}, ${lat}, '".utf8ToGB2312($mag)."', ${depth})");//写入数据库
closeConn($conn);//关闭数据库
}
}
?>
发布平台集成了网站、微博[4]、微信等对新地震消息的自动发布。当网页被访问时,需要执行一条数据库查询语句,对发布目标地点进行查询。为此,针对微信,笔者在数据库中存入微信发布的url地址,进行下一步的发布工作。在微信服务器端,在触发网页被访问时执行网页中的PHP代码来完成触发过程,如图2所示。
图2 触发机制流程图
关键代码如下:
if($rs=sqlQuery("SELECT [value] AS [url] FROM [config] WHERE [key] LIKE 'rrmsg.%'"))//在数据库中查询需要发布的目标地点
{
require_once($_SERVER["DOCUMENT_ROOT"]."/http.php");
foreach($rs as $r)
try{ HttpClient::asyncGet($r["url"]); } //对数据信息进行异步获取
catch(Exception $e) { }//数据库信息异常状况的获取
}
?>
由于地震速报系统和微信服务端是独立运行的两个系统,为保证地震速报系统和微信服务端7×24小时的连通率,在两个独立运行的系统间采用了心跳机制。地震速报系统每隔5 s主动向微信服务端发送通信消息,通信消息的发送通过访问网页的形式进行。如两边通信正常则网页访问成功,便在当前目录建立标识文件。微信服务端以5 s 的间隔对标识文件进行检测,并以检测文件是否存在作为通信是否正常的判断标准。如标识文件存在则说明通信正常,如标识文件不存在则说明网页访问失败,通过短信告诉地震速报系统管理员和微信管理员。心跳机制使两套系统松耦合,在保证连通率的情况下同时也便于不同管理员的管理。
$lockfile="timeout.lock";
if(file_exists($lockfile));//如文件存在证明访问成功,连通正常
else {//否则把中断时间写入timeout.lock文件中,以便故障查询
file_put_contents($lockfile, time());
eq12322SendGroup(array($admin_phone1="xxx", $admin_phone2="xxx"), "短信网关的心跳信号于".date("d日H时i分s秒")."断开。");//通信断开发送短信至管理员
sqlExec(null, "INSERT INTO [hblogs] VALUES('d', GETDATE())");//通信中断信息写入数据库
unlink(timeout.lock);//删除timeout.lock文件
}
?>
2.2.3 发布机制
接入微信公众平台后,可使用后台服务与用户互动。通过公众号向用户发送消息,在微信平台中有2种方式:微信平台每月4次的群发消息和48小时的活跃用户单独发消息。群发消息指所有关注此公众号的用户都可收到群发消息;48小时活跃用户消息指的是用户给公众号发送的最后一次消息(文字、图片、视频、地理位置、菜单互动)开始的48小时之内,公众号可以单独给用户发送消息。由于群发消息的规则根本不能满足地震消息事件发布的需求,因此,本系统采用48小时活跃用户的方式给用户自动推送实时的地震消息。自动发布的关键代码如下:
function dzkx($fromUsername,$toUsername)
{
$newsTpl = "
";//根据微信提供的开发接口,设置发送信息的xml格式
$rs=sqlQueryRow("SELECT TOP 1 * FROM [xxx] WHERE (type='".utf8ToGBK("正式速报")."') OR (type='".gbkToUTF8("自动速报")."') ORDER BY [dt_ins] DESC")//从数据库中获取最新地震消息
$a=odbc_fetch_row($rs);
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);//设置要访问的IP
curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);//模拟用户使用的浏览器
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); //设置超时时间
$result = curl_exec($ch);
curl_close($ch);
$contentStr="据广东省地震台网测定,北京时间".odbc_result($rs,"dt");.",在".odbc_result($rs,"loc");."(".odbc_result($rs,"lon");."度,".odbc_result($rs,"lat");"度),发生震级M".odbc_result($rs,"mag");."地震,震源深度".odbc_result($rs,"depth");."。";
$contentStr=mb_convert_encoding($contentStr,"utf-8","GBK");
$msgType="news";
$time = time();
$title="地震快讯";
$title=mb_convert_encoding($title,"utf-8","GBK");
$resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time, $msgType, "1", $title,$contentStr,$picurl,$link);
echo $resultStr;//向某个用户发送消息
odbc_close($conn);
}
当用户关注公众号时,系统获取用户在微信平台的各类信息,并将用户的所有信息都存入服务端的数据库中,其中包括用户与公众号的最后一次互动时间,以此作为用户活跃度的计算。为保证用户都处在活跃度期间而收到及时有效的地震信息,微信服务端将用异步的方式对数据库中用户的互动时间进行轮询,在用户即将超过48小时活跃期时,给用户发送消息进行提醒,如图3所示。关键代码如下:
if($_REQUEST["fade"])
{
if($rs=sqlQuery("SELECT 172800-DATEDIFF(SECOND, [dt_u], GETDATE()) AS [active], [openid] FROM [user] WHERE (172800-DATEDIFF(SECOND, [dt_u], GETDATE())>=0) AND (172800-DATEDIFF(SECOND, [dt_u], GETDATE())<60) ORDER BY [dt_s] ASC"))//筛选出即将超过48小时活跃期的用户
{
$token=wxGrantAccessToken();//获取微信TOKEN
foreach($rs as $r)
wxSend(wxMsgText($r["openid"], "我们抱歉地通知您: ".$r["active"]."秒后您将无法接收我们为您推送的信息 如果您希望继续接收 请随意给我们发送一条信息 或者点击我们任意一个菜单项 以保持您的在线状态"), $token);
}
}
广东省地震局开通的“南粤防震减灾”官方微信已得到微信平台的官方认证。在此公众号已实现地震信息图文方式的自动发布。图4为系统实际应用的截图,2014年5月30日23时53分在云南省德宏傣族景颇族自治州盈江县(97.9°E,25.0°N)发生4.5级地震,震源深度5公里,系统于2014年5月31日00时02分向48小时活跃用户推送了这条地震消息。
图3 消息提醒图
图4 系统应用效果图
本文中地震信息微信自动发布系统已成为广东省地震信息发布的重要平台之一。系统充分利用现有的资源与技术,为民众提供准确、快速的地震信息。在微信平台中,仍有许多可利用的方式,例如,灾情收集,烈度反馈,避难查询等来搭建地震部门与民众沟通的桥梁,在这方面将继续拓宽思路,更好地服务于民众。
[1]杨陈,黄志斌,廖诗荣,等.全国自动地震速报系统介绍[J].地震地磁观测与研究,2010,31 (5):158-161.
[2]刘胜国,高景春,陈智勇. 基于ActiveMQ平台的地震消息服务探讨[J]. 华北地震科学,2012,30(2):39-42.
[3]微信公众平台开发者文档[EB/OL].http://mp.weixin.qq.com/wiki/index.php?title=消息接口指南,2014-03-03.
[4]叶佳宁,何霆. 地震信息微博自动发布系统的设计与应用[J].华南地震, 2012, 32(4): 82-87.
Design and Implementation of Earthquake Message WeChat Automatic Release System
YE Jia-ning1,2,3, HE Ting1,2,3
(1.Earthquake Administration of Guangdong Province, Guangzhou, 510070, China;
2. Key Laboratory of Earthquake Monitoring and Disaster Mitigation Technology, CEA Guangzhou510070, China;
3. Key Laboratory of Guangdong Province Earthquake Early Warning and Safety Diagnosis
of Major Projects, Guangzhou 510070, China)
Based on former earthquake quick report system and WeChat platform, the earthquake information WeChat automatic release system implements the WeChat “Southern Guangdong Earthquake Mitigation Disaster” quickly and automatically publishing earthquake information in WeChat platform. This paper describes the design model, the key technology, the application in the earthquake field, and system development train of thought to expand in the future.
earthquake information; WeChat; automatic release
10.3969/j.issn.1003-1375.2014.04.005
2014-10-20
“广东省突发公共事件应急技术研究中心”项目(项目编号:2012A032100003)
叶佳宁(1985—),女,工程师,主要从事地震应急、信息网络技术研究.E-mail: 510889962@qq.com.
P315.69
A
1003-1375(2014)04-0023-06