一、功能介紹
透過(guò)微信公眾平臺(tái)實(shí)現(xiàn)線上客服機(jī)器人功能。主要的功能包括:簡(jiǎn)單對(duì)話、查詢天氣等服務(wù)。
這裡只是提供比較簡(jiǎn)單的功能,重點(diǎn)在於透過(guò)此實(shí)例來(lái)說(shuō)明公眾平臺(tái)的具體研發(fā)過(guò)程。只是一個(gè)簡(jiǎn)單DEMO,如果需要的話可以在此基礎(chǔ)上擴(kuò)展。
當(dāng)然後續(xù)我們也會(huì)推出比較複雜的應(yīng)用實(shí)例。
二、具體實(shí)現(xiàn)
1、提供存取介面
這裡不再贅述,參考上一章,微信公眾帳號(hào)開(kāi)發(fā)教學(xué)(二) 基礎(chǔ)框架搭建
2、簽名認(rèn)證和分發(fā)請(qǐng)求不再贅述,參考上一章,微信公眾帳號(hào)開(kāi)發(fā)教程(二) 基礎(chǔ)框架搭建
3、處理請(qǐng)求,並響應(yīng)
1)關(guān)注
當(dāng)微信用戶關(guān)注公眾帳號(hào)時(shí),可以給其適當(dāng)?shù)奶崾???梢允菤g迎詞,可以是幫助提示。
直接上代碼:
????class?EventHandler?:?IHandler ????{????????///?<summary> ????????///?請(qǐng)求的xml????????///?</summary> ????????private?string?RequestXml?{?get;?set;?}????????///?<summary> ????????///?構(gòu)造函數(shù)????????///?</summary> ????????///?<param name="requestXml"></param> ????????public?EventHandler(string?requestXml) ????????{????????????this.RequestXml?=?requestXml; ????????}????????///?<summary> ????????///?處理請(qǐng)求????????///?</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)注***,我是大哥大,有事就問(wèn)我,呵呵!\n\n"; ????????????????response?=?tm.GenerateContent(); ????????????}????????????return?response; ????????} ????}
?2)問(wèn)候
簡(jiǎn)單的交流問(wèn)候,例如你好、幫助等等,跟我們使用微信聊天一樣,不過(guò)回應(yīng)是由我們的程序響應(yīng)。具體功能,可以依照自己的需求進(jìn)行添加。
微信本來(lái)就是溝通的平臺(tái)。這個(gè)案例,可以用於線上服務(wù)機(jī)器人,類(lèi)似淘寶的客服機(jī)器人,可是我們這個(gè)是微信版的。呵呵其實(shí),很簡(jiǎn)單,取得請(qǐng)求訊息,根據(jù)關(guān)鍵字來(lái)匹配回應(yīng)。當(dāng)然這裡可能要做的工作很多,如何支援智慧匹配,如何支援模糊匹配等。
程式碼如下:
????///?<summary> ????///?文本信息處理類(lèi)????///?</summary> ????public?class?TextHandler?:?IHandler ????{????????///?<summary> ????????///?請(qǐng)求的XML????????///?</summary> ????????private?string?RequestXml?{?get;?set;?}????????///?<summary> ????????///?構(gòu)造函數(shù)????????///?</summary> ????????///?<param name="requestXml">請(qǐng)求的xml</param> ????????public?TextHandler(string?requestXml) ????????{????????????this.RequestXml?=?requestXml; ????????}????????///?<summary> ????????///?處理請(qǐng)求????????///?</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?=?"您什么都沒(méi)輸入,沒(méi)法幫您啊,%>_<%。"; ????????????}????????????else ????????????{????????????????if?(content.StartsWith("tq",?StringComparison.OrdinalIgnoreCase)) ????????????????{????????????????????string?cityName?=?content.Substring(2).Trim(); ????????????????????response?=?WeatherHelper.GetWeather(cityName); ????????????????}????????????????else ????????????????{ ????????????????????response?=?HandleOther(content); ????????????????} ????????????} ????????????tm.Content?=?response;????????????//進(jìn)行發(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?=?"哼,你說(shuō)臟話!?"; ????????????}????????????else?if?(requestContent.Contains("是誰(shuí)")) ????????????{ ????????????????response?=?"我是大哥大,有什么能幫您的嗎?~"; ????????????}????????????else?if?(requestContent.Contains("再見(jiàn)")) ????????????{ ????????????????response?=?"再見(jiàn)!"; ????????????}????????????else?if?(requestContent.Contains("bye")) ????????????{ ????????????????response?=?"Bye!"; ????????????}????????????else?if?(requestContent.Contains("謝謝")) ????????????{ ????????????????response?=?"不客氣!嘿嘿"; ????????????}????????????else?if?(requestContent?==?"h"?||?requestContent?==?"H"?||?requestContent.Contains("幫助")) ????????????{ ????????????????response?=?@"查詢天氣,輸入tq?城市名稱\拼音\首字母"; ????????????}????????????else ????????????{ ????????????????response?=?"您說(shuō)的,可惜,我沒(méi)明白啊,試試其他關(guān)鍵字吧。"; ????????????}????????????return?response; ????????} ????}
?
3)查詢天氣
這個(gè)功能需要請(qǐng)求實(shí)時(shí)查詢的,請(qǐng)求官方的天氣發(fā)佈網(wǎng)站,然後解析其回傳值,按照我們需要的格式,組織天氣資訊,最後發(fā)送給微信客戶。
採(cǎi)用文字訊息方式處理。用戶請(qǐng)求,只需輸入:tq 城市名稱/拼音/首字母,即可取得訊息。
回覆的訊息:(以北京為例)
北京 2013年11月6日?星期三 今天:(17℃~4℃)晴北風(fēng)4-5級(jí)轉(zhuǎn)3-4級(jí)4-5級(jí)轉(zhuǎn)3-4級(jí) 24小時(shí)穿衣指數(shù):天氣冷,建議著棉服、羽絨服、皮夾克加羊毛衫等冬季服裝。年老體弱者宜著厚棉衣、冬大衣或厚羽絨服。 明天:(14℃~3℃)晴轉(zhuǎn)多云微風(fēng)小于3級(jí) 48小時(shí)穿衣指數(shù):天氣冷,建議著棉服、羽絨服、皮夾克加羊毛衫等冬季服裝。年老體弱者宜著厚棉衣、冬大衣或厚羽絨服。
來(lái)看源碼吧:
????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請(qǐng)求,獲取天氣 ????????????if?(!string.IsNullOrEmpty(cityCode)) ????????????{????????????????string?url?=?"http://ipnx.cn/{0}.html"; ????????????????url?=?string.Format(url,?cityCode); ????????????????WebRequest?request?=?HttpWebRequest.Create(url);????????????????//超時(shí)時(shí)間為: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í)沒(méi)有取到天氣數(shù)據(jù),請(qǐng)稍后再試"; ????????????????}????????????????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í)穿衣指數(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í)穿衣指數(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級(jí)",? ???????"fx1":?"微風(fēng)",? ???????"fx2":?"微風(fēng)",? ???????"fl1":?"小于3級(jí)",? ???????"fl2":?"小于3級(jí)",? ???????"fl3":?"小于3級(jí)",? ???????"fl4":?"小于3級(jí)",? ???????"fl5":?"小于3級(jí)",? ???????"fl6":?"4-5級(jí)",? ???????"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?=?"沒(méi)有獲取到該城市的天氣,請(qǐng)確定輸入了正確的城市名稱,如\'北京\'或者\(yùn)'beijing\'或者\(yùn)'bj\'"; ????????????}????????????//返回 ????????????return?result; ????????}????????///?<summary> ????????///?內(nèi)部類(lè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;?} ????????} ????}
教程中文網(wǎng)!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

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

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

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

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)