微信公眾平台開發教程(四) 執行個體入門:機器人回複(附源碼)_javascript技巧

來源:互聯網
上載者:User

上一篇文章,寫了基本架構,可能很多人會覺得暈頭轉向,這裡提供一個簡單的例子來予以說明,希望能幫你解開謎團。

一、功能介紹

通過微信公眾平台實現線上客服機器人功能。主要的功能包括:簡單對話、查詢天氣等服務。

這裡只是提供比較簡單的功能,重在通過此執行個體來說明公眾平台的具體研發過程。只是一個簡單DEMO,如果需要的話可以在此基礎上進行擴充。

當然後續我們還會推出比較複雜的應用執行個體。

二、具體實現

1、提供提供者

這裡不再贅述,參照上一章,微信公眾帳號開發教程(二) 基礎架構搭建
http://www.jb51.net/article/98754.htm

2、簽名認證和分發請求

這裡不再贅述,參照上一章,微信公眾帳號開發教程(二) 基礎架構搭建
http://www.jb51.net/article/98754.htm

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; }    }  }

 三、源碼

這裡可是可執行檔代碼哦。應大家的需求,這裡提供全部的原始碼。

demo下載

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.