杨 帆,沈来信,2
(1.黄山学院 信息工程学院,安徽 黄山 245041;2.同济大学 电子与信息工程学院,上海 201804)
基于SS2H的微信公众平台账号设计
杨 帆1,沈来信1,2
(1.黄山学院 信息工程学院,安徽 黄山 245041;2.同济大学 电子与信息工程学院,上海 201804)
微信公众平台具有良好的信息发布接口,提供了友好的交互界面。开发者可以使用XML与微信服务器进行数据传输,调用第三方接口JSON和网络数据抓取技术提供给微信关注者许多实用的功能,用户可以通过导航查询相关信息。系统基于SS2H框架搭建,采用标准的MVC设计模式,其中Spring实现业务层,用于处理复杂的业务逻辑。Struts2作为控制层,管理所有的网络请求和功能实现。Hibernate为持久化层,用来控制和管理数据。系统提供天气查询、快递查询、音乐搜索、历史上的今天查询、电影查询等功能。随着微信接口的不断完善和个性化定制功能的增加,微信平台的应用会逐渐普及。
微信;第三方接口;SS2H;MVC;数据抓取
随着微信用户量的日益增加,基于微信平台的开发具有一定的意义和市场价值[1-2]。一个优秀的微信公众账号可以有效地推广企业文化,为用户提供实用而便捷的功能。微信提供给开发者的规范和接口越来越多,如数据统计接口、微信小店接口、微信卡券接口等,通过实现这些接口就可以实现相应的功能。开发者只需要遵循相应接口规范,通过简单代码调用这些接口,就能完成很多复杂而实用的功能。
微信公众账号实质上是一种集成跨平台应用开发[3-4],一个微信公众账号可以集成很多实用的功能,并且这种开发不需要考虑平台的不同。用户只要安装了微信,就可以通过关注账号来获取请求,微信公众账号可以为用户提供很多实用的功能。
网页数据抓取是通过某种方式去网页上抓取需要的数据。网页数据抓取技术分为两种,一种是模拟登陆,通过模拟登陆系统获取返回的数据,例如某些需要登陆之后才能访问的信息,这个时候就得使用模拟登陆方式。还有一种是URL模拟登陆,修改URL参数然后登陆就可以获取返回的数据。不同的情况需要使用不同的正则表达式去提取。
例如电影查询功能,要想获得豆瓣电影排行榜,获取URL,对其进行修改,然后向服务器进行模拟提交,服务器就会返回结果网页,把网页上面的所有元素通过IO流的形式转换成字符串,通过两次正则表达式做提取,通过第一次正则式筛选掉不需要的信息,第二次正则式在筛选后的信息里面做精细提取,获取最终结果。
微信公众账号分为服务号、订阅号、企业号。不同类型的公众账号具备不同的功能权限,订阅号更适合于传播信息,为用户提供信息支持,每天都可以群发一条信息。服务号与企业号则适合更加复杂的功能,可以为用户提供更多实用的功能。文中系统基于服务号,使用微信服务器提供的接口,实现实用而复杂的功能,为用户提供方便。
SS2H架构中主要采用了MVC(Model,View,Controller)设计模式[5-8]。其中,Model负责数据模型,包括表的建设,分两层:一层是数据实体Bean,即每个表对应一个类(表名对应类名,表字段对应类属性等);第二层是数据实体的操作,包括add、delete和modify等,就是对表的记录的管理。然后View层就是JSP页面,负责前台页面的显示,所有动态内容都是从数据库表中读取。Controller是控制层,负责接收后台管理的修改请求,然后调用model的第二层对数据库进行修改。
张宏等[9]通过对微信的网络结构、拓扑结构进行分析,总结了微信平台的无标度和小世界性质。邵洪雨[10]对短文本聚类方法进行了研究,采用加窗方式,对窗口内短文本采用层次聚类方法进行聚类,得到微簇,并采用PageRank排序算法对类簇中的信息进行排序。Feng Puchao[11]结合四种微博,提出中文微博主题模型,挖掘用户与主题之间的关系、热门话题下的主题,并使用Gibbs抽样技术对模型进行求解。刘闯[12]利用图像识别技术的iOS人脸识别系统,使用Eigenfaces、Fisherfaces方法和LBPH方法,在ORL和Yale人脸库上进行了对比实验。刘晓智等对微信平台编辑、公众账户开发和云平台建设进行了探讨[13-15]。徐雅斌等[16]利用微博用户之间的相关性,使用逻辑回归模型对用户进行打分排序,提供个性化用户推荐等。周小平等[17]以关系为网络节点,以关注关系之间是否有共同用户为边,构建R-C模型,探讨微博用户社区发现的方法。孙怡帆等[18]提出基于共同关注和共同粉丝的微博用户相似度,定义其模块化函数,得到社区发现方法。陈羽中等[19]提出基于老化理论的词生命值计算模型用于热词抽取,并基于热词间的相关性构建贡献网络,设计多标签传播聚类算法用于词贡献网络的热词聚类,获得热点话题集。
利用智能手机的摄像功能,可以有效获取人脸图像,借助人脸识别接口,可以有效实现人脸识别功能。借助微信平台,方便了企业的公众账户宣传与信息发布,用户还可以获取一些服务网站的推荐信息,如电影信息、物流信息、天气信息、四六级信息、销售信息、餐饮信息和特定公众号信息等。
要接入微信公众平台,首先要对接微信服务器。需要完成以下三个步骤:
(1)登陆微信公众平台官网,在管理页面进行数据配置填写。需要填写服务器URL(对接用户的项目)、Token(校验码)和EncodingAESKey(控制消息的加密与解密)。
(2)验证服务器有效性,在对接服务器时,微信服务器每次都会先进行有效性校验,通过校验后才会发送请求。微信平台以GET方式向填写的URL发送请求。
(3)验证URL有效性成功后即接入生效,成为开发者。可以在公众平台中申请认证,认证成功的服务号将获得许多接口权限。此后用户每次向公众号发送消息或者产生自定义菜单点击事件时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,然后开发者可以依据自身业务逻辑进行响应,例如回复消息等。
系统数据处理流程如下:微信客户端输入数据,通过网络传输给微信平台,微信平台接收数据。再通过网络将数据传输给另外的服务器,这个服务器架设了用户的系统代码。用户系统接收到数据之后,会对数据进行不同的业务处理,在处理的过程中会通过网络获取需要的数据(第三方接口或者网络数据抓取),将这些数据进行整合处理,最后返回给用户,处理流程见图1。
该系统一共包含七个功能模块,分别为历史上的今天查询模块、电影查询模块、智能翻译模块、人脸识别模块、快递查询模块、音乐搜索模块和天气预报模块,见图2。
图1 数据处理流程图
图2 系统功能模块图
(1)微信服务器对接:用户提交接口配置信息后,服务器会将四个参数(微信签名signature,时间戳timestamp,随机数nonce,随机字符echostr)传输给用户。
根据加密流程,第一步是字典排序,第二步为拼接字符串,第三步为sha1加密,第四步则跟signature对比,通过三目运算来判断,如果一致则返回这个字符串,否则返回false。主要算法过程如下:
Public static boolean checkSigna (
Signa,timestamp,nonce){
para={token,timestamp,nonce};
arrays.sort (para);
content=para[0].concat(para[1],concat[2]);
try{MD=MessageDigest.getInstance(sha1);
digest=MD.digest(content.getBytes());
cipher=byteToStr(digest);
} catch(NoSuchAlgorithmException){}
Retrun cipher!=null?cipher.equal(signa):false;
}
(2)电影查询功能实现。
①通过HttpURLConnection方式与URL建立连接,httpUrlConn.getInputStream()可以返回一个包含了页面数据的输入流,通过字符缓冲输出流的形式转成字符串。
②使用正则式提取信息:在接收到的输出流中提取电影名称。提取算法如下:
Pattern pattern=Pattern.compile(“
()(.{0,5})(class=)(.{0,3})(title)
(.{0,5})(>)([u4E00-uqFA5]{2,20})”);
Matcher m=pattern.matcher(sb.toString());
While (m.find()){
sb2.append(m.group()).append(“ ”);
}
String str=sb2.toString().replace(“span
Class=”title”>”, “ ””);
String[] strArr=strMessage.split(“ ”);
③提取电影图片URL的正则式:页面元素较复杂,需要采取两次正则式的形式提取所需要的数据。提取后把无关元素转换成空字符串,然后保存到图片URL数组,提取算法如下:
m2=pat2.matcher(sb.toString());
while (m2.find()){
sbP.append(m2.group().append(“ ”));
}
buf3=new StringBuffer();
pat3=Pattern.compile(“(src=)(.{0,200})(class)”);
ma3=pat3.matcher(sbP.toString());
while (m3.find()) { buf3.append (m3.group()).append(“ ”);
}
Sp=buf3.toString().replace(“src=””,””).replace(“class”,””).replace(“”,””);
pic=sp.split(“ ”);
其他如使用正则式提取跳转页面的URL、抓取元素存储到数据库中、数据存储的定时器设置以及查询电影功能返回给用户的图文格式等都不再一一叙述。
(3)与服务器的数据传递实现。
①解析Xml请求:使用dom4j解析XML。从request里面获取带有参数的输入流,从中先提取根节点,再通过遍历的方式提取子节点。最后把这些数据存入map集合,可以通过key来取value,解析算法如下:
Public static Map
map=new HashMap.getInputStream();
Try{ in=request.getInputStream();
SAXReader sr=new SAXReader();
Document dm=sr.read(in);
root=document.getRootElement();
elements=root.elements();
for (Element e: elements){
map.put(e.getName(),e,getText());
}
In.close(); in=null;
}catch(Exception el){}
}
②组装XML:与微信服务器的交换全部采用XML的方式,组装XML采用Xstream。需要重写writeText()方法,方法如下:
Private static XStream xS=new XStream(new XppDriver(){
Public HierarchicalStreamWriter createWriter (Writer out){
retrun new PrettyPrintWriter(out){
boolean cdata=true;
public void startNode(String name, Class clazz){super.startNode(name,clazz);}
protected void writeText(QuickWriter writer, String text){
if(cdata){
writer.writer(“
writer.writer(text);
writer.writer(“)]>”);
else{ writer.writer(text);}
}};
};
});
(4)人脸识别功能实现。
通过调用Face++提供的人脸识别接口,传输相对应的数据模型。通过接口的业务处理,返回处理后的数据模型,双方数据交换采用Json格式。获取接口返回的数据之后,需要解析Json然后重组成Xml的格式发送给微信服务器,微信服务器再转发给用户,见图3。
图3 人脸识别功能设计流程图
①首先得注册一个开发者用户,然后获取对应的API key和API secret。通过key和secret就可以调用Face++提供的接口,调用方式采用http的方式。
②封装与接口传输的Face实体:当调用接口成功时,该实体返回给用户,属性如下:
Public class face implements Comparable
private String faceId; //ID
private int ageValue; //年龄估计值
private int ageRange; //年龄区间
private String genderValue; //性别
private double genderConfidence;//可信度
private String raceValue; //人种
private double raceConfidence;//可信度
private double smilingValue;//微笑程度
private double centerX;//人脸框中心X
private double center; //人脸框中心Y
}
③组装请求接口地址:当调用Face++提供的接口,图片可以直接上传微信发送的URL,Face++服务器会直接从URL中提取资源。上传的URL地址需要编码成UTF-8,避免乱码:
String queryUrl=”http://apicn.faceplusplus.com/v2/detection/detect?url=URL&api_secret=API_SECRET&api_key=API_KEY”;
queryUrl=queryUrl.replace(“URL”,java.net.URLEncoder.encode(picUrl,”UTF-8”));
queryUrl=queryurl.replace(“API_KEY”,
“fab603c6710311ac8347dfc1b8eef6a6”);
queryUrl=queryurl.replace(“API_SECRET”,
“2bc0cuvfuFURw50rc17izUBaEpMtN04”);
④接口数据解析:需要将接收到的Json格式数据转换成JSONArray,遍历这个数组从中提取单个实体对象。把这些数据全部传给Face交互对象中,放到List中并排序。得到faceList数据源:
String json=httpRequest(queryUrl);
Jsona=JSONObject.fromObject(json).getJSONArray(“face”);
For (int i=0; i faceo=jsona.get(i); attro=faceo.getJSONObject(“attribute”); poso=faceObject.getJSONObject(“position”); Face face=new Face(); Face.setFaceId(faceO.getString(“face_id”)); face.setAgeValue(attro.getJSONObject(“age”).getInt(“value”)); face.setAgeRange(attro.getJSONObject(“age”).getInt(“range”)); face.setGenderValue(attro.getJSONObject(“gender”).getString(“value”)); face.setGenderConfidence(attro.getJSONObject(“gender”).getString(“confidence”)); face.setRaceValue(attro.getJSONObject(“race”).getString(“value”)); face.setRaceConfidence(attro.getJSONObject(“race”).getString(“configence”)); face.setSmilingValue(attro.getJSONObject(“smiling”).getString(“value”)); face.setCenterX(poso.getJSONObject(“center”).getDouble(“x”)); face.setCenterY(poso.getJSONObject(“center”).getDouble(“y”)); faceList.add(face);} Collections.sort(faceList); ⑤中英文转换:接口返回的数据信息都是英文的,需要进行调整。如性别转换(Male转换成男性,Female转换成女性)、人种信息转换等。然后对这些信息重组,返回给微信服务器,转换算法如下: private static String genderConvert (String gender){ String result=“男性”; if (“Male”.equals(gender)) result=“男性”; else if (“Female”.equals(gender)) result=“女性”; retrun result; } 其他功能如天气查询、快递查询、历史上的今天查询、智能翻译、音乐搜索等的实现,不再一一叙述。 当用户触发“电影查询”按钮的时候会弹出消息提示,提示用户如何操作。系统自动返回豆瓣电影排行榜,当点击某个影片时,会显示其详细内容介绍,点击观看时会自动跳转到电影播放地址,见图4。 图4 电影查询界面 使用MVC设计模式时,View视图层主要用来跟微信平台进行对接和数据通讯;Controller控制层实现了功能模块核心细线,如调用第三方接口完成数据通讯、网页数据抓取等;Model模型曾主要负责数据实体的管理与维护。通过Hibernate框架来管理数据,控制数据的增删改查。保存的时候Hibernate会将游离的对象转换成持久化对象,删除的时候会将持久化对象转换成游离的对象,通过对对象的状态修改来控制数据的变化等。 集成应用会越来越广泛地使用到,集成应用不需要安装一个个应用软件,只需按照网络程序提供的接口规范,继承其接口生成一个实例,就可以使用到该程序的功能,达到快速实现的目的。一个微信公众账号,支持所有的设备,不管是IOS还是安卓系统,使用效果 是一样的。微信服务器提供了这种跨平台的公共平 台,用户可以借助微信平台开发出很多跨平台的应用。 [1] 钟志勇,何威俊,冯煜博.微信公众平台应用开发实战[M].第2版.北京:机械工业出版社,2014. [2] 柳 峰.微信公众平台应用开发:方法、技巧与案例[M].北京:机械工业出版社,2014. [3] 易 伟.微信公众平台服务号开发:揭秘九大高级接口[M].北京:机械工业出版社,2014. [4] 刘 捷.微信公众平台企业应用开发实战[M].北京:电子工业出版社,2015. [5] 王 瑾.基于SSH框架下的校园网上交易平台[D].成都:电子科技大学,2014. [6] 师温馨.基于SSH框架的电子商务购物网站的研究与设计[J].电子测试,2014(8):10-12. [7] 张晓孪.基于SSH的团购网站的设计与实现[J].电子设计工程,2012,20(21):122-125. [8] 米奕杭.基于SSH框架的网络购物电子商务平台的设计与实现[D].成都:四川师范大学,2010. [9] 张 宏,李 杰.复杂网络的微信网络信息传播研究[J].科学技术与工程,2014,14(17):244-247. [10] 邵洪雨.短文本聚类及聚类结果描述方法研究[D].大连:大连理工大学,2014. [11] Feng Puchao.Topic mining for Chinese microblog based on CMB-LDA model[D].Hangzhou:Zhejiang University,2014. [12] 刘 闯.基于人脸识别的iOS应用研究[D].大连:大连理工大学,2014. [13] 刘晓智,胡 燏.浅析微信公众平台下编辑模式与开发模式的异同[J].计算机光盘软件与应用,2014,17(11):98-98. [14] 仲 媛,涂庆华.浅谈高校微信公众账号[J].计算机光盘软件与应用,2014,17(13):219-220. [15] 孙 红.基于微信的校园信息云平台建设研究[J].计算机光盘软件与应用,2014,17(11):225-226. [16] 徐雅斌,石伟杰.微博用户推荐模型的研究[J].电子科技大学学报,2015,44(2):254-259. [17] 周小平,梁 循,张海燕.基于R-C模型的微博用户社区发现[J].软件学报,2014,25(12):2808-2823. [18] 孙怡帆,李 赛.基于相似度的微博社区网络的社区发现方法[J].计算机研究与发展,2014,51(12):2797-2807. [19] 陈羽中,方明月,郭文忠.面向微博热点话题发现的多标签传播聚类方法研究[J].模式识别与人工智能,2015,28(1):1-10. Design of WeChat Public Platform Account Based on SS2H YANG Fan1,SHEN Lai-xin1,2 (1.School of Information Engineering,Huangshan University,Huangshan 245041,China;2.School of Electronics and Information Engineering,Tongji University,Shanghai 201804,China) WeChat public platform has good information publishing connector,and provides friendly interactive interface.The developers can use XML to transfer data with WeChat server,and provides followers many practical functions by using third interfaces JSON and network data capture technology,and users can query information through navigation.The system is constructed based on SS2H framework,which adopts standard MVC design pattern.Spring layer deals with complex business logic.As a control layer,Struts2 manages all network request and function realization.Hibernate layer as object persistence is used to control and manage the data.The system can provide many query functions such as weather,express,music,today in history,movies and so on.With the complete of WeChat connector and improvement of personalized function,applications based on WeChat platform will gradually popularize. WeChat;third interface;SS2H;MVC;data capture 2015-04-28 2015-08-03 时间:2016-01-04 文化部科技创新项目(WHBKJCXXM20142554);文物局文化保护和技术研究课题(2013-YB-SQ-175);国家级大学生创新训练计划项目(201310375022);省级大学生创新训练计划项目(AH2014103753135,AH2014103753136);黄山学院校级科研项目(2015 xhwh012) 杨 帆(1980-),女,硕士,讲师,CCF会员,研究方向为数据挖掘与软件工程;沈来信,博士,副教授,CCF会员,研究方向为云计算与大数据。 http://www.cnki.net/kcms/detail/61.1450.TP.20160104.1453.018.html TP39 A 1673-629X(2016)01-0195-05 10.3969/j.issn.1673-629X.2016.01.0425 系统运行效果
6 结束语