楊 帆,沈來信,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 結束語