当前位置:
文档之家› 图书馆微信机器人的研究与应用_罗涛
图书馆微信机器人的研究与应用_罗涛
// 将加密后的字符串与 signature 的值进行 Node("MsgType").InnerText;
比较
string Content = rootElement.SelectSingleNode
if (tmpStr == signature)
("Content").InnerText;
{
……
图 1 图书馆微信机器人工作模式
2.2 系统架构 系统采用四层架构设计,分别是表示层、
应用层、业务层和数据层,如图 2 所示。表示 层就是指微信客户端,读者可以通过智能手机 或平板电脑等移动终端进行登录。应用层主要 由 微 信 服 务 器 构 成, 负 责 将 读 者 的 消 息 转 换 为 HTTP 请求再通过公众平台的消息接口发送 到业务层。业务层用于机器人进行业务逻辑处 理,负责对应用层的请求作出响应,通过消息 解释器对请求进行分析,根据请求的类型分发 到不同的处理器,再由处理器调用数据访问接 口对数据层中的数据进行查询、添加和修改等 操作。数据层由本地数据库和图书馆业务系统 数据库组成,负责数据的存储、组织和管理。 2.3 功能模块
nonce 和 echostr 值
行下一步处理,如果是非文本类消息则回发一
String signature = HttpContext.Current. 条报错消息;③对于文本类消息要判断其合法
Request.QueryString["signature"];
性,如果合法则进一步判断消息的类型,如果
图书馆微信机器人的主要功能就是接收读 者发送的消息并进行智能化的处理,最后将结 果回发给读者。因此将系统的功能划分成“机 器人初始化”、“消息处理”和“数据库管理” 三个模块。
图 2 图书馆微信机器人系统架构
(1)机器人初始化:机器人跟公众平台的 信息交互是通过特定接口完成的,只有将机器 人的 Web 应用接口与公众平台的消息接口进行 绑定,两者之间才能进行正常的通信。
1 图书馆微信机器人的研究现状
微信公众平台是一个开放的平台,提供强 劲的 API 接口技术,公众号可根据需要在自身
的服务器上开发和接入相关应用,如自定义菜 单、对接相关业务系统等。公众平台的这些特 性催生出了微信机器人。微信机器人就是指利 用微信公众平台提供的接口通过一定的数据逻 辑和数据库实现在微信平台上的智能对话 [3]。 微信机器人可为读者提供更多、更全面且更方 便 快 捷 的 移 动 服 务 内 容, 例 如 可 接 入 图 书 馆 OPAC 系统、读者管理系统、特色数据库甚至 阅览座位管理系统等应用。
进行校验,校验成功则原样返回 echostr 参数内 息、消息的类型、读者的微信号和机器人的微
容,接口绑定成功,否则绑定失败 [5]。
信号等内容封装成 XML 格式的数据包并发送
关键代码:
给微信机器人;②机器人在接收到数据后从中
// 获取 GET 请求中的 signature、timestamp、 提取出封装前的信息,如果是文本类消息则进
58 ·新技术应用·
图书馆杂志(2014年第11期 总第283期) Library Journal(Vol.33.No.11)
// 判断消息类型并对文本类消息进行处理 if (MsgType == "text") {
order mGet = new order(); // 自定义消息 处理类
int flag = mGet.Reg(Content); // 判 断 消 息合法性并返回类型编号
其中 signature 参数是微信加密签名,它结合了 献检索”的 WAP 网站地址导航;维护类的消
已配置的 Token 值和请求中的 timestamp 参数、 息用于读者留言以及馆员扩充知识库。消息处
nonce 参数。机器人通过检验 signature 对请求 理的工作流程:①微信服务器将读者发送的消
57
和权限验证等操作,验证通过后再根据消息的
// 如 果 值 相 同 则 返 回 echoStr 参 数 的 值,
类型进行分类处理,同时也要对消息执行中的 绑定成功
各类异常情况做出相关处理。
HttpContext.Current.Response.Write
(3)数据库管理:包括读者信息的管理, (echoStr);
通 过 在 微 信 公 众 平 台 上 进 行 搜 索, 有 近 30 家国内高校图书馆注册了公众号。其中绝 大部分图书馆主要是利用公众平台推送一些本 馆的信息资讯,例如北京大学图书馆、中国人 民大学图书馆和北京师范大学图书馆等;也有 一小部分图书馆除了推送信息外,还提供了一 些交互和查询的功能,也就是具有了机器人的 自动应答功能,例如清华大学图书馆提供了本
Server 2005。
识别。机器人会自动判断消息的合法性,并根
3.1 机器人初始化
据消息的类型进行分类响应。目前机器人所能
机器人初始化实际上就是一个接口绑定的 识别的消息可分为“验证”、“资讯”、“查询”、
过程。具体的步骤是:在微信公众平台上配置 “导航”和“维护”五种类型。验证类消息主
机器人接口 URL 地址和用作生成签名的 Token 要用于读者身份信息的绑定、解绑以及获取个
Array.Sort(ArrTmp);
XmlDocument doc = new XmlDocument();
String tmpStr = String.Join("", ArrTmp);
doc.LoadXml(postStr);
// 对字符串进行 sha1 加密
// 提取封装前的信息
tmpStr = FormsAuthentication.HashPassword
(2)消息处理:机器人只能处理特定格式 的消息,而读者发送过来的消息却有很多不确 定性。因此接收到消息后首先要进行语法检查
罗 涛 朱 莹:图书馆微信机器人的研究与应用 Luo Tao, Zhu Ying: Research and Application of Library WeChat Robot
罗 涛 朱 莹:图书馆微信机器人的研究与应用 Luo Tao, Zhu Ying: Research and Application of Library WeChat Robot
55
图书馆微信机器人的研究与应用
罗 涛(东南大学图书馆) 朱 莹(中国人民解放军理工大学)
摘 要 随着使用微信的读者数量不断增加,越来越多的图书馆利用微信开展移动服务。在对微 信公众平台研究的基础上,提出了一种图书馆微信机器人的设计方案。详细介绍了机器人的设计 和实现过程,对接口绑定、消息处理和数据管理等关键技术进行了详细的阐述,最后分析了系统 存在的问题并提出了改进方案。
56 ·新技术应用·
图书馆杂志(2014年第11期 总第283期) Library Journal(Vol.33.No.11)
馆常用信息、图书及个人借阅情况以及热门期 刊与最新文章信息等内容的查询;厦门大学图 书馆提供了公告、讲座、图书和座位等信息的 查询;南京大学图书馆提供了读者信息绑定功 能,读者将证件号与微信号绑定后,就可以进 行图书查询、借阅和续借等操作;上海交通大 学图书馆和华中科技大学图书馆提供的功能都 是以菜单的形式展现给读者的,其中前者提供 了非常多的功能,包括借阅信息查询、讲座预 约、图书荐购、图书检索、文章检索、期刊导 航和常见问题等。东南大学图书馆也利用微信 公众平台进行了微信机器人的开发,一方面锁 定了读者的需求,让读者主动“上门”关注, 提高读者对图书馆公众号的依赖性;另一方面
0 引言
微信是腾讯公司于 2011 年初推出的一款 快速发送文字和照片、支持多人语音对讲的手 机聊天软件 [1]。2012 年 8 月腾讯公司新增微信 公众平台模块,通过这一平台,个人和企业都 可以打造一个微信公众号,发布自己的信息和 资讯。用户通过关注微信公众号能够获得相关 推送消息,方便阅读和信息获取。截至 2013 年 11 月微信注册用户量已经突破 6 亿,而微 信公众平台的用户数量也达到了 200 万 [2]。在 这一背景下,使用微信的图书馆读者数量也在 不断增加,越来越多的图书馆利用微信和微信 公众平台开展移动服务。
也将图书馆公众号由一个媒体型的消息工具转 化成提供服务的产品。
2 系统设计
2.1 工作模式 如图 1 所示,读者通过移动终端上的微信
客户端向公众号发送一条消息,客户端会首先 向微信服务器发送一个请求,公众平台的消息 接口捕捉到这个请求后会将请求的内容进行封 装,然后向微信机器人服务端发送一个 HTTP 请求,机器人服务端的 Web 应用接口接受请求 后会对其中的内容进行解码,根据解码获得的 消息内容进行分类处理,最后将结果再通过公 众平台的消息接口转发给读者 [4]。
值,微信服务器为了验证 URL 的有效性会发送 人相关信息;资讯类消息用于获取图书馆的最
GET 请求到填写的 URL 上。GET 请求会携带四 新资讯信息;查询类消息用于“图书馆 FAQ”
个 参 数 signature、timestamp、nonce 和 echostr, 的查询;导航类消息用于“书目检索”和“文
本地数据的维护以及日志信息管理等。
HttpContext.Current.Response.End();
}
3 系统实现
3.2 消息处理
系统基于 平台采用 C# 语言开发。
消息是读者与机器人交流的桥梁,读者发
开发工具 Visual studio 2010,数据库使用 SQL 送的消息必须lement = doc.Document
ForStoringInConfigFile(tmpStr, "SHA1");
Element;
tmpStr = tmpStr.ToLower();