新媒体前沿

首页 >> 新媒体前沿 >> 正文

高校微信平台简洁之道

来源:  作者:     日期:2014-03-22   

自从2012年8月华中科技大学推出首个国内高校官方微信后,越来越多的高校已陆续开通了微信公共账号。其中,除部分高校开发了专门的微信平台系统外,大部分高校都还停留在使用“关键词自动回复”的简单交互层面,即在微信提供的管理后台中设置多种关键词及其对应的回复内容,一旦用户输入了某个关键词,则返回其对应的预设内容。关键词自动回复能够实现一些初级的匹配功能,但无法实时查询和返回高校各个业务系统中的数据信息,也无法实现上下文交互,更无法深入使用微信公共平台提供的各种自定义功能。

本文梳理了当前高校微信公共平台的各种功能,以华东师范大学现有信息化应用系统作为数据基础,通过使用CodeIgniter敏捷开源框架开发富有交互性的微信公共平台,分析和阐述了平台关键功能实现过程中存在的问题,并提出相应的技术解决方案。


微信公共平台运行机制

微信公共平台的通讯路线可简单归纳为“用户-微信服务器-平台服务器-微信服务器-用户”,我们可以将每一次通讯视为一次交互过程,如图1所示。用户是交互过程的发起人,通过在微信程序中向公共账号发送消息来启动交互。微信服务器是交互的信息中转站,消息被直接发送至微信服务器,服务器再根据该公共账号所设置的模式类型来确定消息的处理方式。当该账号为简单的编辑模式时,微信将通过诸如关键词回复等功能对消息进行匹配,直接将匹配结果返回给用户。而当账号设置为开发模式时,微信服务器将把用户发送的消息以XML数据的形式发送至公共账号预设的接口,即平台服务器。平台服务器是交互的信息处理方,其核心是由公共账号管理者自主搭建的Web应用程序。平台服务器在接收到来自微信服务器的数据后,根据数据中包含的消息类型和关键词内容准备相应的回调格式和信息,并按照微信规定的消息格式返回响应数据。微信服务器在收到该响应数据后,再将其中的内容信息以规定的格式发送给用户,完成整个交互过程。微信公共平台开发的主要任务即搭建其中的平台服务器,创建Web应用程序来处理所有的信息请求任务,向微信服务器返回相应的数据内容。

微信公共平台的接口主要包含三大类。一类是接收用户消息接口,其中包含文本信息、图片信息、地理位置信息、链接信息等类型,平台服务器通过这些接口从微信服务器推送的数据中获取相应内容。另一类是回复用户消息接口,其中包含文本信息、图文信息和音乐信息等类型,平台服务器将根据回复消息的格式,选择相应的接口向微信服务器回调数据。第三类为事件推送接口,包含了用户的关注和取消关注两类事件接口,用于平台服务器向新近关注用户发送欢迎消息。

基于微信公共平台简洁的运行机制,我们选择了轻量化的CodeIgniter框架来作为平台的开发工具。CodeIgniter框架的优点是架构简单、配置灵活,拥有出色的运行性能,且其运营成本低、开发周期短,特别适合于高校自主开发微信平台。


基于CodeIgniter框架的平台设计

1. 设计模式

CodeIgniter框架是基于“模型-视图-控制器”的MVC模式的,我们在微信公共平台开发中也遵循了这一设计模式,以实现逻辑和表现层面的分离。其中,模型(Model)代表了数据结构,在本平台中主要表现为一个模型类,实现平台数据的读取、插入、更新、删除等功能。视图(View)代表了展示给用户的信息,即平台中展示给用户的各种网页,包含了用户授权的相关页面模板。控制器 (Controller) 是模型、视图和其他资源之间的中介,在本平台中主要用于调度各种数据,创建消息处理流程。由于微信平台不需要过多向用户展示网页,其数据也基本来自其他信息化系统的接口,因此本框架中的模型和视图类型都较为简单。平台的核心在于控制器,其主要功能都由控制器完成,其中包括消息的接收、判断、处理和回调等。

此外,平台将一些核心的功能类和常用函数抽离出来,分别创建对应的装载类(Libraries)和辅助函数类(Helpers),在运用时按需加载,以简化控制器中的功能代码,提高系统运行效率。在装载类中包含了网页HTML标签内容的采集、正则解析,以及模板解析等复杂的功能类库。在辅助函数中则包含了各种单独的函数,包括各种数据接口的连接、时间日期处理、敏感词过滤、单位换算等。

2. 数据库设计

平台采用MySQL数据库。该库中主要的数据有三种,分别是用户(User)、规则(Rule)和消息(Message)。User表中储存了每个微信用户的用户号(OpenId),以及上一次操作的状态记录、学号和工号信息等,用于实现用户的上下文交互,使用各种校内信息系统的授权功能。Message表中储存了用户向微信公共账号发送的所有消息,是平台消息的历史存档。Rule表中包含了管理员预设的消息响应规则,是平台消息处理流程的具体依据。

除以上三种数据外,数据库中还包含了实现各种平台功能所需的配置数据。如为“背单词”功能创建Dictionary表,以储存四六级单词数据;为“自动聊天”功能创建Talk表,以储存各种对话规则;为“自习教室查询”功能创建Classroom表,以储存常用的自习教室列表等。

3.数据的获取

平台有四种获取数据的方式。第一种方式是从平台数据库中直接获取数据,包括前文所述的单词、对话规则、自习教室列表等。第二种方式是从已有的校园信息系统接口中获取数据,如获取校园卡余额、拾卡记录、课程表、学期日历、校园新闻、通知公告、讲座报告等。第三种方式是从各种社会网站接口中获取数据,比如从中国天气网获取天气预报数据,从PM25.in获取空气质量数据等。第四种方式是对网页进行HTML采集,经过正则解析,获取特定标签中的内容,如通过教师个人主页系统查询教师的个人信息、根据关键字获取某研究方向对应的教师列表、查询图书信息等。

在以上四种数据获取方式中,第一种方式通过CodeIgniter框架的模型类进行实现,第二、三种方式通过辅助函数类实现,第四种方式通过装载类实现。数据交互格式主要为XML和JSON两种,其中JSON在精简数据流量方面优于XML,有助于缩短平台的响应延时。

4. 消息处理流程

在CodeIgniter框架的主控制器中定义了微信平台的消息处理流程,如图2所示。首先,在控制器中加载必要的装载类和辅助函数,获取来自微信服务器的推送数据,并解析数据中的用户微信号、消息类型和消息内容,将其记录到Message表。然后,从User表中查询是否存在当前的用户微信号记录,如果不存在则表示当前用户为新关注用户,将其OpenId信息写入User表,并从Rule表中获取欢迎信息,作为返回给微信服务器的数据内容。



图2 平台消息处理流程

当存在用户微信号记录时,系统提取该OpenId对应的历史操作记录,更新本次交互的信息记录,并进入按规则匹配的消息处理阶段。根据用户之前的操作记录,结合Rule表中的响应规则,系统将判断本次交互是否属于上下文对话。系统中的上下文对话包括校车查询、教师查询、自动聊天、背单词等,每当用户输入相应的关键字后,下一次对话即进入相应的情景模式。如此前用户曾输入过“校车”,则表示当前为校车查询情景模式,若本次输入的消息内容为“1”或“线路1”,则上下文对话有效,将从Rule表中获取第一种校车线路作为返回内容。如果当前输入的关键字不在情景模式规定的对话规则之内,则退出该情景模式,进入非上下文对话的规则匹配阶段。平台中每一条规则都对应了多个关键字,如输入“新闻”、“校园新闻”、“要闻”等词语都将获取门户网站系统中的新闻列表,输入“捡卡”、“拾卡”、“丢卡”等词语都将调用校园卡的拾卡记录查询接口等。在一些规则中我们采用了宽松的匹配模式,如当用户输入的消息中含有“看病”、“生病”、“医院”等字样时,均返回校园就诊的相关信息,这样,用户不管是输入“我想看病”,还是“我生病了,怎么办?”这样难以精确预测的描述语时,都能匹配到相应的响应结果。

在遍历了Rule表中的所有规则后,如果关键字仍然没有匹配结果,则进入网站匹配阶段,即通过网站群数据接口,搜索所有校园网站中包含该关键字的信息条目。华东师范大学网站群中目前运行了包括门户网站、二级院系部门网站在内的近100个校园站点,全面涵盖了校内的新闻、公告、教学、科研等信息。通过这一阶段的匹配,能够实现强大的校内信息聚合功能。如用户输入“校友返校”,在Rule表没有对应匹配规则的前提下,平台将从网站群数据接口中获取所有含有该关键字的信息,其中包含了校级层面和学院层面的各种校友返校信息。

当网站匹配阶段仍然没有符合的匹配结果时,系统将随机返回给用户一些使用建议,如提供平台的使用帮助,询问用户是否需要背单词,是否需要进入聊天模式等。系统还将随机向用户发送一些简单的调查问题,如询问用户是否是校友,所在部门是哪个等,以此逐步完善用户数据信息,为后续的平台功能开发打下基础。

通过以上的消息处理,系统已经准备好了返回给用户的信息。最后,系统按照信息的类型准备相应的XML结构,并向微信服务器返回响应数据包,完成整个交互过程。其中,大部分情况下信息以文本类型打包,即在微信中直接返回一段文字对话。在处理新闻列表、讲座列表、教师名录列表等多条信息时,需要使用图文模板的XML结构,以便在用户微信界面中以列表形式显示这些信息。在少数情况下,系统会返回音频信息,此时需要使用音乐模板返回响应数据包。

5. 安全性

微信公共平台由于带有官方账号的权威效应,且直接面向用户交互,其服务的稳定性、数据的安全性不可忽视。在CodeIgniter框架中包含了一些重要的内部安全特性,如严格限制URI中的字符,系统初始化期间注销所有全局变量,在生产环境中禁用PHP错误报告等,以降低系统被恶意数据入侵的风险。同时,我们也在平台中使用了CodeIgniter框架的XSS过滤器对数据进行过滤,降低跨站脚本攻击的风险;使用框架的表单验证类以验证、过滤和预处理数据,并在插入数据库之前转移所有数据。

此外,在站点配置阶段,我们将CodeIgniter框架中system和application两个重要的脚本文件夹放在网站根目录以外的本地路径下,使浏览器无法直接访问这些文件,同时在主目录中使用绝对路径来引用这些脚本文件,以增强系统的安全性。


主要问题及其解决方案


1. 用户授权

在微信公共平台中存在校园卡余额查询、校园卡挂失等功能,需要与现有的校园信息系统进行数据对接,对接前提是该用户已获得公共数据库账号授权。在进行授权操作时,如果要求用户通过微信对话来输入账号和密码,则该授权信息将以明文的方式暴露在微信消息记录中,导致严重的安全问题。

针对这一授权问题,平台的解决方式是将用户的OpenId进行SHA加密并储存在User表中,当用户选择在微信平台中绑定自己的公共数据库账号时,系统返回给用户一个带有SHA加密字符串的URI地址,用户可以通过微信应用中的内置浏览器访问该页面。该页面创建于平台服务器中,并且整合了校园的CAS登录验证服务。用户验证成功后,系统将更新带有该SHA加密字符串的用户记录,标记授权状态。此后凡是平台中涉及到与校园信息系统相关的任何操作,都可以通过User表中的授权状态进行判断和处理,从而实现微信账号与公共数据库账号的安全绑定。

2. 系统响应速度

微信要求平台服务器在收到微信服务器POST的数据后,必须在5秒钟之内返回响应包,否则将不会返回给用户任何信息。从前文可以明显看出,平台应用程序中包含了大量的流程判断,其中一些流程需要调用外部接口,或者通过页面采集来获取相关内容,这些环节的响应时间有可能过长,从而影响到整个平台在规定的时间内返回响应包。

该问题的解决分为两个方面,一方面是通过优化CodeIgniter框架中的加载项、优化系统代码来实现平台本身的响应加速;另一方面是制定服务器策略,定时采集某些外部接口中的数据,将其储存于系统自身的数据库中。如在微信平台实际运行中,用户查询空气质量时常常无法得到回应,查找原因后发现问题在于提供数据的相关网站响应较慢,导致整体响应时长超过了5秒钟。针对该情况,系统修改为每隔1小时定期采集该网站中的实时空气质量数据,通过平台数据库直接向用户返回数据,有效解决了该问题。

3. 自动聊天功能

为了增加微信平台的交互趣味性,我们在平台中添加了自动聊天功能,实现简单的互动对话。目前网络上有一些流行的聊天接口,如小i机器人、小黄鸡等,但其中往往含有一些不良的聊天内容,不适宜用作高校官方账号的聊天接口。为此平台中编写了一种学习模式,用户可以通过输入问题和回答来使系统学习该问答,如输入“你好”,回答“你也好”等。由于问答的经验都来自于用户,因此同一个问题对应的回答是不尽相同的,系统将从回答中进行随机抽取。用户输入越多的回答,在对话中出现的概率越大。

此外,不排除存在用户在学习模式中恶意输入不良内容的可能性。为此平台使用了关键词过滤及不良内容举报机制,凡是用户在聊天模式下发现违规内容,都可以直接回复关键词举报该内容。

通过自动聊天功能,校园用户可以共享许多有价值的经验,如“哪个自修教室最安静”、“食堂哪个供餐点的饭菜味道不错”等,使微信公共账号从“一对一”的交流模式变为“多对多”交流。

4. 结果网页显示

在查询新闻、讲座、通知等信息时,平台返回的列表中包含了信息的标题、简介和链接,用户通过打开该链接来阅读信息的全文。由于阅读的环境为微信的内置浏览器,普通的网页在该环境下需要手动放大才能看清文字,并且需要上下左右不断移动页面来浏览内容信息,用户体验较差,也较为耗费网络流量。

针对该问题,华东师范大学网站群部署了一套公用移动化模板,使用响应式设计的方法,为网站群中每个站点的每个页面生成了一份面向移动设备优化的页面,在微信公共平台中返回的所有页面都采用该模板对应的页面地址。这样无论在微信中浏览校级新闻、公告,还是来自任何院系网站的网页内容,用户都能够获得最佳的使用体验。

华东师范大学微信公共平台已于2013年5月正式开通,至今关注人数已超过5000人。微信平台实现了校园信息化系统与社会化媒体的有机结合,方便了师生使用各种校内服务资源,拓展了学校信息宣传工作在新媒体领域的影响力。在下一阶段,我们将着眼于微信公共平台与高校教学资源的结合,使其能够进一步服务于学校的教学和科研工作。