(轉)利用快速開發框架,快速搭建微信瀏覽博客園首頁文章

原文地址:http://www.cnblogs.com/inday/p/weixin-publicf-platform-cnblogs.htmlhtml

這幾天接連發布了《快速開發微信公衆平臺框架---簡介》和《體驗微信公衆平臺快速開發框架》幾篇關於微信平臺的文章,不過反響通常,可能需求不是不少吧。閒來無事,仍是繼續改造一下這個框架。git

今天更新了框架代碼,聽取了 @RMay 的建議,加入了一個信息中間件,用來處理xelement,避免了重複解析,因此全部接口都更改了下。這次更新以下:github

一、增長信息中間件MiddleMessageweb

二、更改了接口參數類型,把原來的XElement都改爲了MiddleMessage正則表達式

三、刪除了Demo項目,之後都用WebDemo進行演示。數據庫

全部代碼都已經更新到個人Gibhub緩存

介紹了更新內容,下面繼續打造咱們的Demo項目。微信

以前咱們寫的,都是返回文本信息,今天上午,我加入了一個CnblogsArticleNewsMessageHandler,主要是返回一個ResponseNewsMessage(圖文信息),只要發消息:博客園文章,就能獲取在首頁前5的文章列表,但爲了不給博客園形成鴨梨,我把信息緩存了下,10分鐘更新一次。此次主要採用了webclient+正則的方式,採集的方式無所謂,你們均可以自由發揮。mvc

先看下CnblogsArticleNewsMessageHandler:微信公衆平臺

public class CnblogsArticleNewsMessageHandler : IMessageHandler { public ResponseMessage HandlerRequestMessage( MiddleMessage msg) { //var request = new RequestTextMessage(xml); var response = new ResponseNewsMessage (msg.RequestMessage); var cnblogsFeed = new CnBlogsFeed (5); var articles = cnblogsFeed.GetTopCnblogsFeed(); response.ArticleCount = articles.Count; response.CreateTime = DateTime .Now.Ticks; response.Articles = articles; return response; } }

摺疊代碼

你們能夠看到,接口參數已經改爲了MiddleMessage,這樣就避免了原先我再new一個RequestMessage了, 直接用了MiddleMessage.RequestMessage。

CnBlogsFeed是一個本身寫的採集類,目的是採集博客園首頁數據,數字類型的構造函數,是一個提取數量,由於微信平臺的限制,這個值必須在1-10之間。

由於是圖文消息,而博客園呢只在Description中提供了用戶的頭像,而微信多圖文消息會把第一篇文章的圖片做爲主圖,大小爲:320*200,因此我把第一張圖片作成了默認圖片,小圖的話若是用戶有頭像就用用戶的頭像,若是沒有則會顯示一個默認小圖,大小爲:200*200。

看下CnBlogsFeed類,寫的很差,將就看看吧:

public class CnBlogsFeed { private int m_topNum = 5; //緩存過時時間,這裏是10分鐘 private static int s_timeout = 10 * 60 * 1000; //緩存過時時間 private static DateTime s_outDate = DateTime .Now; //博客園文章列表正則表達式 private static Regex s_cnblogsIndexRegex = new Regex ( "<div\\s*class=\"post_item\">\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*<div\\s*class=\"post_item_body\">\\s*<h3><a\\s*class=\"titlelnk\"\\s*href=\"(?<href>.*)\"\\s*target=\"_blank\">(?<title>.*)</a>.*\\s*<p\\s*class=\"post_item_summary\">\\s*(?<content>.*)\\s*</p>" ); //內容中,用戶頭像正則表達式 private static Regex s_picUrlRegex = new Regex ( "src=\"(?<picurl>.*)\"\\s" ); //博客園文章列表uri private static string s_cnblogsIndexUri = "http://www.cnblogs.com/mvc/AggSite/PostList.aspx?CategoryId=808&PageIndex=1" ; //默認的一個大圖,一個小圖的圖片地址 private static string s_defaultBigPicUri = "http://wx.jamesying.com/images/default_title.jpg" ; private static string s_defaultSmallPicUri = "http://wx.jamesying.com/images/default_small.jpg" ; //用來緩存請求過來的數據,不高興用Cache了。 private static List < Article > s_articles = null ; public CnBlogsFeed( int topNum) { m_topNum = topNum; } public List < Article > GetTopCnblogsFeed() { if (s_articles == null ) { GetTopCnblogsFeed(m_topNum); } else { if ( DateTime .Now > s_outDate) { GetTopCnblogsFeed(m_topNum); } } return s_articles; } private void GetTopCnblogsFeed( int m_topNum) { try { var html = GetRemoteUri(s_cnblogsIndexUri, Encoding .UTF8); var matchs = s_cnblogsIndexRegex.Matches(html); var i = 0; s_articles = new List < Article >(); foreach ( Match match in matchs) { if (i >= m_topNum) break ; var article = new Article { Title = match.Groups[2].Value, Url = match.Groups[1].Value, Description = match.Groups[3].Value }; if (i == 0) { article.PicUrl = s_defaultBigPicUri; } else { var matchPic = s_picUrlRegex.Match(article.Description); if (matchPic.Success) { article.PicUrl = matchPic.Groups[1].Value; } else { article.PicUrl = s_defaultSmallPicUri; } } s_articles.Add(article); i += 1; } s_outDate = DateTime .Now.AddMilliseconds(s_timeout); } catch ( Exception ex) { s_articles = null ; s_outDate = DateTime .Now; #if DEBUG throw ex; #endif } //return s_articles; } private string GetRemoteUri( string uri, Encoding encoding) { var client = new WebClient (); client.Encoding = encoding; return client.DownloadString(uri); } }

摺疊代碼

基本工做完成,只要更改以前的TextMessageRole:

public IMessageHandler MessageRole( MiddleMessage msg) { var request = ( RequestTextMessage )msg.RequestMessage; if (request.Content.IndexOf( "博客園文章" ) > -1) { return new CnblogsArticleNewsMessageHandler (); } if (request.Content.IndexOf( "博客園" ) > -1) { return new CnblogsTextMessageHandler (); } return new DefaultMessageHandler (); }

摺疊代碼

這個規則簡陋了點,以後會考慮下,打造一個文本命令的規範,由於Demo還不涉及到數據庫,暫時都是手工判斷。

接下來上傳代碼,測試一下:

輸入博客園:

image

 

輸入博客園文章:

image

 

 

測試完成,還能湊活用用,後續會用一個統一的文本命令方式,但有點糾結,不知道用什麼方式,你們能夠提供下意見。目前想到的是:

關鍵字+命令+參數(可選)

博客園+inday+5(博客園,用戶爲inday,前5文章)

天氣+上海(獲取上海今天的天氣)

天氣+上海+3(獲取上海將來3天的天氣)

後面會寫一系列教程,儘可能把經常使用的消息類型都用到。

PS:求職下吧,上海地區+電子商務類型公司,最好有旅遊行業,職位的話無所謂,一個擡頭而已,有發展前景,因本人30+了,不太想常常換工做了,薪資12k+就行,對於自我評價,還算是個負責的人,項目也好,學習也好,都會投入進去,對於C#比較精通點,也能夠其餘語言。須要的Email給我:james#taogame.com(#->@)

PS2:今天收到寶寶的檯曆了,哈,真嗲

相關文章
相關標籤/搜索