原文地址: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還不涉及到數據庫,暫時都是手工判斷。
接下來上傳代碼,測試一下:
輸入博客園:
輸入博客園文章:
測試完成,還能湊活用用,後續會用一個統一的文本命令方式,但有點糾結,不知道用什麼方式,你們能夠提供下意見。目前想到的是:
關鍵字+命令+參數(可選)
博客園+inday+5(博客園,用戶爲inday,前5文章)
天氣+上海(獲取上海今天的天氣)
天氣+上海+3(獲取上海將來3天的天氣)
後面會寫一系列教程,儘可能把經常使用的消息類型都用到。
PS:求職下吧,上海地區+電子商務類型公司,最好有旅遊行業,職位的話無所謂,一個擡頭而已,有發展前景,因本人30+了,不太想常常換工做了,薪資12k+就行,對於自我評價,還算是個負責的人,項目也好,學習也好,都會投入進去,對於C#比較精通點,也能夠其餘語言。須要的Email給我:james#taogame.com(#->@)
PS2:今天收到寶寶的檯曆了,哈,真嗲