微信公眾平臺開發(fā)技術(shù)(第四章)_第1頁
微信公眾平臺開發(fā)技術(shù)(第四章)_第2頁
微信公眾平臺開發(fā)技術(shù)(第四章)_第3頁
微信公眾平臺開發(fā)技術(shù)(第四章)_第4頁
微信公眾平臺開發(fā)技術(shù)(第四章)_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

《微信公眾平臺技術(shù)》第4章消息的接收與響應(yīng)人民郵電出版社工業(yè)和信息化“十三五”高職高專人才培養(yǎng)規(guī)劃教材能力CAPACITY要求掌握微信公眾平臺消息的流程及其分類。掌握接收與回復(fù)消息的方法。掌握聊天機器人及其開發(fā)流程消息交互流程接收普通用戶消息接收事件推送回復(fù)消息聊天機器人4.1接收普通用戶消息

4.1.1封裝接收消息結(jié)構(gòu)

微信公眾號能夠接收普通用戶發(fā)送的6種格式的消息,包括文本消息、圖片消息、語音消息、視頻消息、小視頻消息、地理位置消息和鏈接消息。當用戶向公眾號發(fā)送消息時,微信服務(wù)器將消息以XML格式通過POST的方式發(fā)送到填寫的URL上。開發(fā)者文檔上定義了每種普通消息類型的結(jié)構(gòu),不難發(fā)現(xiàn)每種類型的消息都包含參數(shù)ToUserName、FromUserName、CreateTime、MsgType與MsgId。4.1接收普通用戶消息

4.1.1封裝接收消息結(jié)構(gòu)

參數(shù)名稱描述ToUserName開發(fā)者微信號FromUserName發(fā)送方帳號(一個OpenID)CreateTime消息創(chuàng)建時間(整型)MsgType消息類型MsgId消息id,64位整型所有消息的公有參數(shù)說明

由于所有的消息體都有參數(shù)說明表所示的5個公有字段,為了減少代碼冗余,我們可以將這些參數(shù)提取出來封裝成一個接收消息基類,不同的消息實體繼承這個基類。4.1接收普通用戶消息

4.1.1封裝接收消息結(jié)構(gòu)接收消息基類

publicclassBaseMessage{///<summary>///開發(fā)者微信號///</summary>publicstringToUserName{get;set;}///<summary>///發(fā)送方賬號(OpenID)///</summary>publicstringFromUserName{get;set;}///<summary>///消息創(chuàng)建時間///</summary>publicDateTimeCreateTime{get;set;}///<summary>///消息類型///</summary>publicstringMsgType{get;set;}///<summary>///消息id///</summary>publicstringMsgId{get;set;}}4.1接收普通用戶消息

4.1.1封裝接收消息結(jié)構(gòu)

為了方便管理和代碼編寫,我們可以把所有消息類型寫一個枚舉。///<summary>///用戶發(fā)送消息類型枚舉///</summary>publicenumRequestMsgType{text,image,voice,video,shortvideo,location,link,}4.1接收普通用戶消息

4.1.1封裝接收消息結(jié)構(gòu)

建立消息基類///<summary>///用戶發(fā)送消息基類///</summary>publicclassRequestMessageBase:BaseMessage{///<summary>///用戶發(fā)送消息類型///</summary>

publicclassvirtualRequestMsgTypeMsgType{get{returnRequestMsgType.Text;}}///<summary>///消息ID///</summary>publiclongMsgId{get;set}}4.1接收普通用戶消息

4.1.2文本消息當用戶向公眾號發(fā)送文本消息時,微信公眾號接收到POST消息的XML數(shù)據(jù)格式如下:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[thisisatest]]></Content><MsgId>1234567890123456</MsgId></xml>4.1接收普通用戶消息

4.1.2文本消息

接收文本消息代碼:///<summary>///接收文本消息///</summary>publicclassRequestTextMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.text;}}///<summary>///消息內(nèi)容///</summary>publicstringContent{get;set;}}4.1接收普通用戶消息

4.1.3圖片消息當用戶向公眾號發(fā)送圖片消息時,微信公眾號接收到POST消息的XML數(shù)據(jù)格式如下:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[image]]></MsgType><PicUrl><![CDATA[thisisaurl]]></PicUrl><MediaId><![CDATA[media_id]]></MediaId><MsgId>1234567890123456</MsgId></xml>4.1接收普通用戶消息

4.1.3圖片消息

接收圖片消息代碼如下:publicclassRequestImageMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.image;}}///<summary>///圖片鏈接///</summary>publicstringPicUrl{get;set;}///<summary>///圖片消息媒體id///</summary>publicstringMediaId{get;set;}}4.1接收普通用戶消息

4.1.4語音消息當用戶向公眾號發(fā)送語音消息時,微信公眾號接收到POST消息的XML數(shù)據(jù)格式如下:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1357290913</CreateTime><MsgType><![CDATA[voice]]></MsgType><Format><![CDATA[Format]]></Format><MediaId><![CDATA[media_id]]></MediaId><MsgId>1234567890123456</MsgId></xml>4.1接收普通用戶消息

4.1.4語音消息

接收語音消息代碼如下:publicclassRequestVoiceMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.voice;}}///<summary>///語音格式///</summary>publicstringFormat{get;set;}

///<summary>///語音消息媒體id///</summary>publicstringMediaId{get;set;}///<summary>///語音識別,UTF8編碼///</summary>publicstringRecognition{get;set;}}4.1接收普通用戶消息

4.1.5視頻消息當用戶向公眾號發(fā)送視頻消息時,微信公眾號接收到POST消息的XML數(shù)據(jù)格式如下:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1357290913</CreateTime><MsgType><![CDATA[video]]></MsgType><MediaId><![CDATA[media_id]]></MediaId><ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId><MsgId>1234567890123456</MsgId></xml>4.1接收普通用戶消息

4.1.5視頻消息

接收視頻消息代碼如下:///<summary>///接收視頻消息///<summary>publicclassRequestVideoMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.video;}}

///<summary>///視頻消息縮略圖id///</summary>publicstringThumbMediaId{get;set;}///<summary>///視頻消息媒體id///</summary>publicstringMediaId{get;set;}}4.1接收普通用戶消息

4.1.6小視頻消息當用戶向公眾號發(fā)送小視頻消息時,微信公眾號接收到POST消息的XML數(shù)據(jù)格式為:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1357290913</CreateTime><MsgType><![CDATA[shortvideo]]></MsgType><MediaId><![CDATA[media_id]]></MediaId><ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId><MsgId>1234567890123456</MsgId></xml>4.1接收普通用戶消息

4.1.6小視頻消息

接收小視頻消息代碼如下:///<summary>///接收小視頻消息///<summary>publicclassRequestShortVedioMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.shortvideo;}}

///<summary>///視頻消息縮略圖id///</summary>publicstringThumbMediaId{get;set;}///<summary>///視頻消息媒體id///</summary>publicstringMediaId{get;set;}}4.1接收普通用戶消息

4.1.7地理位置消息當用戶向公眾號發(fā)送地理位置消息時,微信公眾號接收到POST消息的XML數(shù)據(jù)格式為:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[location]]></MsgType><Location_X>23.134521</Location_X><Location_Y>113.358803</Location_Y><Scale>20</Scale><Label><![CDATA[位置信息]]></Label><MsgId>1234567890123456</MsgId></xml>4.1接收普通用戶消息

4.1.7地理位置消息

接收地理位置消息代碼如下:publicclassRequestLocationMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.location;}}///<summary>///緯度///</summary>publicstringLocation_X{get;set;}///<summary>///經(jīng)度///</summary>publicstringLocation_Y{get;set;}///<summary>///地圖縮放///</summary>publicstringScale{get;set;}///<summary>///地理位置信息///</summary>publicstringLabel{get;set;}}4.1接收普通用戶消息

4.1.8鏈接消息當用戶向公眾號發(fā)送鏈接消息時,微信公眾號接收到POST消息的XML數(shù)據(jù)格式為:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[link]]></MsgType><Title><![CDATA[公眾平臺官網(wǎng)鏈接]]></Title><Description><![CDATA[公眾平臺官網(wǎng)鏈接]]><Description><Url><![CDATA[url]]></Url><MsgId>1234567890123456</MsgId></xml>4.1接收普通用戶消息

4.1.8鏈接消息

接收鏈接消息代碼如下:publicclassRequestLinkMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.link;}}///<summary>///消息標題///</summary>publicstringTitle{get;set;}///<summary>///消息描述///</summary>publicstringDescription{get;set;}///<summary>///消息鏈接///</summary>publicstringUrl{get;set;}}4.1接收普通用戶消息

4.1.7地理位置消息當用戶向公眾號發(fā)送地理位置消息時,微信公眾號接收到POST消息的XML數(shù)據(jù)格式為:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[location]]></MsgType><Location_X>23.134521</Location_X><Location_Y>113.358803</Location_Y><Scale>20</Scale><Label><![CDATA[位置信息]]></Label><MsgId>1234567890123456</MsgId></xml>4.1接收普通用戶消息

4.1.7地理位置消息

接收地理位置消息代碼如下:publicclassRequestLocationMessage:RequestBaseMessage{publicclassoverrideRequestMsgTypeMsgType{get{returnRequestMsgType.location;}}///<summary>///緯度///</summary>publicstringLocation_X{get;set;}///<summary>///經(jīng)度///</summary>publicstringLocation_Y{get;set;}///<summary>///地圖縮放///</summary>publicstringScale{get;set;}///<summary>///地理位置信息///</summary>publicstringLabel{get;set;}}接收普通用戶消息接收事件推送回復(fù)消息聊天機器人4.2接收事件推送

4.2.1封裝事件

與普通消息類似,當用戶對公眾賬號進行某種操作時微信服務(wù)器會以XML格式通過POST方式將相應(yīng)事件消息發(fā)送到我們填寫的服務(wù)器地址中,開發(fā)者文檔上定義了每種事件的消息結(jié)構(gòu),不難發(fā)現(xiàn)每種類型的消息都包含參數(shù)ToUserName、FromUserName、CreateTime、MsgType與Event4.2接收事件推送

4.2.1封裝事件事件基類

publicclassBaseEvent{///<summary>///開發(fā)者微信號///</summary>publicstringToUserName{get;set;}///<summary>///發(fā)送方賬號(OpenID)///</summary>publicstringFromUserName{get;set;}

///<summary>///消息創(chuàng)建時間///</summary>publicstringCreateTime{get;set;}///<summary>///消息類型///</summary>publicstringMsgType{get;set;}///<summary>///事件類型///</summary>publicstringEvent{get;set;}}4.2接收事件推送

4.2.1封裝事件事件推送基類

publicclassRequestBaseEvent{///<summary>///接收事件消息基類///</summary>publicclassRequestBaseEvent:BaseEvent{get{returnRequestMsgType.Event;}}///<summary>///事件類型///</summary>publicvirtualEventEvent{get{returnEvent.CLICK;}}///<summary>///事件key值///</summary>publicvirtualEventEvent{get;set;}4.2接收事件推送

4.2.2關(guān)注/取消事件推送XML數(shù)據(jù)包示例:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[subscribe]]></Event><MsgId>1234567890123456</MsgId></xml>4.2接收事件推送

4.2.2關(guān)注/取消事件與關(guān)注/取消關(guān)注XML數(shù)據(jù)包示例對應(yīng)的代碼為:///<summary>///接收關(guān)注/取消關(guān)注事件///</summary>publicclassSubscribeEvent:RequestBaseEvent{publicoverrideEventEvent{get{returnEvent.subscribe;}}}4.2接收事件推送

4.2.3掃描帶參數(shù)二維碼事件用戶未關(guān)注時,進行關(guān)注后的事件推送,推送XML數(shù)據(jù)包示例:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[subscribe]]></Event><EventKey><![CDATA[qrscene_123123]]></EventKey><Ticket><![CDATA[TICKET]]></Ticket></xml>4.2接收事件推送

4.2.3掃描帶參數(shù)二維碼事件掃描帶參數(shù)二維碼事件的代碼:///<summary>///接收掃描帶參數(shù)二維碼事件///</summary>publicclassQRCodeEvent:RequestBaseEvent{publicoverrideEventEvent{get{returnEvent.scan;}}///<summary>///二維碼的ticket///</summary>publicstringTicket{get;set;}}4.2接收事件推送

4.2.4上報地理位置事件推送XML數(shù)據(jù)包示例:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[LOCATION]]></Event><Latitude>23.137466</Latitude><Longitude>113.352425</Longitude><Precision>119.385040</Precision></xml>4.2接收事件推送

4.2.4上報地理位置事件上報地理位置事件的消息結(jié)構(gòu)對應(yīng)的類如下:///<summary>///上報地理位置事件///</summary>publicclassLocationEvent:RequestBaseEvent{publicoverrideEventEvent{get{returnEvent.LOCATION;}}///<summary>///緯度///</summary>publicstringLatitude{get;set;}

///<summary>///經(jīng)度///</summary>publicstringLongitude{get;set;}///<summary>///精度///</summary>publicstringPrecision{get;set;}}4.2接收事件推送

4.2.5自定義菜單事件單擊菜單拉取消息時的事件,推送XML數(shù)據(jù)包示例:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[CLICK]]></Event><EvenKey><![CDATA[EVENTKEY]]></EvenKey></xml>4.2接收事件推送

4.2.4自定義菜單事件自定義菜單事件的消息結(jié)構(gòu)對應(yīng)的代碼如下:///<summary>///自定義菜單事件///</summary>publicclassMenuEvent:RequestBaseEvent{publicoverrideEventEvent{get{returnEvent.CLICK;}}}接收普通用戶消息接收事件推送回復(fù)消息聊天機器人4.3回復(fù)消息

回復(fù)消息

回復(fù)消息被動響應(yīng)消息主動調(diào)用消息接口客服消息接口群發(fā)消息接口模版消息接口4.3回復(fù)消息

4.3.1被動響應(yīng)消息

被動響應(yīng)消息是指當用戶發(fā)送消息給公眾號或某些特定的用戶操作引發(fā)的事件推送時,會產(chǎn)生一個POST請求,開發(fā)者可以在響應(yīng)包中返回特定XML結(jié)構(gòu),來對該消息進行響應(yīng),支持回復(fù)文本、圖片、圖文、語音、視頻、音樂等類型。4.3回復(fù)消息

4.3.1被動響應(yīng)消息

如果開發(fā)者希望增強安全性,可以在開發(fā)者中心處開啟消息加密,這樣,用戶發(fā)給公眾號的消息以及公眾號被動回復(fù)用戶消息都會繼續(xù)加密。消息加解密的具體做法為:(1)在接收授權(quán)公眾號消息或事件時,除了時間戳timestamp和隨機數(shù)nonce之外,還增加兩個參數(shù),分別是加密類型encrypt_type與消息體簽名msg_signature。加密類型為AES,消息體簽名用于驗證消息體的正確性。(2)POST數(shù)據(jù)中的XML體,將使用第三方平臺申請時的接收消息的加密symmetric_key(也稱為EncodingAESKey)來進行加密。4.3回復(fù)消息

4.3.1被動響應(yīng)消息

加解密流程如下:(1)用戶發(fā)送消息的解密函數(shù)(2)開發(fā)者回復(fù)消息的加密函數(shù)4.3回復(fù)消息

4.3.2客服消息接口

客服消息接口是指當用戶與公眾號產(chǎn)生特定動作的交互時,微信會將消息數(shù)據(jù)推送給開發(fā)者,開發(fā)者可以在一段時間內(nèi)(目前為48小時)調(diào)用客服接口,通過POST一個JSON數(shù)據(jù)包發(fā)送消息給普通用戶。4.3回復(fù)消息

4.3.2客服消息接口

調(diào)用客服消息接口允許的動作范圍如下:1、用戶發(fā)送消息2、單擊自定義菜單,只有單擊推事件、掃碼推事件、掃碼推事件且彈出“消息接收中”提示框這三種事件類型會觸發(fā)客服消息接口。3、關(guān)注公眾號4、掃描二維碼5、支付成功6、用戶維權(quán)4.3回復(fù)消息

4.3.2客服消息接口——客服帳號管理(1)添加客服帳號開發(fā)者可以通過客服消息接口添加客服賬號,其中每個公眾號可以添加10個客服賬號。該接口調(diào)用請求如下:HTTP請求方式:POSThttps:///customservice/kfaccount/add?access_token=ACESS_TOKEN4.3回復(fù)消息

4.3.2客服消息接口——客服帳號管理(1)添加客服帳號POST示例數(shù)據(jù):{“kf_account”:”test1@test”,“nickname”:”客服1”,“password”:”pswmd5”,}正確時Json返回結(jié)果如下:{“errcode”:0,“errmsg”:”ok”,}4.3回復(fù)消息

4.3.2客服消息接口——客服帳號管理(2)修改客服帳號開發(fā)者可以通過客服消息接口為公眾號修改客服賬號。此接口的調(diào)用請求如下:HTTP請求方式:POSThttps:///customservice/kfaccount/update?access_token=ACESS_TOKEN4.3回復(fù)消息

4.3.2客服消息接口——客服帳號管理(3)刪除客服帳號開發(fā)者可以通過客服消息接口為公眾號刪除客服賬號。此接口的調(diào)用請求如下:HTTP請求方式:GEThttps:///customservice/kfaccount/del?access_token=ACESS_TOKEN4.3回復(fù)消息

4.3.2客服消息接口——設(shè)置客服帳號頭像開發(fā)者可調(diào)用客服帳號頭像接口來上傳圖片作為客服人員的頭像,頭像圖片文件必須是jpg格式,推薦使用640*640大小的圖片以達到最佳效果。該接口調(diào)用請求如下:HTTP請求方式:POST/FORM/customservice/kfaccount/uploadheadimg?access_token=ACESS_TOKEN&kf_account=KFACCOUNT4.3回復(fù)消息

4.3.2客服消息接口——獲取所有客服帳號開發(fā)者可以通過獲取所有客服帳號接口獲得公眾號中設(shè)置的客服信息,包括客服工號、客服昵稱登錄賬號。返回的Json包示例如下:kf_list[{“kf_account”:”test1@test”,“nickname”:”ntest1”,“kf_id”:”1001”,“kf_headimgurl”:””,};

{“kf_account”:”test2@test”,“nickname”:”ntest2”,“kf_id”:”1002”,“kf_headimgurl”:””,};{“kf_account”:”test3@test”,“nickname”:”ntest3”,“kf_id”:”1003”,“kf_headimgurl”:””,};]4.3回復(fù)消息

4.3.2客服消息接口——客服接口-發(fā)消息客服發(fā)消息接口調(diào)用請求如下:HTTP請求方式:POST/cbg-bin/message/custom/send?access_token=ACESS_TOKEN可以發(fā)送文本、圖片、語音、視頻、音樂、圖文消息4.3回復(fù)消息

4.3.3回復(fù)消息代碼實現(xiàn)1、定義回復(fù)消息枚舉ResponseMsgType2、創(chuàng)建回復(fù)消息基類ResponseBaseType3、創(chuàng)建回復(fù)消息實體(回復(fù)文本、圖片、視頻、音樂、圖文等消息)4、關(guān)注消息與消息自動回復(fù)接收普通用戶消息接收事件推送回復(fù)消息聊天機器人4.4聊天機器人

4.4.1聊天機器人介紹

聊天機器人是一個用來模擬人類對話或聊天的程序,世界上最早的聊天機器人誕生于20世紀80年代,名為“阿爾貝特”,用Basic語言編寫而成?,F(xiàn)在比較有名的聊天機器人有Bily,Alise等,由于中文對“詞”劃分的模糊和語義繁多等等原因,國內(nèi)聊天機器人發(fā)展相對較慢,有白絲魔里沙、贏思軟件的小i、愛博的小A、小強、圖靈機器人等。4.4聊天機器人

4.4.1聊天機器人介紹

在微信公眾號中接入聊天機器人的功能,有兩種方式:一是在現(xiàn)有聊天機器人API接口基礎(chǔ)上搭建的微信聊天機器人。

目前中文聊天機器人有小黃雞、圖靈機器人等,其中圖靈機器人API接口免費,接入流程簡單。接入現(xiàn)有聊天機器人的方法簡單,無需編程即可實現(xiàn)。以圖靈機器人為例,只需申請圖靈機器人賬號,設(shè)置機器人信息以及接入微信公眾平臺的配置信息等就可完成。二是自行開發(fā)聊天機器人。

開發(fā)聊天機器人需要了解聊天機器人的原理和開發(fā)過程。聊天機器人實現(xiàn)的原理與一般流程是預(yù)先采集大量的問答知識,當收到用戶的提問時,系統(tǒng)對問題進行分詞,判斷該話題在系統(tǒng)知識庫中應(yīng)存放的位置,為用戶返回相應(yīng)回答。4.4聊天機器人

4.4.1聊天機器人介紹

聊天機器人原理圖4.4聊天機器人

4.4.1聊天機器人介紹1、問答知識庫

問答庫中的記錄越多,涉及的知識面越廣,能夠回答的問題就越多,回答的準確率也就越高。對于企業(yè)公眾賬號而言,用戶提的問題基本都可以通過企業(yè)客服知識庫解決。4.4聊天機器人

4.4.1聊天機器人介紹1、問答知識庫

(1)問答知識表的建表語句createtable‘knowledge’(‘id’intnotnullprimarykeycomment’主鍵標識’,‘question’varchar(2000)notnullcomment’問題’,‘a(chǎn)nswer’text(8000)notnullcomment‘答案’,‘category’intnotnullcomment‘知識的類別(1:普通話2:英語3:上下文)’)comment=’知識問答表’;4.4聊天機器人

4.4.1聊天機器人介紹1、問答知識庫

(2)問答知識分表的建表結(jié)構(gòu)createtable‘knowledge_sub’(‘id’intnotnullauto_incrementprimarykeycomment‘主鍵標識’,‘pid’intnotnullcomment‘與knowledge表中的id相對應(yīng)’,‘a(chǎn)nswer’text(8000)notnullcomment‘答案’)comment=’問答知識分表’;4.4聊天機器人

4.4.1聊天機器人介紹1、問答知識庫

(3)笑話表createtable‘joke’(‘joke_id’int(8)primarykeynotnullauto_incrementcomment‘笑話id’,‘joke_content’text(8000)notnullcomment’笑話內(nèi)容’,)comment=’笑話表’;4.4聊天機器人

4.4.1聊天機器人介紹1、問答知識庫

(4)聊天記錄表createtable‘chat_log’(‘id’intnotnullauto_incrementprimarykeycomment‘主鍵標識’,‘open_id’varchar(30)notnullcomment‘用戶的OpenID’,‘create_time’varchar(20)notnullcomment‘消息的創(chuàng)建時間’,‘req_msg’varchar(2000)notnullcomment‘用戶上行的消息’,‘resp_msg’varchar(2000)notnullcomment‘公眾賬號回復(fù)的消息’,‘chat_category’intcomment‘聊天話題的類別(0:未知1:普通對話2:笑話3:上下文)’)comment=’聊天記錄表’;4.4聊天機器人

4.4.1聊天機器人介紹2、中文分詞方法

(1)基于字符串匹配的分詞算法

又稱為機械分詞或字典算法。這種方法是按照一定策略將待分析的漢字串與一個“充分大的”機器詞典中的詞條進行匹配,若在詞典中找到某個字符串,則匹配成功。該方法有三個核心要素:掃描方向、匹配優(yōu)先策略以及詞典。

根據(jù)掃描方向的不同分為正向匹配、逆向匹配和雙向匹配。

根據(jù)不同長度匹配優(yōu)先策略,分為最大(最長)優(yōu)先和最?。ㄗ疃蹋﹥?yōu)先。常用的基于字符串匹配的分詞算法有正向最大匹配法、逆向最大匹配法與最小切分法。將正向最大匹配和逆向最大匹配方法結(jié)合起來的方法就是雙向最大匹配法。4.4聊天機器人

4.4.1聊天機器人介紹2、中文分詞方法

(2)基于統(tǒng)計的分詞算法

基于統(tǒng)計的分詞算法是按照相鄰字出現(xiàn)的次數(shù)來判斷構(gòu)成一個詞語的可能性。從形式上看,詞是穩(wěn)定的字的組合,因此在上下文中,相鄰的字同時出現(xiàn)的次數(shù)越多,就越有可能構(gòu)成一個詞。因此字與字相鄰共現(xiàn)的頻率或概率能夠較好地反映成詞的可信度。4.4聊天機器人

4.4.1聊天機器人介紹2、中文分詞方法

(3)基于理解的分詞算法

該方法是計算機模擬人對計句子的理解進行分詞的算法,基本思想是在分詞的同時進行句法、語義分析,利用句法信息和語義信息來處理歧義現(xiàn)象。

它通常包括三個部分:分詞子系統(tǒng)、句法語義子系統(tǒng)、總控部分。4.4聊天機器人

4.4.1聊天機器人介紹3、L與中文分詞算法

(1)Lucene的結(jié)構(gòu)

L的最新版本為2012年發(fā)行的L3.0.3版本。從Lucene官網(wǎng)上下載最新源碼,其源碼包含9個包:Analysis,Document,Index,Messages,QueryParser,Search,Store,Support,Util。源碼結(jié)構(gòu)如下圖所示。4.4聊天機器人

4.4.1聊天機器人介紹3、L與中文分詞算法

Lucene的索引過程4.4聊天機器人

4.4.1聊天機器人介紹3、L與中文分詞算法

(2)分詞器IKAnalyzerNet

IKAnalyzer是基于JAVA的開源的第三方分詞工具包。而IKAnalyzerNet是IKAnalyzer在.net的移植版本。該工具包采用正向迭代最細粒度切分算法,支持智能分詞和最細粒度分詞兩種切分模式,使其分詞結(jié)果更準確,更智能化。4.4聊天機器人

4.4.2聊天機器人實現(xiàn)

1.開發(fā)準備2.封裝數(shù)據(jù)庫操作3.封裝聊天服務(wù)類ChatService4.實現(xiàn)CoreService類4.4聊天機器人

4.4.2聊天機器人實現(xiàn)1、開發(fā)準備在VisualStudio2012或其他版本上創(chuàng)建一個web項目,要注意將幾個文件復(fù)制到項目的引用下,分別是:Apache-Lucene.Net-3.0.3-RC2.binL.dllIKAnalyzerNet.dll4.4聊天機器人

4.4.2聊天機器人實現(xiàn)2、封裝數(shù)據(jù)庫操作聊天機器人功能涉及的數(shù)據(jù)庫操作主要有獲取問答知識表所有記錄,獲取上一次聊天類別,并根據(jù)知識id從問答知識分表隨機獲取一個答案、隨機獲取一個笑話和保存聊天記錄。需要將這些功能都封裝在工具類中。4.4聊天機器人

4.4.2聊天機器人實現(xiàn)3、封裝聊天服務(wù)類ChatService

該類主要是獲取問答知識表中的所有記錄,并對其創(chuàng)建索引;從索引文件中檢索匹配指定問題的問答知識;封裝一個提供給外部使用的聊天方法。4.4聊天機器人usingSystem;usingLucene.Net.Document;usingLucene.Net.Store;usingLucene.Net.Util;namespaceWeixin.Chatbot{publicclassChatService{//得到索引存儲目錄publicstaticStringgetIndexDir(){//得到.class文件所在路徑Stringclasspath=ChatService.class.getResource(“/”).getPath();//將classpath中的%20替換為空格classpath=classpath.replaceAll(“%20”,””);returnclasspath+”index/”;}//創(chuàng)建索引publicstaticcoidcreateIndex(){//取得問答知識庫中的所有記錄List<Knowledge>knowledgeList=SQLSeverUtil.findAllKnowledge();Directorydirectory=null;IndexWriterindexWriter=null;try{directory=FSDirectory.open(newFile(getIndexDir()));IndexWriterConfigiwConfig=newIndexWriterConfig(Version.LUCENE_46,NewIKAnalyzer(true));indexWriter=newIndexWriter(directory,iwConfig);Documentdoc=null;//遍歷問答知識庫創(chuàng)建索引for(Knowledgeknowledge:knowledgeList){doc=newDocument();//對question進行分詞doc.add(newTextField(“question”,knowledge,getQuestion(),Store.YES));//對id、answer、category不分詞存儲doc.add(newIntField(“id”,knowledge,getId(),Store.YES));doc.add(newStringField(“answer”,knowledge,getAnswer(),Store.YES));doc.add(newIntField(“category”,knowledge,getCategory(),Store.YES));indexWriter.addDocument(doc);}indexWriter.close();directory.close();}catch(Exceptione){e.printStackTrace();}}//從索引文件中根據(jù)問題檢索答案privatestaticKnowledgesearchIndex(Stringcontent){Knowledgeknowledge=null;try{Directorydirectory=FSDirectory.open(newFile(getIndex()));IndexReaderreader=IndexReader.open(directory);IndexSearchersearcher=newIndexSearcher(reader);//使用查詢解析器創(chuàng)建QueryQueryParserquestParser=newQueryParser(Version.LUCENE_46,“question”,newIKAnalyzer(true));Queryquery=questParser.parse(QueryParser.escape(content));//檢索得分最高的文檔TopDocstopDocs=searcher.search(query,1);if(topDocs.totalHits>0){knowledge=newKnowledge();ScoreDoc[]scoreDoc=topDocs.scoreDocs;for(ScoreDocsd:scoreDoc){Documentdoc=searcher.doc(sd.doc);

4.4聊天機器人knowledge.setId(doc.getField(“id”).numericValue().intValue());knowledge.setQuestion(doc.get(“question”));knowledge.setAnswer(doc.get(“answer”));knowledge.setCategory(doc.getField(“catagory”).numericValue().intValue());}}reader.close();directory.close();}catch(Exceptione){knowledge=null;e.printStackTrace();}returnknowledge;}//聊天方法(根據(jù)question返回answer)publicstaticStringchat(StringopenId,StringcreateTime,Stringquestion){Stringanswer=null;intchatCategory=0;Knowledgeknowledge=searchIndex(question);//找到匹配項if(null!=knowledge){//笑話if(2==knowledge.getCategory()){answer=MySQLUtil.getJoke();chatCategory=2;}//上下文elseif(3==knowledge.getCategory()){//判斷上一次的聊天類別intcategory=MySQLUtil.getLastCategory(openId);//如果是笑話,本次繼續(xù)回復(fù)笑話給用戶if(2==category){answer=MySQLUtil.getJoke();chatCategory=2;}else{answer=knowledge.getAnswer();chatCategory=knowledge.getCategory();}}//普通對話else{answer=knowledge.getAnswer();//如果答案唯恐,根據(jù)知識id從問答知識份表中隨機獲取一條if(“

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論