微信快速开发框架(五)-- 利用快速开发框架,快速搭建微信浏览博客园首页文章

这几天接连发布了《快速开发微信公众平台框架---简介》和《体验微信公众平台快速开发框架》几篇关于微信平台的文章,不过反响一般,可能需求不是很多吧。闲来无事,还是继续改造一下这个框架。

今天更新了框架代码,听取了 @RMay 的建议,加入了一个信息中间件,用来处理xelement,避免了重复解析,所以所有接口都更改了下。此次更新如下:

1、增加信息中间件MiddleMessage

2、更改了接口参数类型,把原来的XElement都改成了MiddleMessage

3、删除了Demo项目,以后都用WebDemo进行演示。

所有代码都已经更新到我的Gibhub

介绍了更新内容,下面继续打造我们的Demo项目。

之前我们写的,都是返回文本信息,今天上午,我加入了一个CnblogsArticleNewsMessageHandler,主要是返回一个ResponseNewsMessage(图文信息),只要发消息:博客园文章,就能获取在首页前5的文章列表,但为了避免给博客园造成鸭梨,我把信息缓存了下,10分钟更新一次。这次主要采用了webclient+正则的方式,采集的方式无所谓,大家都可以自由发挥。

先看下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:今天收到宝宝的台历了,哈,真嗲

时间: 2024-10-18 05:47:27

微信快速开发框架(五)-- 利用快速开发框架,快速搭建微信浏览博客园首页文章的相关文章

asp.net利用存储过程和div+css实现分页(类似于博客园首页分页)_实用技巧

首先声明以下几点: 1.也许讲解有点初级,希望高手不要"喷"我,因为我知道并不是每一个人都是高手,我也怕高手们说我装13,小生不才: 2.如有什么不对的地方,还希望大家指出,一定虚心学习: 3.本文属于作者原创,尊重他人劳动成果,转载请注明作者,谢谢. 下面开讲: 首先说下思路,写一个存储过程,我也找了一个存储过程,不过不是我写的,出处:http://www.cnblogs.com/zhongweiv/archive/2011/10/31/JqueryPagination.html 这

微信小程序实现博客园文章阅读功能

在微信小程序开发中,我们可以根据不同的业务场景,开发不同的业务应用,可以基于自身域名服务接口,也可以基于第三方的域名接口进行处理(如果被禁用除外),本篇随笔介绍使用小程序来实现我博客(http://wuhuacong.cnblogs.com)的文章阅读功能,这个小程序主要用来介绍使用介绍基于Javascript的正则表达式的处理应用,和常规在C#里面使用正则表达式有一些差异,因此可以作为后续使用正则表达式处理业务数据的一个练兵吧. 1.Request接口合法域名配置 一般情况下,我们知道微信的R

在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能

本篇随笔介绍在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能,首先对Quartz.NET进行一个简单的介绍和代码分析,掌握对作业调度的处理,然后对博客园RSS内容的处理如何获取,并结合微信消息的群发接口进行内容的发送,从而构建了一个在Web应用中利用作业调度来进行消息发送的业务模型. Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)

李伟举:我利用软文推广的八个博客渠道

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 我每天首发的的博客有两个:一个是用ZBLOG做的ASP的个人独立博客;一个是用WP做的PHP的企业独立博客.只要有时间我都会在这两个博客发文章,分享我学到的经验.其实我还有很多的博客,主要是转发这两个博客的文章,今天主要想和大家分享一下利用软文推广的几个博客渠道. 1.Wordpress博客 WordPress博客官网可以注册你的二级域名博客

利用SEO技术搭建营销型博客网站

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 长沙SEO:上次的文章<合理利用百度HI空间推广自己的网站>讲了利用百度HI空间推广自己的网站的大体思路,这次主要谈论如何通过SEO手法使自己的博客在百度上获得较好的名次.下面分步骤来讲述我的这次实战操作. 1.博客程序的选择:我选择z-blog来搭建我的营销型博客网站,z-blog支持伪静态,并且全站的标签调用比较清晰,非常方便

利用Jekyll在GitHub Pages上部署博客

开始之前 我觉得阮一峰的<搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门>是一个很经典的入门,每个Jekyll初学者都应该先去看一看,另外GitHub Pages官网以及Jekyllcn也是遇到问题时首先要查找的站点. 需要对Git的基本操作有些了解: Git基本操作 ##设置全局用户名和email,作为每次提交的记录 git config --global user.name "name" git config --global us

五个最值得关注的seo blog博客

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 这次给大家推荐5个国外最具有学习价值的seo blog博客. 1) Aaron Wall - SEOBook.com 是在互联网上最好的seo blog之一.我真的喜欢他直接了当的文章风格.在他文章里,他会告诉我们真正感兴趣的搜索引擎信息. 2) MICHAEL GRAY-Wolf-Howl.com 是唯一一些能得到Matt Cutts评论的

利用正则表达式抓取博客园列表数据_正则表达式

鉴于我在要完成的asp.net MVC 3 仿照博客园企业系统要用到测试数据,我自己输入太累,所以我就抓取了博客园的部分列表数据,还请dudu不要见怪. 在抓取博客园数据的时候采用了正则表达式,所以有不熟悉正则表达式的朋友可以参考相关资料,其实很容易掌握,就是在具体的实例中会花些时间. 现在我就来把我抓取博客园数据的过程叙述一下,如果有朋友有更好的意见,欢迎提出来. 要使用正则表达式抓取数据,首先就要创建一个正则表达式进行匹配,我推荐使用regulator,这个正则表达式工具,我们可以先使用这个

如何利用http协议发布博客园博文评论_php实例

先给大家介绍下实现原理: 给博文提交评论的实质就是通过http协议服务器发送一个post请求.在发布评论前,我们需要做什么呢?对,是必须要登录的.但登录是另一件事情,我们这里先不讨论.用户登录后,服务器给客户端设置一个cookie.http是无状态的.也就是说客户端向服务器发送请求后,服务器返回响应.一次通信完成.服务器不会记得刚才是谁向自己发送请求.所以客户端需要拿着服务器给自己设定好的cookie向服务器发送请求并告知服务器自己的身份,服务器根据cookie产生响应. 准备工作: 为了完成本