葉佳寧, 何 霆
(1.廣東省地震局,廣州 510070;2. 中國地震局地震監(jiān)測與減災(zāi)技術(shù)重點(diǎn)實(shí)驗(yàn)室,廣州 510070;3. 廣東省地震預(yù)警與重大工程安全診斷重點(diǎn)實(shí)驗(yàn)室(籌),廣州 510070)
地震信息微信自動(dòng)發(fā)布系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
葉佳寧1,2,3, 何 霆1,2,3
(1.廣東省地震局,廣州 510070;2. 中國地震局地震監(jiān)測與減災(zāi)技術(shù)重點(diǎn)實(shí)驗(yàn)室,廣州 510070;
3. 廣東省地震預(yù)警與重大工程安全診斷重點(diǎn)實(shí)驗(yàn)室(籌),廣州 510070)
地震信息微信自動(dòng)發(fā)布系統(tǒng)基于原有的地震速報(bào)系統(tǒng),以微信為平臺(tái),實(shí)現(xiàn)“南粵防震減災(zāi)”官方微信對(duì)國內(nèi)地震信息在微信平臺(tái)的快速、自動(dòng)發(fā)布。介紹了系統(tǒng)的設(shè)計(jì)模式,實(shí)現(xiàn)的關(guān)鍵技術(shù)和在地震行業(yè)中的應(yīng)用,以及系統(tǒng)未來開發(fā)的思路拓展。
地震信息;微信;自動(dòng)發(fā)布
越來越多的用戶使用微信,是一個(gè)不爭的事實(shí)。2013年初,微信用戶突破三億。微信模仿了微博的模式,微博上的名人,會(huì)有很多粉絲關(guān)注,同樣,在微信上,也是如此的模式,但卻在細(xì)節(jié)方面,優(yōu)于微博。因此微信作為一種新的信息傳播方式使人們能夠更加方便、快捷、全面地認(rèn)知各種信息。許多行業(yè)意識(shí)到微信的發(fā)展前景及用戶量,將其作為自身信息的發(fā)布平臺(tái)之一,或者作為擴(kuò)大影響力的重要宣傳手段之一。在地震行業(yè),微信正慢慢成為民眾與政府的重要媒介平臺(tái)。
地震部門可通過微信平臺(tái)對(duì)民眾提供實(shí)時(shí)有效的地震信息,并以此作為地震信息發(fā)布的主要渠道之一。因此,只要稍加開發(fā),地震部門便可以將其作為與民眾良好的溝通橋梁。
1.1 總體結(jié)構(gòu)
地震信息微信自動(dòng)發(fā)布系統(tǒng)總體上分為客戶端和服務(wù)器端,其基本架構(gòu)如圖1所示:
圖1 地震信息微信自動(dòng)發(fā)布系統(tǒng)模塊組成圖
系統(tǒng)采用輕量級(jí)、松耦合架構(gòu),通過微信公眾平臺(tái)自定義接口作為I/O通道,構(gòu)建基于微信平臺(tái)的地震速報(bào)服務(wù)端,負(fù)責(zé)地震信息和用戶信息處理,向48小時(shí)活躍的關(guān)注用戶發(fā)送圖文并茂的地震訊息,客戶端進(jìn)行接收。
1.2 系統(tǒng)流程
當(dāng)某個(gè)地方發(fā)生地震,由地震速報(bào)系統(tǒng)進(jìn)行地震三要素(時(shí)間、地點(diǎn)、震級(jí))的確定并將地震信息錄入地震訊息數(shù)據(jù)庫,之后觸發(fā)地震信息微信發(fā)布模塊,將地震信息以圖文并茂的方式推送給48小時(shí)活躍的關(guān)注用戶。簡單來說系統(tǒng)采用自動(dòng)化方式將收集到的地震信息通過微信平臺(tái)公布在互聯(lián)網(wǎng)上,全過程采用自動(dòng)處理方式進(jìn)行,保證了數(shù)據(jù)傳遞的快速、穩(wěn)定和準(zhǔn)確(圖1)。
2.1 地震速報(bào)系統(tǒng)
地震自動(dòng)速報(bào)系統(tǒng)[1-2]采用實(shí)時(shí)仿真技術(shù),以地震儀原理為基礎(chǔ),以擺的反應(yīng)作為仿真平臺(tái)提出仿真算法,整合測震、強(qiáng)震等多類型資源對(duì)地震進(jìn)行三要素的確定,最后通過部署在國家地震臺(tái)網(wǎng)中心的自動(dòng)EQIM 服務(wù)器進(jìn)行匯集和轉(zhuǎn)發(fā),并將自動(dòng)地震速報(bào)信息以短信形式發(fā)送至地震系統(tǒng)內(nèi)部人員。
2.2 微信平臺(tái)地震信息發(fā)布模塊
微信公眾平臺(tái)的開發(fā)可以使用PHP、ASP、JSP等多種技術(shù)構(gòu)建。本系統(tǒng)以南粵防震減災(zāi)的微信公眾號(hào)為基礎(chǔ),采用PHP技術(shù)搭建服務(wù)端,客戶端網(wǎng)頁的呈現(xiàn)采用JQuery技術(shù)來搭建。具體環(huán)境配置如下:
(1) 操作系統(tǒng):windows 2008;
(2) 數(shù)據(jù)庫:SQL Server 2000;
(3) Web服務(wù)器:Apache,端口:80。
2.2.1 接口的申請(qǐng)和接入
首先,到微信公眾平臺(tái)(http://mp.weixin.qq.com)申請(qǐng)公眾平臺(tái)帳號(hào),然后到指定頁面申請(qǐng)消息接口,填寫網(wǎng)址url和token,其中:token可以任意填寫,用作生成簽名[3]。
提交信息后,微信服務(wù)器將發(fā)送GET請(qǐng)求到填寫的URL上,并且?guī)?個(gè)參數(shù),如表1所示:
表1 微信校驗(yàn)參數(shù)
Server端通過檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn)。若確認(rèn)此次GET請(qǐng)求來自微信服務(wù)器,原樣返回echostr參數(shù)內(nèi)容,接入生效,否則接入失敗。
具體代碼如下:
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"]:"";
}
正確接入后執(zhí)行后續(xù)開發(fā)流程。
2.2.2 觸發(fā)機(jī)制
為了保證服務(wù)器端資源的最低損耗,系統(tǒng)摒棄對(duì)數(shù)據(jù)庫輪詢的傳統(tǒng)方式,采用有地震則觸發(fā)的機(jī)制。當(dāng)?shù)卣鸢l(fā)生時(shí),通過地震速報(bào)系統(tǒng)獲取地震三要素并通過POST方式獲取最新地震信息的三要素并錄入數(shù)據(jù)庫,關(guān)鍵代碼如下:
$action=$_REQUEST["do"];//傳遞有新的地震信息
if(false);
else if($action);
else {
$time = $_REQUEST["time"];//獲取發(fā)震時(shí)間
$loc = $_REQUEST["loc"];//獲取發(fā)震地點(diǎn)
$lon = $_REQUEST["lon"];//獲取發(fā)震經(jīng)度
$lat = $_REQUEST["lat"];//獲取發(fā)震緯度
$mag = $_REQUEST["mag"];//獲取發(fā)震震級(jí)
$depth = $_REQUEST["depth"];//獲取震源深度
if($conn = getConn()) {
sqlExec($conn, "INSERT INTO eqimlogs VALUES ('${status}', '${time}', GETDATE(), '".$loc."', ${lon}, ${lat}, '".utf8ToGB2312($mag)."', ${depth})");//寫入數(shù)據(jù)庫
closeConn($conn);//關(guān)閉數(shù)據(jù)庫
}
}
?>
發(fā)布平臺(tái)集成了網(wǎng)站、微博[4]、微信等對(duì)新地震消息的自動(dòng)發(fā)布。當(dāng)網(wǎng)頁被訪問時(shí),需要執(zhí)行一條數(shù)據(jù)庫查詢語句,對(duì)發(fā)布目標(biāo)地點(diǎn)進(jìn)行查詢。為此,針對(duì)微信,筆者在數(shù)據(jù)庫中存入微信發(fā)布的url地址,進(jìn)行下一步的發(fā)布工作。在微信服務(wù)器端,在觸發(fā)網(wǎng)頁被訪問時(shí)執(zhí)行網(wǎng)頁中的PHP代碼來完成觸發(fā)過程,如圖2所示。
圖2 觸發(fā)機(jī)制流程圖
關(guān)鍵代碼如下:
if($rs=sqlQuery("SELECT [value] AS [url] FROM [config] WHERE [key] LIKE 'rrmsg.%'"))//在數(shù)據(jù)庫中查詢需要發(fā)布的目標(biāo)地點(diǎn)
{
require_once($_SERVER["DOCUMENT_ROOT"]."/http.php");
foreach($rs as $r)
try{ HttpClient::asyncGet($r["url"]); } //對(duì)數(shù)據(jù)信息進(jìn)行異步獲取
catch(Exception $e) { }//數(shù)據(jù)庫信息異常狀況的獲取
}
?>
由于地震速報(bào)系統(tǒng)和微信服務(wù)端是獨(dú)立運(yùn)行的兩個(gè)系統(tǒng),為保證地震速報(bào)系統(tǒng)和微信服務(wù)端7×24小時(shí)的連通率,在兩個(gè)獨(dú)立運(yùn)行的系統(tǒng)間采用了心跳機(jī)制。地震速報(bào)系統(tǒng)每隔5 s主動(dòng)向微信服務(wù)端發(fā)送通信消息,通信消息的發(fā)送通過訪問網(wǎng)頁的形式進(jìn)行。如兩邊通信正常則網(wǎng)頁訪問成功,便在當(dāng)前目錄建立標(biāo)識(shí)文件。微信服務(wù)端以5 s 的間隔對(duì)標(biāo)識(shí)文件進(jìn)行檢測,并以檢測文件是否存在作為通信是否正常的判斷標(biāo)準(zhǔn)。如標(biāo)識(shí)文件存在則說明通信正常,如標(biāo)識(shí)文件不存在則說明網(wǎng)頁訪問失敗,通過短信告訴地震速報(bào)系統(tǒng)管理員和微信管理員。心跳機(jī)制使兩套系統(tǒng)松耦合,在保證連通率的情況下同時(shí)也便于不同管理員的管理。
$lockfile="timeout.lock";
if(file_exists($lockfile));//如文件存在證明訪問成功,連通正常
else {//否則把中斷時(shí)間寫入timeout.lock文件中,以便故障查詢
file_put_contents($lockfile, time());
eq12322SendGroup(array($admin_phone1="xxx", $admin_phone2="xxx"), "短信網(wǎng)關(guān)的心跳信號(hào)于".date("d日H時(shí)i分s秒")."斷開。");//通信斷開發(fā)送短信至管理員
sqlExec(null, "INSERT INTO [hblogs] VALUES('d', GETDATE())");//通信中斷信息寫入數(shù)據(jù)庫
unlink(timeout.lock);//刪除timeout.lock文件
}
?>
2.2.3 發(fā)布機(jī)制
接入微信公眾平臺(tái)后,可使用后臺(tái)服務(wù)與用戶互動(dòng)。通過公眾號(hào)向用戶發(fā)送消息,在微信平臺(tái)中有2種方式:微信平臺(tái)每月4次的群發(fā)消息和48小時(shí)的活躍用戶單獨(dú)發(fā)消息。群發(fā)消息指所有關(guān)注此公眾號(hào)的用戶都可收到群發(fā)消息;48小時(shí)活躍用戶消息指的是用戶給公眾號(hào)發(fā)送的最后一次消息(文字、圖片、視頻、地理位置、菜單互動(dòng))開始的48小時(shí)之內(nèi),公眾號(hào)可以單獨(dú)給用戶發(fā)送消息。由于群發(fā)消息的規(guī)則根本不能滿足地震消息事件發(fā)布的需求,因此,本系統(tǒng)采用48小時(shí)活躍用戶的方式給用戶自動(dòng)推送實(shí)時(shí)的地震消息。自動(dòng)發(fā)布的關(guān)鍵代碼如下:
function dzkx($fromUsername,$toUsername)
{
$newsTpl = "
";//根據(jù)微信提供的開發(fā)接口,設(shè)置發(fā)送信息的xml格式
$rs=sqlQueryRow("SELECT TOP 1 * FROM [xxx] WHERE (type='".utf8ToGBK("正式速報(bào)")."') OR (type='".gbkToUTF8("自動(dòng)速報(bào)")."') ORDER BY [dt_ins] DESC")//從數(shù)據(jù)庫中獲取最新地震消息
$a=odbc_fetch_row($rs);
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);//設(shè)置要訪問的IP
curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);//模擬用戶使用的瀏覽器
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); //設(shè)置超時(shí)時(shí)間
$result = curl_exec($ch);
curl_close($ch);
$contentStr="據(jù)廣東省地震臺(tái)網(wǎng)測定,北京時(shí)間".odbc_result($rs,"dt");.",在".odbc_result($rs,"loc");."(".odbc_result($rs,"lon");."度,".odbc_result($rs,"lat");"度),發(fā)生震級(jí)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;//向某個(gè)用戶發(fā)送消息
odbc_close($conn);
}
當(dāng)用戶關(guān)注公眾號(hào)時(shí),系統(tǒng)獲取用戶在微信平臺(tái)的各類信息,并將用戶的所有信息都存入服務(wù)端的數(shù)據(jù)庫中,其中包括用戶與公眾號(hào)的最后一次互動(dòng)時(shí)間,以此作為用戶活躍度的計(jì)算。為保證用戶都處在活躍度期間而收到及時(shí)有效的地震信息,微信服務(wù)端將用異步的方式對(duì)數(shù)據(jù)庫中用戶的互動(dòng)時(shí)間進(jìn)行輪詢,在用戶即將超過48小時(shí)活躍期時(shí),給用戶發(fā)送消息進(jìn)行提醒,如圖3所示。關(guān)鍵代碼如下:
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小時(shí)活躍期的用戶
{
$token=wxGrantAccessToken();//獲取微信TOKEN
foreach($rs as $r)
wxSend(wxMsgText($r["openid"], "我們抱歉地通知您: ".$r["active"]."秒后您將無法接收我們?yōu)槟扑偷男畔?如果您希望繼續(xù)接收 請(qǐng)隨意給我們發(fā)送一條信息 或者點(diǎn)擊我們?nèi)我庖粋€(gè)菜單項(xiàng) 以保持您的在線狀態(tài)"), $token);
}
}
廣東省地震局開通的“南粵防震減災(zāi)”官方微信已得到微信平臺(tái)的官方認(rèn)證。在此公眾號(hào)已實(shí)現(xiàn)地震信息圖文方式的自動(dòng)發(fā)布。圖4為系統(tǒng)實(shí)際應(yīng)用的截圖,2014年5月30日23時(shí)53分在云南省德宏傣族景頗族自治州盈江縣(97.9°E,25.0°N)發(fā)生4.5級(jí)地震,震源深度5公里,系統(tǒng)于2014年5月31日00時(shí)02分向48小時(shí)活躍用戶推送了這條地震消息。
圖3 消息提醒圖
圖4 系統(tǒng)應(yīng)用效果圖
本文中地震信息微信自動(dòng)發(fā)布系統(tǒng)已成為廣東省地震信息發(fā)布的重要平臺(tái)之一。系統(tǒng)充分利用現(xiàn)有的資源與技術(shù),為民眾提供準(zhǔn)確、快速的地震信息。在微信平臺(tái)中,仍有許多可利用的方式,例如,災(zāi)情收集,烈度反饋,避難查詢等來搭建地震部門與民眾溝通的橋梁,在這方面將繼續(xù)拓寬思路,更好地服務(wù)于民眾。
[1]楊陳,黃志斌,廖詩榮,等.全國自動(dòng)地震速報(bào)系統(tǒng)介紹[J].地震地磁觀測與研究,2010,31 (5):158-161.
[2]劉勝國,高景春,陳智勇. 基于ActiveMQ平臺(tái)的地震消息服務(wù)探討[J]. 華北地震科學(xué),2012,30(2):39-42.
[3]微信公眾平臺(tái)開發(fā)者文檔[EB/OL].http://mp.weixin.qq.com/wiki/index.php?title=消息接口指南,2014-03-03.
[4]葉佳寧,何霆. 地震信息微博自動(dòng)發(fā)布系統(tǒng)的設(shè)計(jì)與應(yīng)用[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
“廣東省突發(fā)公共事件應(yīng)急技術(shù)研究中心”項(xiàng)目(項(xiàng)目編號(hào):2012A032100003)
葉佳寧(1985—),女,工程師,主要從事地震應(yīng)急、信息網(wǎng)絡(luò)技術(shù)研究.E-mail: 510889962@qq.com.
P315.69
A
1003-1375(2014)04-0023-06