一、功能介紹
通過微信公眾平臺實現(xiàn)在線客服機器人功能。主要的功能包括:簡單對話、查詢天氣等服務(wù)。
這里只是提供比較簡單的功能,重在通過此實例來說明公眾平臺的具體研發(fā)過程。只是一個簡單DEMO,如果需要的話可以在此基礎(chǔ)上進行擴展。
當(dāng)然后續(xù)我們還會推出比較復(fù)雜的應(yīng)用實例。?
二、具體實現(xiàn)
1、提供訪問接口
這里不再贅述,參照上一章,微信公眾賬號開發(fā)教程(二) 基礎(chǔ)框架搭建
2、簽名認(rèn)證和分發(fā)請求
這里不再贅述,參照上一章,微信公眾賬號開發(fā)教程(二) 基礎(chǔ)框架搭建
3、處理請求,并響應(yīng)
1)關(guān)注
當(dāng)微信用戶關(guān)注公眾賬號時,可以給其適當(dāng)?shù)奶崾尽?梢允菤g迎詞,可以是幫助提示。
直接上代碼:
????class?EventHandler?:?IHandler ????{????????///?<summary> ????????///?請求的xml????????///?</summary> ????????private?string?RequestXml?{?get;?set;?}????????///?<summary> ????????///?構(gòu)造函數(shù)????????///?</summary> ????????///?<param name="requestXml"></param> ????????public?EventHandler(string?requestXml) ????????{????????????this.RequestXml?=?requestXml; ????????}????????///?<summary> ????????///?處理請求????????///?</summary> ????????///?<returns></returns> ????????public?string?HandleRequest() ????????{????????????string?response?=?string.Empty; ????????????EventMessage?em?=?EventMessage.LoadFromXml(RequestXml);????????????if?(em.Event.Equals("subscribe",StringComparison.OrdinalIgnoreCase)) ????????????{????????????????//回復(fù)歡迎消息 ????????????????TextMessage?tm?=?new?TextMessage(); ????????????????tm.ToUserName?=?em.FromUserName; ????????????????tm.FromUserName?=?em.ToUserName; ????????????????tm.CreateTime?=?Common.GetNowTime(); ????????????????tm.Content?=?"歡迎您關(guān)注***,我是大哥大,有事就問我,呵呵!\n\n"; ????????????????response?=?tm.GenerateContent(); ????????????}????????????return?response; ????????} ????}
?2)問候
簡單的交流問候,比如你好、幫助等等,跟我們使用微信聊天一樣,不過回應(yīng)是由我們的程序響應(yīng)。具體功能,可以根據(jù)自己的需要進行添加。
微信本來就是溝通的平臺。這個案例,可以用于在線服務(wù)機器人,類似于淘寶的客服機器人,可是我們這個是微信版的。呵呵
其實,很簡單,獲取請求消息,根據(jù)關(guān)鍵字來匹配回應(yīng)。當(dāng)然這里可能要做的工作很多,如何支持智能匹配,如何支持模糊匹配等。
代碼如下:
????///?<summary> ????///?文本信息處理類????///?</summary> ????public?class?TextHandler?:?IHandler ????{????????///?<summary> ????????///?請求的XML????????///?</summary> ????????private?string?RequestXml?{?get;?set;?}????????///?<summary> ????????///?構(gòu)造函數(shù)????????///?</summary> ????????///?<param name="requestXml">請求的xml</param> ????????public?TextHandler(string?requestXml) ????????{????????????this.RequestXml?=?requestXml; ????????}????????///?<summary> ????????///?處理請求????????///?</summary> ????????///?<returns></returns> ????????public?string?HandleRequest() ????????{????????????string?response?=?string.Empty; ????????????TextMessage?tm?=?TextMessage.LoadFromXml(RequestXml);????????????string?content?=?tm.Content.Trim();????????????if?(string.IsNullOrEmpty(content)) ????????????{ ????????????????response?=?"您什么都沒輸入,沒法幫您啊,%>_<%。"; ????????????}????????????else ????????????{????????????????if?(content.StartsWith("tq",?StringComparison.OrdinalIgnoreCase)) ????????????????{????????????????????string?cityName?=?content.Substring(2).Trim(); ????????????????????response?=?WeatherHelper.GetWeather(cityName); ????????????????}????????????????else ????????????????{ ????????????????????response?=?HandleOther(content); ????????????????} ????????????} ????????????tm.Content?=?response;????????????//進行發(fā)送者、接收者轉(zhuǎn)換 ????????????string?temp?=?tm.ToUserName; ????????????tm.ToUserName?=?tm.FromUserName; ????????????tm.FromUserName?=?temp; ????????????response?=?tm.GenerateContent();????????????return?response; ????????}????????///?<summary> ????????///?處理其他消息????????///?</summary> ????????///?<param name="tm"></param> ????????///?<returns></returns> ????????private?string?HandleOther(string?requestContent) ????????{????????????string?response?=?string.Empty;????????????if?(requestContent.Contains("你好")?||?requestContent.Contains("您好")) ????????????{ ????????????????response?=?"您也好~"; ????????????}????????????else?if?(requestContent.Contains("傻")) ????????????{ ????????????????response?=?"我不傻!哼~?"; ????????????}????????????else?if?(requestContent.Contains("逼")?||?requestContent.Contains("操")) ????????????{ ????????????????response?=?"哼,你說臟話!?"; ????????????}????????????else?if?(requestContent.Contains("是誰")) ????????????{ ????????????????response?=?"我是大哥大,有什么能幫您的嗎?~"; ????????????}????????????else?if?(requestContent.Contains("再見")) ????????????{ ????????????????response?=?"再見!"; ????????????}????????????else?if?(requestContent.Contains("bye")) ????????????{ ????????????????response?=?"Bye!"; ????????????}????????????else?if?(requestContent.Contains("謝謝")) ????????????{ ????????????????response?=?"不客氣!嘿嘿"; ????????????}????????????else?if?(requestContent?==?"h"?||?requestContent?==?"H"?||?requestContent.Contains("幫助")) ????????????{ ????????????????response?=?@"查詢天氣,輸入tq?城市名稱\拼音\首字母"; ????????????}????????????else ????????????{ ????????????????response?=?"您說的,可惜,我沒明白啊,試試其他關(guān)鍵字吧。"; ????????????}????????????return?response; ????????} ????}
?
3)查詢天氣
這個功能需要請求實時查詢的,請求官方的天氣發(fā)布網(wǎng)站,然后解析其返回值,按照我們需要的格式,組織天氣信息,最后發(fā)送給微信客戶。
采用文本消息方式處理。
用戶請求,只需輸入:tq 城市名稱/拼音/首字母,即可獲取消息。
回復(fù)的消息:(以北京為例)
北京 2013年11月6日?星期三 今天:(17℃~4℃)晴北風(fēng)4-5級轉(zhuǎn)3-4級4-5級轉(zhuǎn)3-4級 24小時穿衣指數(shù):天氣冷,建議著棉服、羽絨服、皮夾克加羊毛衫等冬季服裝。年老體弱者宜著厚棉衣、冬大衣或厚羽絨服。 明天:(14℃~3℃)晴轉(zhuǎn)多云微風(fēng)小于3級 48小時穿衣指數(shù):天氣冷,建議著棉服、羽絨服、皮夾克加羊毛衫等冬季服裝。年老體弱者宜著厚棉衣、冬大衣或厚羽絨服。
來看源碼吧:
????class?WeatherHelper ????{????????///?<summary> ????????///?城市集合字段????????///?</summary> ????????private?static?Dictionary<string, City>?mCities;????????///?<summary> ????????///?城市集合????????///?</summary> ????????public?static?Dictionary<string, City>?Cities ????????{????????????get ????????????{????????????????if?(mCities?==?null) ????????????????{ ????????????????????LoadCities(); ????????????????}????????????????return?mCities; ????????????} ????????}????????///?<summary> ????????///?加載城市????????///?</summary> ????????private?static?void?LoadCities() ????????{ ????????????mCities?=?new?Dictionary<string, City>(); ????????????mCities.Clear(); ????????????mCities.Add("101010100",?new?City()?{?Code?=?"101010100",?Name?=?"北京",?PinYin?=?"beijing",?FristLetter?=?"bj"?}); ????????????mCities.Add("101020100",?new?City()?{?Code?=?"101020100",?Name?=?"上海",?PinYin?=?"shanghai",?FristLetter?=?"sh"?}); ????????????mCities.Add("101200101",?new?City()?{?Code?=?"101200101",?Name?=?"武漢",?PinYin?=?"wuhai",?FristLetter?=?"wh"?}); ???????????? ????????}????????///?<summary> ????????///?獲取城市的天氣????????///?</summary> ????????///?<param name="name">城市名稱、拼音或首字母</param> ????????///?<returns></returns> ????????public?static?string?GetWeather(string?name) ????????{????????????string?result?=?string.Empty;????????????string?cityCode?=?string.Empty;????????????//獲取城市編碼 ????????????IEnumerable<string>?codes?=?from?item?in?Cities????????????????????????????????????????where?item.Value?!=?null ??????????????????????????????????????????????&&?(item.Value.Name.Equals(name,?StringComparison.OrdinalIgnoreCase)? ????????????????????????????????????????????????????||?item.Value.PinYin.Equals(name,?StringComparison.OrdinalIgnoreCase)? ????????????????????????????????????????????????????||?item.Value.FristLetter.Equals(name,?StringComparison.OrdinalIgnoreCase))????????????????????????????????????????select?item.Value.Code;????????????if?(codes?!=?null?&&?codes.Count()?>?0) ????????????{ ????????????????cityCode?=?codes.First<string>(); ????????????}????????????//http請求,獲取天氣 ????????????if?(!string.IsNullOrEmpty(cityCode)) ????????????{????????????????string?url?=?"http://www.miracleart.cn/{0}.html"; ????????????????url?=?string.Format(url,?cityCode); ????????????????WebRequest?request?=?HttpWebRequest.Create(url);????????????????//超時時間為:2秒 ????????????????request.Timeout?=?2000; ????????????????request.Credentials?=?CredentialCache.DefaultCredentials; ????????????????WebResponse?response?=?request.GetResponse(); ????????????????StreamReader?reader?=?new?StreamReader(response.GetResponseStream(),?Encoding.UTF8);????????????????string?weahterInfo?=?reader.ReadToEnd();????????????????if?(string.IsNullOrEmpty(weahterInfo)) ????????????????{ ????????????????????result?=?"暫時沒有取到天氣數(shù)據(jù),請稍后再試"; ????????????????}????????????????else ????????????????{ ????????????????????XmlDocument?doc?=?JsonConvert.DeserializeXmlNode(weahterInfo);????????????????????if?(doc?!=?null) ????????????????????{ ????????????????????????XmlNode?node?=?doc.DocumentElement;????????????????????????if?(node?!=?null) ????????????????????????{ ????????????????????????????StringBuilder?builder?=?new?StringBuilder(); ????????????????????????????builder.Append(node["city"].InnerText).Append("\n"); ????????????????????????????builder.Append(node["date_y"].InnerText).Append("?").Append(node["week"].InnerText).Append("\n"); ????????????????????????????builder.Append("今天:").Append("(").Append(node["temp1"].InnerText).Append(")").Append(node["weather1"].InnerText).Append(node["wind1"].InnerText).Append(node["fl1"].InnerText).Append("\n"); ????????????????????????????builder.Append("24小時穿衣指數(shù):").Append(node["index_d"].InnerText).Append("\n"); ????????????????????????????builder.Append("明天:").Append("(").Append(node["temp2"].InnerText).Append(")").Append(node["weather2"].InnerText).Append(node["wind2"].InnerText).Append(node["fl2"].InnerText).Append("\n"); ????????????????????????????builder.Append("48小時穿衣指數(shù):").Append(node["index48_d"].InnerText).Append("\n"); ????????????????????????????result?=?builder.ToString(); ????????????????????????} ????????????????????}????????????????????#region?天氣json數(shù)據(jù)格式????????????????????/* ????????????????? ????????????????{ ???"weatherinfo":?{ ???????"city":?"北京",? ???????"city_en":?"beijing",? ???????"date_y":?"2013年11月4日",? ???????"date":?"",? ???????"week":?"星期一",? ???????"fchh":?"11",? ???????"cityid":?"101010100",? ???????"temp1":?"17℃~5℃",? ???????"temp2":?"16℃~5℃",? ???????"temp3":?"18℃~4℃",? ???????"temp4":?"17℃~5℃",? ???????"temp5":?"14℃~6℃",? ???????"temp6":?"14℃~2℃",? ???????"tempF1":?"62.6℉~41℉",? ???????"tempF2":?"60.8℉~41℉",? ???????"tempF3":?"64.4℉~39.2℉",? ???????"tempF4":?"62.6℉~41℉",? ???????"tempF5":?"57.2℉~42.8℉",? ???????"tempF6":?"57.2℉~35.6℉",? ???????"weather1":?"晴轉(zhuǎn)多云",? ???????"weather2":?"多云",? ???????"weather3":?"多云轉(zhuǎn)晴",? ???????"weather4":?"晴轉(zhuǎn)多云",? ???????"weather5":?"多云轉(zhuǎn)陰",? ???????"weather6":?"陰轉(zhuǎn)晴",? ???????"img1":?"0",? ???????"img2":?"1",? ???????"img3":?"1",? ???????"img4":?"99",? ???????"img5":?"1",? ???????"img6":?"0",? ???????"img7":?"0",? ???????"img8":?"1",? ???????"img9":?"1",? ???????"img10":?"2",? ???????"img11":?"2",? ???????"img12":?"0",? ???????"img_single":?"0",? ???????"img_title1":?"晴",? ???????"img_title2":?"多云",? ???????"img_title3":?"多云",? ???????"img_title4":?"多云",? ???????"img_title5":?"多云",? ???????"img_title6":?"晴",? ???????"img_title7":?"晴",? ???????"img_title8":?"多云",? ???????"img_title9":?"多云",? ???????"img_title10":?"陰",? ???????"img_title11":?"陰",? ???????"img_title12":?"晴",? ???????"img_title_single":?"晴",? ???????"wind1":?"微風(fēng)",? ???????"wind2":?"微風(fēng)",? ???????"wind3":?"微風(fēng)",? ???????"wind4":?"微風(fēng)",? ???????"wind5":?"微風(fēng)",? ???????"wind6":?"北風(fēng)4-5級",? ???????"fx1":?"微風(fēng)",? ???????"fx2":?"微風(fēng)",? ???????"fl1":?"小于3級",? ???????"fl2":?"小于3級",? ???????"fl3":?"小于3級",? ???????"fl4":?"小于3級",? ???????"fl5":?"小于3級",? ???????"fl6":?"4-5級",? ???????"index":?"較冷",? ???????"index_d":?"建議著大衣、呢外套加毛衣、衛(wèi)衣等服裝。體弱者宜著厚外套、厚毛衣。因晝夜溫差較大,注意增減衣服。",? ???????"index48":?"冷",? ???????"index48_d":?"天氣冷,建議著棉服、羽絨服、皮夾克加羊毛衫等冬季服裝。年老體弱者宜著厚棉衣、冬大衣或厚羽絨服。",? ???????"index_uv":?"中等",? ???????"index48_uv":?"弱",? ???????"index_xc":?"適宜",? ???????"index_tr":?"適宜",? ???????"index_co":?"舒適",? ???????"st1":?"17",? ???????"st2":?"5",? ???????"st3":?"17",? ???????"st4":?"5",? ???????"st5":?"18",? ???????"st6":?"6",? ???????"index_cl":?"適宜",? ???????"index_ls":?"適宜",? ???????"index_ag":?"極不易發(fā)" ???} }????????????????*/ ????????????????????#endregion ????????????????} ????????????}????????????else ????????????{ ????????????????result?=?"沒有獲取到該城市的天氣,請確定輸入了正確的城市名稱,如\'北京\'或者\'beijing\'或者\'bj\'"; ????????????}????????????//返回 ????????????return?result; ????????}????????///?<summary> ????????///?內(nèi)部類:城市????????///?</summary> ????????internal?class?City ????????{????????????///?<summary> ????????????///?編碼????????????///?</summary> ????????????public?string?Code?{?get;?set;?}????????????///?<summary> ????????????///?名稱????????????///?</summary> ????????????public?string?Name?{?get;?set;?}????????????///?<summary> ????????????///?拼音????????????///?</summary> ????????????public?string?PinYin?{?get;?set;?}????????????///?<summary> ????????????///?拼音首字母????????????///?</summary> ????????????public?string?FristLetter?{?get;?set;?} ????????} ????}
更多微信公眾平臺開發(fā)教程(四) 實例入門:機器人相關(guān)文章請關(guān)注PHP中文網(wǎng)!

熱AI工具

Undress AI Tool
免費脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機

Video Face Swap
使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)