微信公众平台开发教程(四) 实例入门:机器人(附源码)
上一篇文章,写了基本框架,可能很多人会觉得晕头转向,这里提供一个简单的例子来予以说明,希望能帮你解开谜团。
一、功能介绍
通过微信公众平台实现在线客服机器人功能。主要的功能包括:简单对话、查询天气等服务。
这里只是提供比较简单的功能,重在通过此实例来说明公众平台的具体研发过程。只是一个简单DEMO,如果需要的话可以在此基础上进行扩展。
当然后续我们还会推出比较复杂的应用实例。
二、具体实现
1、提供访问接口
这里不再赘述,参照上一章,微信公众账号开发教程(二) 基础框架搭建
www.cnblogs.com/yank/p/3392394.html
2、签名认证和分发请求
这里不再赘述,参照上一章,微信公众账号开发教程(二) 基础框架搭建
www.cnblogs.com/yank/p/3392394.html
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 = 欢迎您关注***,我是大哥大,有事就问我,呵呵!\n\n; 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 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://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 = 暂时没有取到天气数据,请稍后再试; } 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; } } }
【相关推荐】
1. 微信公众号平台源码下载
2. 阿狸子订单系统源码
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。