微信公众平台开发教程(四) 实例入门:机器人
一、功能介绍通过微信公众平台实现在线客服机器人功能。主要的功能包括:简单对话、查询天气等服务。
这里只是提供比较简单的功能,重在通过此实例来说明公众平台的具体研发过程。只是一个简单DEMO,如果需要的话可以在此基础上进行扩展。
当然后续我们还会推出比较复杂的应用实例。 二、具体实现1、提供访问接口这里不再赘述,参照上一章,微信公众账号开发教程(二) 基础框架搭建2、签名认证和分发请求这里不再赘述,参照上一章,微信公众账号开发教程(二) 基础框架搭建3、处理请求,并响应1)关注当微信用户关注公众账号时,可以给其适当的提示。可以是欢迎词,可以是帮助提示。
直接上代码:
class EventHandler : IHandler{/// <summary>/// 请求的xml/// </summary>private string RequestXml { get; set; }/// <summary>/// 构造函数/// </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 = "欢迎您关注***,我是大哥大,有事就问我,呵呵!nn";response = tm.GenerateContent();}return response;}} 2)问候简单的交流问候,比如你好、帮助等等,跟我们使用微信聊天一样,不过回应是由我们的程序响应。具体功能,可以根据自己的需要进行添加。微信本来就是沟通的平台。这个案例,可以用于在线服务机器人,类似于淘宝的客服机器人,可是我们这个是微信版的。呵呵其实,很简单,获取请求消息,根据关键字来匹配回应。当然这里可能要做的工作很多,如何支持智能匹配,如何支持模糊匹配等。
代码如下:
/// <summary>/// 文本信息处理类/// </summary>public class TextHandler : IHandler{/// <summary>/// 请求的XML/// </summary>private string RequestXml { get; set; }/// <summary>/// 构造函数/// </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;//进行发送者、接收者转换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)查询天气这个功能需要请求实时查询的,请求官方的天气发布网站,然后解析其返回值,按照我们需要的格式,组织天气信息,最后发送给微信客户。采用文本消息方式处理。用户请求,只需输入:tq 城市名称/拼音/首字母,即可获取消息。
回复的消息:(以北京为例)
北京2013年11月6日 星期三今天:(17℃~4℃)晴北风4-5级转3-4级4-5级转3-4级24小时穿衣指数:天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。明天:(14℃~3℃)晴转多云微风小于3级48小时穿衣指数:天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。
来看源码吧:
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://www.php.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 = "暂时没有取到天气数据,请稍后再试";}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小时穿衣指数:").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小时穿衣指数:").Append(node["index48_d"].InnerText).Append("n");result = builder.ToString();}}#region 天气json数据格式/*{"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": "建议着大衣、呢外套加毛衣、卫衣等服装。体弱者宜着厚外套、厚毛衣。因昼夜温差较大,注意增减衣服。","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": "极不易发"}}*/#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; }}}
更多微信公众平台开发教程(四) 实例入门:机器人相关文章请关注PHP中文网!