文/劉歡 盧蓓蓉 陳穎
自從2012年8月華中科技大學推出首個國內高校官方微信后,越來越多的高校已陸續(xù)開通了微信公共賬號。其中,除部分高校開發(fā)了專門的微信平臺系統外,大部分高校都還停留在使用“關鍵詞自動回復”的簡單交互層面,即在微信提供的管理后臺中設置多種關鍵詞及其對應的回復內容,一旦用戶輸入了某個關鍵詞,則返回其對應的預設內容。關鍵詞自動回復能夠實現一些初級的匹配功能,但無法實時查詢和返回高校各個業(yè)務系統中的數據信息,也無法實現上下文交互,更無法深入使用微信公共平臺提供的各種自定義功能。
本文梳理了當前高校微信公共平臺的各種功能,以華東師范大學現有信息化應用系統作為數據基礎,通過使用CodeIgniter敏捷開源框架開發(fā)富有交互性的微信公共平臺,分析和闡述了平臺關鍵功能實現過程中存在的問題,并提出相應的技術解決方案。
微信公共平臺的通訊路線可簡單歸納為“用戶-微信服務器-平臺服務器-微信服務器-用戶”,我們可以將每一次通訊視為一次交互過程,如圖1所示。用戶是交互過程的發(fā)起人,通過在微信程序中向公共賬號發(fā)送消息來啟動交互。微信服務器是交互的信息中轉站,消息被直接發(fā)送至微信服務器,服務器再根據該公共賬號所設置的模式類型來確定消息的處理方式。當該賬號為簡單的編輯模式時,微信將通過諸如關鍵詞回復等功能對消息進行匹配,直接將匹配結果返回給用戶。而當賬號設置為開發(fā)模式時,微信服務器將把用戶發(fā)送的消息以XML數據的形式發(fā)送至公共賬號預設的接口,即平臺服務器。平臺服務器是交互的信息處理方,其核心是由公共賬號管理者自主搭建的Web應用程序。平臺服務器在接收到來自微信服務器的數據后,根據數據中包含的消息類型和關鍵詞內容準備相應的回調格式和信息,并按照微信規(guī)定的消息格式返回響應數據。微信服務器在收到該響應數據后,再將其中的內容信息以規(guī)定的格式發(fā)送給用戶,完成整個交互過程。微信公共平臺開發(fā)的主要任務即搭建其中的平臺服務器,創(chuàng)建Web應用程序來處理所有的信息請求任務,向微信服務器返回相應的數據內容。
微信公共平臺的接口主要包含三大類。一類是接收用戶消息接口,其中包含文本信息、圖片信息、地理位置信息、鏈接信息等類型,平臺服務器通過這些接口從微信服務器推送的數據中獲取相應內容。另一類是回復用戶消息接口,其中包含文本信息、圖文信息和音樂信息等類型,平臺服務器將根據回復消息的格式,選擇相應的接口向微信服務器回調數據。第三類為事件推送接口,包含了用戶的關注和取消關注兩類事件接口,用于平臺服務器向新近關注用戶發(fā)送歡迎消息。
基于微信公共平臺簡潔的運行機制,我們選擇了輕量化的CodeIgniter框架來作為平臺的開發(fā)工具。CodeIgniter框架的優(yōu)點是架構簡單、配置靈活,擁有出色的運行性能,且其運營成本低、開發(fā)周期短,特別適合于高校自主開發(fā)微信平臺。
1. 設計模式
CodeIgniter框架是基于“模型-視圖-控制器”的MVC模式的,我們在微信公共平臺開發(fā)中也遵循了這一設計模式,以實現邏輯和表現層面的分離。其中,模型(Model)代表了數據結構,在本平臺中主要表現為一個模型類,實現平臺數據的讀取、插入、更新、刪除等功能。視圖(View)代表了展示給用戶的信息,即平臺中展示給用戶的各種網頁,包含了用戶授權的相關頁面模板。控制器 (Controller) 是模型、視圖和其他資源之間的中介,在本平臺中主要用于調度各種數據,創(chuàng)建消息處理流程。由于微信平臺不需要過多向用戶展示網頁,其數據也基本來自其他信息化系統的接口,因此本框架中的模型和視圖類型都較為簡單。平臺的核心在于控制器,其主要功能都由控制器完成,其中包括消息的接收、判斷、處理和回調等。

圖1 微信公共平臺通訊機制

智能終端的一代。
此外,平臺將一些核心的功能類和常用函數抽離出來,分別創(chuàng)建對應的裝載類(Libraries)和輔助函數類(Helpers),在運用時按需加載,以簡化控制器中的功能代碼,提高系統運行效率。在裝載類中包含了網頁HTML標簽內容的采集、正則解析,以及模板解析等復雜的功能類庫。在輔助函數中則包含了各種單獨的函數,包括各種數據接口的連接、時間日期處理、敏感詞過濾、單位換算等。
2. 數據庫設計
平臺采用MySQL數據庫。該庫中主要的數據有三種,分別是用戶(User)、規(guī) 則(Rule) 和 消 息(Message)。User表中儲存了每個微信用戶的用戶號(OpenId),以及上一次操作的狀態(tài)記錄、學號和工號信息等,用于實現用戶的上下文交互,使用各種校內信息系統的授權功能。Message表中儲存了用戶向微信公共賬號發(fā)送的所有消息,是平臺消息的歷史存檔。Rule表中包含了管理員預設的消息響應規(guī)則,是平臺消息處理流程的具體依據。
除以上三種數據外,數據庫中還包含了實現各種平臺功能所需的配置數據。如為“背單詞”功能創(chuàng)建Dictionary表,以儲存四六級單詞數據;為“自動聊天”功能創(chuàng)建Talk表,以儲存各種對話規(guī)則;為“自習教室查詢”功能創(chuàng)建Classroom表,以儲存常用的自習教室列表等。
3.數據的獲取
平臺有四種獲取數據的方式。第一種方式是從平臺數據庫中直接獲取數據,包括前文所述的單詞、對話規(guī)則、自習教室列表等。第二種方式是從已有的校園信息系統接口中獲取數據,如獲取校園卡余額、拾卡記錄、課程表、學期日歷、校園新聞、通知公告、講座報告等。第三種方式是從各種社會網站接口中獲取數據,比如從中國天氣網獲取天氣預報數據,從PM25.in獲取空氣質量數據等。第四種方式是對網頁進行HTML采集,經過正則解析,獲取特定標簽中的內容,如通過教師個人主頁系統查詢教師的個人信息、根據關鍵字獲取某研究方向對應的教師列表、查詢圖書信息等。
在以上四種數據獲取方式中,第一種方式通過CodeIgniter框架的模型類進行實現,第二、三種方式通過輔助函數類實現,第四種方式通過裝載類實現。數據交互格式主要為XML和JSON兩種,其中JSON在精簡數據流量方面優(yōu)于XML,有助于縮短平臺的響應延時。
4. 消息處理流程
在CodeIgniter框架的主控制器中定義了微信平臺的消息處理流程,如圖2所示。首先,在控制器中加載必要的裝載類和輔助函數,獲取來自微信服務器的推送數據,并解析數據中的用戶微信號、消息類型和消息內容,將其記錄到Message表。然后,從User表中查詢是否存在當前的用戶微信號記錄,如果不存在則表示當前用戶為新關注用戶,將其OpenId信息寫入User表,并從Rule表中獲取歡迎信息,作為返回給微信服務器的數據內容。
當存在用戶微信號記錄時,系統提取該OpenId對應的歷史操作記錄,更新本次交互的信息記錄,并進入按規(guī)則匹配的消息處理階段。根據用戶之前的操作記錄,結合Rule表中的響應規(guī)則,系統將判斷本次交互是否屬于上下文對話。系統中的上下文對話包括校車查詢、教師查詢、自動聊天、背單詞等,每當用戶輸入相應的關鍵字后,下一次對話即進入相應的情景模式。如此前用戶曾輸入過“校車”,則表示當前為校車查詢情景模式,若本次輸入的消息內容為“1”或“線路1”,則上下文對話有效,將從Rule表中獲取第一種校車線路作為返回內容。如果當前輸入的關鍵字不在情景模式規(guī)定的對話規(guī)則之內,則退出該情景模式,進入非上下文對話的規(guī)則匹配階段。平臺中每一條規(guī)則都對應了多個關鍵字,如輸入“新聞”、“校園新聞”、“要聞”等詞語都將獲取門戶網站系統中的新聞列表,輸入“撿卡”、“拾卡”、“丟卡”等詞語都將調用校園卡的拾卡記錄查詢接口等。在一些規(guī)則中我們采用了寬松的匹配模式,如當用戶輸入的消息中含有“看病”、“生病”、“醫(yī)院”等字樣時,均返回校園就診的相關信息,這樣,用戶不管是輸入“我想看病”,還是“我生病了,怎么辦?”這樣難以精確預測的描述語時,都能匹配到相應的響應結果。
在遍歷了Rule表中的所有規(guī)則后,如果關鍵字仍然沒有匹配結果,則進入網站匹配階段,即通過網站群數據接口,搜索所有校園網站中包含該關鍵字的信息條目。華東師范大學網站群中目前運行了包括門戶網站、二級院系部門網站在內的近100個校園站點,全面涵蓋了校內的新聞、公告、教學、科研等信息。通過這一階段的匹配,能夠實現強大的校內信息聚合功能。如用戶輸入“校友返校”,在Rule表沒有對應匹配規(guī)則的前提下,平臺將從網站群數據接口中獲取所有含有該關鍵字的信息,其中包含了校級層面和學院層面的各種校友返校信息。
當網站匹配階段仍然沒有符合的匹配結果時,系統將隨機返回給用戶一些使用建議,如提供平臺的使用幫助,詢問用戶是否需要背單詞,是否需要進入聊天模式等。系統還將隨機向用戶發(fā)送一些簡單的調查問題,如詢問用戶是否是校友,所在部門是哪個等,以此逐步完善用戶數據信息,為后續(xù)的平臺功能開發(fā)打下基礎。
通過以上的消息處理,系統已經準備好了返回給用戶的信息。最后,系統按照信息的類型準備相應的XML結構,并向微信服務器返回響應數據包,完成整個交互過程。其中,大部分情況下信息以文本類型打包,即在微信中直接返回一段文字對話。在處理新聞列表、講座列表、教師名錄列表等多條信息時,需要使用圖文模板的XML結構,以便在用戶微信界面中以列表形式顯示這些信息。在少數情況下,系統會返回音頻信息,此時需要使用音樂模板返回響應數據包。
5. 安全性
微信公共平臺由于帶有官方賬號的權威效應,且直接面向用戶交互,其服務的穩(wěn)定性、數據的安全性不可忽視。在CodeIgniter框架中包含了一些重要的內部安全特性,如嚴格限制URI中的字符,系統初始化期間注銷所有全局變量,在生產環(huán)境中禁用PHP錯誤報告等,以降低系統被惡意數據入侵的風險。同時,我們也在平臺中使用了CodeIgniter框架的XSS過濾器對數據進行過濾,降低跨站腳本攻擊的風險;使用框架的表單驗證類以驗證、過濾和預處理數據,并在插入數據庫之前轉移所有數據。
此外,在站點配置階段,我們將CodeIgniter框架中system和application兩個重要的腳本文件夾放在網站根目錄以外的本地路徑下,使瀏覽器無法直接訪問這些文件,同時在主目錄中使用絕對路徑來引用這些腳本文件,以增強系統的安全性。
1. 用戶授權
在微信公共平臺中存在校園卡余額查詢、校園卡掛失等功能,需要與現有的校園信息系統進行數據對接,對接前提是該用戶已獲得公共數據庫賬號授權。在進行授權操作時,如果要求用戶通過微信對話來輸入賬號和密碼,則該授權信息將以明文的方式暴露在微信消息記錄中,導致嚴重的安全問題。
針對這一授權問題,平臺的解決方式是將用戶的OpenId進行SHA加密并儲存在User表中,當用戶選擇在微信平臺中綁定自己的公共數據庫賬號時,系統返回給用戶一個帶有SHA加密字符串的URI地址,用戶可以通過微信應用中的內置瀏覽器訪問該頁面。該頁面創(chuàng)建于平臺服務器中,并且整合了校園的CAS登錄驗證服務。用戶驗證成功后,系統將更新帶有該SHA加密字符串的用戶記錄,標記授權狀態(tài)。此后凡是平臺中涉及到與校園信息系統相關的任何操作,都可以通過User表中的授權狀態(tài)進行判斷和處理,從而實現微信賬號與公共數據庫賬號的安全綁定。
2. 系統響應速度

圖2 平臺消息處理流程
微信要求平臺服務器在收到微信服務器POST的數據后,必須在5秒鐘之內返回響應包,否則將不會返回給用戶任何信息。從前文可以明顯看出,平臺應用程序中包含了大量的流程判斷,其中一些流程需要調用外部接口,或者通過頁面采集來獲取相關內容,這些環(huán)節(jié)的響應時間有可能過長,從而影響到整個平臺在規(guī)定的時間內返回響應包。
該問題的解決分為兩個方面,一方面是通過優(yōu)化CodeIgniter框架中的加載項、優(yōu)化系統代碼來實現平臺本身的響應加速;另一方面是制定服務器策略,定時采集某些外部接口中的數據,將其儲存于系統自身的數據庫中。如在微信平臺實際運行中,用戶查詢空氣質量時常常無法得到回應,查找原因后發(fā)現問題在于提供數據的相關網站響應較慢,導致整體響應時長超過了5秒鐘。針對該情況,系統修改為每隔1小時定期采集該網站中的實時空氣質量數據,通過平臺數據庫直接向用戶返回數據,有效解決了該問題。
3. 自動聊天功能
為了增加微信平臺的交互趣味性,我們在平臺中添加了自動聊天功能,實現簡單的互動對話。目前網絡上有一些流行的聊天接口,如小i機器人、小黃雞等,但其中往往含有一些不良的聊天內容,不適宜用作高校官方賬號的聊天接口。為此平臺中編寫了一種學習模式,用戶可以通過輸入問題和回答來使系統學習該問答,如輸入“你好”,回答“你也好”等。由于問答的經驗都來自于用戶,因此同一個問題對應的回答是不盡相同的,系統將從回答中進行隨機抽取。用戶輸入越多的回答,在對話中出現的概率越大。
此外,不排除存在用戶在學習模式中惡意輸入不良內容的可能性。為此平臺使用了關鍵詞過濾及不良內容舉報機制,凡是用戶在聊天模式下發(fā)現違規(guī)內容,都可以直接回復關鍵詞舉報該內容。
通過自動聊天功能,校園用戶可以共享許多有價值的經驗,如“哪個自修教室最安靜”、“食堂哪個供餐點的飯菜味道不錯”等,使微信公共賬號從“一對一”的交流模式變?yōu)椤岸鄬Χ唷苯涣鳌?/p>
4. 結果網頁顯示
在查詢新聞、講座、通知等信息時,平臺返回的列表中包含了信息的標題、簡介和鏈接,用戶通過打開該鏈接來閱讀信息的全文。由于閱讀的環(huán)境為微信的內置瀏覽器,普通的網頁在該環(huán)境下需要手動放大才能看清文字,并且需要上下左右不斷移動頁面來瀏覽內容信息,用戶體驗較差,也較為耗費網絡流量。
針對該問題,華東師范大學網站群部署了一套公用移動化模板,使用響應式設計的方法,為網站群中每個站點的每個頁面生成了一份面向移動設備優(yōu)化的頁面,在微信公共平臺中返回的所有頁面都采用該模板對應的頁面地址。這樣無論在微信中瀏覽校級新聞、公告,還是來自任何院系網站的網頁內容,用戶都能夠獲得最佳的使用體驗。
華東師范大學微信公共平臺已于2013年5月正式開通,至今關注人數已超過5000人。微信平臺實現了校園信息化系統與社會化媒體的有機結合,方便了師生使用各種校內服務資源,拓展了學校信息宣傳工作在新媒體領域的影響力。在下一階段,我們將著眼于微信公共平臺與高校教學資源的結合,使其能夠進一步服務于學校的教學和科研工作。