微信公众平台开发教程(四) 实例入门:机器人(附源码)
微信公眾平臺開發(fā)教程(四) 實例入門:機器人(附源碼)
?上一篇文章,寫了基本框架,可能很多人會覺得暈頭轉向,這里提供一個簡單的例子來予以說明,希望能幫你解開謎團。
一、功能介紹
通過微信公眾平臺實現(xiàn)在線客服機器人功能。主要的功能包括:簡單對話、查詢天氣等服務。
這里只是提供比較簡單的功能,重在通過此實例來說明公眾平臺的具體研發(fā)過程。只是一個簡單DEMO,如果需要的話可以在此基礎上進行擴展。
當然后續(xù)我們還會推出比較復雜的應用實例。?
二、具體實現(xiàn)
1、提供訪問接口
這里不再贅述,參照上一章,微信公眾賬號開發(fā)教程(二) 基礎框架搭建
http://www.cnblogs.com/yank/p/3392394.html
2、簽名認證和分發(fā)請求
這里不再贅述,參照上一章,微信公眾賬號開發(fā)教程(二) 基礎框架搭建
http://www.cnblogs.com/yank/p/3392394.html
3、處理請求,并響應
1)關注
當微信用戶關注公眾賬號時,可以給其適當?shù)奶崾???梢允菤g迎詞,可以是幫助提示。
直接上代碼:
class EventHandler : IHandler{/// <summary>/// 請求的xml/// </summary>private string RequestXml { get; set; }/// <summary>/// 構造函數(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)){//回復歡迎消息TextMessage tm = new TextMessage();tm.ToUserName = em.FromUserName;tm.FromUserName = em.ToUserName;tm.CreateTime = Common.GetNowTime();tm.Content = "歡迎您關注***,我是大哥大,有事就問我,呵呵!\n\n";response = tm.GenerateContent();}return response;}}?2)問候
簡單的交流問候,比如你好、幫助等等,跟我們使用微信聊天一樣,不過回應是由我們的程序響應。具體功能,可以根據自己的需要進行添加。
微信本來就是溝通的平臺。這個案例,可以用于在線服務機器人,類似于淘寶的客服機器人,可是我們這個是微信版的。呵呵
其實,很簡單,獲取請求消息,根據關鍵字來匹配回應。當然這里可能要做的工作很多,如何支持智能匹配,如何支持模糊匹配等。
代碼如下:
/// <summary>/// 文本信息處理類/// </summary>public class TextHandler : IHandler{/// <summary>/// 請求的XML/// </summary>private string RequestXml { get; set; }/// <summary>/// 構造函數(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ā)送者、接收者轉換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 = "您說的,可惜,我沒明白啊,試試其他關鍵字吧。";}return response;}}?
3)查詢天氣
這個功能需要請求實時查詢的,請求官方的天氣發(fā)布網站,然后解析其返回值,按照我們需要的格式,組織天氣信息,最后發(fā)送給微信客戶。
采用文本消息方式處理。
用戶請求,只需輸入:tq 城市名稱/拼音/首字母,即可獲取消息。
回復的消息:(以北京為例)
北京 2013年11月6日 星期三 今天:(17℃~4℃)晴北風4-5級轉3-4級4-5級轉3-4級 24小時穿衣指數(shù):天氣冷,建議著棉服、羽絨服、皮夾克加羊毛衫等冬季服裝。年老體弱者宜著厚棉衣、冬大衣或厚羽絨服。 明天:(14℃~3℃)晴轉多云微風小于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 Citieswhere 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://m.weather.com.cn/data/{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ù)據,請稍后再試";}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ù)據格式/*{"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": "晴轉多云", "weather2": "多云", "weather3": "多云轉晴", "weather4": "晴轉多云", "weather5": "多云轉陰", "weather6": "陰轉晴", "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": "微風", "wind2": "微風", "wind3": "微風", "wind4": "微風", "wind5": "微風", "wind6": "北風4-5級", "fx1": "微風", "fx2": "微風", "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>/// 內部類:城市/// </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; }}}?三、源碼
這里可是可執(zhí)行的代碼哦。應大家的需求,這里提供全部的源代碼。
?http://files.cnblogs.com/yank/Yank.WeiXin.Robot.zip
總結
以上是生活随笔為你收集整理的微信公众平台开发教程(四) 实例入门:机器人(附源码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rest架构
- 下一篇: Android:Plug-in com.