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两个重要的脚本文件夹放在网站根目录以外的本地路径下,使浏览器无法直接访问这些文件,同时在主目录中使用绝对路径来引用这些脚本文件,以增强系统的安全性。
特别声明:本站注明稿件来源为其他媒体的文/图等稿件均为转载稿,本站转载出于非商业性的教育和科研之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。