65.9K
CodeProject 正在变化。 阅读更多。
Home

Code Project 文章信息库(第 1 部分)

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.05/5 (14投票s)

2008年4月27日

CPOL

5分钟阅读

viewsIcon

54621

downloadIcon

520

此库提供了一个在应用程序中使用 Code Project 文章信息的框架,并提供了一个用于监视文章的实用程序。

codeprojectarticle3.jpg

codeprojectarticle2.jpg

引言

本文介绍了 CodeProject.dll 项目,该项目可用于从The Code Project提取信息。在本短系列文章的第一篇中,介绍了 ArticlesSummary,它允许通过会员编号提取文章信息。可以提取以下信息;

  • 标题
  • 描述
  • 网页链接
  • 最后更新日期
  • 浏览次数
  • 评分
  • 投票次数
  • Popularity

通过扩展,还可以计算以下信息(以及其他信息);

  • 每个用户的文章数
  • 平均评分/受欢迎程度

最后,介绍了一个用于监视用户文章更改的应用程序。

请勿滥用此库。此库允许自动更新从 Code Project 网站轮询的信息,请勿将更新间隔设置得太低,否则您将有效地执行拒绝服务攻击。如果发生这种情况太频繁,本文将被删除!您已被警告。

背景

本文基于 https://codeproject.org.cn/script/Articles/MemberArticles.aspx?amid=### 页面,其中 ### 是会员 ID。页面源代码中包含以下内容;

<span id="ctl00_MC_AR_ctl03_MAS">
   <b><a id="ctl00_MC_AR_ctl03_AT" href="https://codeproject.org.cn/KB/WPF/roundbutton.aspx">A
###LINE BREAK INSERTED TO REDUCE ARTICLE WIDTH###
 Microsoft Office Style WPF Application Button</a></b>

        

        
        
        
        
   <div id="ctl00_MC_AR_ctl03_SbD" class="subdue SmallText">
      Last Updated: 22 Mar 2008  
      Page Views: 8,278  
      Rating: 3.31 / 5  
      Votes: 6  
      Popularity: 2.57
      </div>
   <div style="margin-top:3;font-size:8pt;">An article presenting ApplicationButton used in 
###LINE BREAK INSERTED TO REDUCE ARTICLE WIDTH###
creating round buttons as per Microsoft Office Style application buttons</div>
</span>

总结如下;

<span id="ctl00_MC_AR_ctl03_MAS">
   <b><a id="ctl00_MC_AR_ctl03_AT" href="###relative web address###">###article title###</a></b>

        

        
        
        
        
   <div id="ctl00_MC_AR_ctl03_SbD" class="subdue SmallText">
      Last Updated: ###date###  
      Page Views: ###page views###  
      Rating: ###rating### / 5  
      Votes: ###number of votes###  
      Popularity: ###popularity###
      </div>
   <div style="margin-top:3;font-size:8pt;">###article description###</div>
</span>

解析的关键元素是 ctl00_MC_AR_ctl03_MAS、ctl00_MC_AR_ctl03_AT 和 ctl00_MC_AR_ctl03_SbD;其中 103 可以是任何数字(通常是 100 及以上)。

使用代码

该库围绕两个类 `Article` 和 `ArticleSummary` 构建,如下文所述。

ArticleSummary 执行实际的数据请求,并具有以下事件、方法和属性;

  • event ArticleAddedEventDelegate ArticleAdded* - 检测到新文章时触发。
  • ArticlesSummary(String userID) - 构造函数接受要监视的用户的会员编号。
  • String UserID {get;} - 返回正在监视的用户。
  • TimeSpan UpdateInterval {get;set;} - 在 `AutoUpdate` 为 true 时使用,表示数据检索之间的时间间隔。
  • bool AutoUpdate {get;set;} - 启用或禁用自动更新(本质上是在 `UpdateInterval` 间隔内调用 `update()`)。
  • List<Article> Articles {get;} - 返回指定会员姓名(或如果尚未调用 update() 则为空列表)的文章列表。
  • void update()void update(WebProxy proxy) - 更新文章列表;所有事件触发生成都发生在此函数的时间范围内。

Article 封装了文章的所有信息,并具有以下属性和事件;

  • event TitleChangedEventDelegate TitleChanged* - 文章标题更改时触发(通常仅在新文章添加时触发)。
  • event DescriptionChangedEventDelegate DescriptionChanged* - 文章描述更改时触发。
  • event LinkChangedEventDelegate LinkChanged* - 文章的网页地址更改时触发。
  • event LastUpdatedChangedEventDelegate LastUpdatedChanged* - 文章更新时触发。
  • event PageViewsChangedEventDelegate PageViewsChanged* - 页面浏览次数更改时触发。
  • event RatingChangedEventDelegate RatingChanged* - 页面评分更改时触发。
  • event VotesChangedEventDelegate VotesChanged* - 投票次数更改时触发。
  • event PopularityChangedEventDelegate PopularityChanged* - 文章受欢迎程度更改时触发。
  • String Title {get;} - 返回文章标题。
  • String Description {get;} - 返回文章的描述。
  • String Link {get;} - 返回文章的相对网址。
  • DateTime LastUpdated {get;} - 返回最后更新的日期。
  • int PageViews {get;} - 返回文章的浏览次数。
  • double Rating {get;} - 返回文章评分(满分 5 分)。
  • int Votes {get;} - 返回文章的投票数。
  • double Popularity {get;} - 返回文章的受欢迎程度。
  • string ToString() - 返回调试字符串。

* 在调用 `ArticleSummary` 上的 `update()` 时触发。

关于文章监视器

文章监视器是一个可以长时间运行的实用程序,它会显示一个弹出消息,指示新文章、投票数更改、受欢迎程度更改和评分更改。它是一个非常基础的实用程序,主要作为 CodeProject.dll 库的演示版本发布。

监视器由几个部分组成,顶行允许设置会员编号。中间部分显示用户已知文章的信息(单击“连接”后);信息每分钟更新一次。底行允许禁用弹出警报和一个手动更新按钮。

所有文章数据都存储在 `DataTable` 中,并在 WPF 控件(本文未介绍)中显示。数据视图通过 `updateTable()` 方法更新。

单击“连接”按钮时,会创建一个新的 `ArticlesSummary` 对象,并附加 `ArticleAdded` 事件。最后,设置 `AutoUpdate` 属性,然后调用 `update()`(强制即时初始同步)。

summary = new ArticlesSummary(memberIDTextBox.Text);
summary.ArticleAdded += new ArticlesSummary.ArticleAddedEventDelegate(summary_ArticleAdded);
summary.AutoUpdate = true;
summary.update();

处理 `ArticleAdded` 事件,并将发送的文章附加各种事件处理程序。向 `DataTable` 添加一个新的 `DataRow`,对应于添加的文章。最后更新表格视图。

DataRow dr = dataTable.NewRow();
dataRows.Add(article, dr);
dataTable.Rows.Add(dr);

article.TitleChanged += new Article.TitleChangedEventDelegate(article_TitleChanged);
article.LastUpdatedChanged += new Article.LastUpdatedChangedEventDelegate(article_LastUpdatedChanged);
article.PageViewsChanged += new Article.PageViewsChangedEventDelegate(article_PageViewsChanged);
article.RatingChanged += new Article.RatingChangedEventDelegate(article_RatingChanged);
article.VotesChanged += new Article.VotesChangedEventDelegate(article_VotesChanged);
article.PopularityChanged += new Article.PopularityChangedEventDelegate(article_PopularityChanged);

dr["Title"] = article.Title;
dr["Last Updated"] = article.LastUpdated;
dr["Page Views"] = article.PageViews;
dr["Rating"] = article.Rating;
dr["Votes"] = article.Votes;
dr["Popularity"] = article.Popularity;

文章事件处理程序更新相应的数据行和指定属性,然后再更新表格。如果事件在 `ArticleSummary` 上的初始 `update()` 调用期间未触发,则会显示一个弹出窗口,其中包含新信息(假定未禁用弹出窗口)。例如,`VotesChange` 事件处理程序如下;

private void article_VotesChanged(object sender, int value)
   {
      this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, 
                                new RefreshDelegate(delegate()
      {
         dataRows[(Article)sender]["Votes"] = ((Article)sender).Votes;
         if (!initialSync)
         {
            updateTable();

            if ((bool)soundAlertCheckBox.IsChecked)
            {
               SimplePopup.ShowPopup(((Article)sender).Title 
                                            + " votes changed to " + value);
            }
      }
   }));
}

请注意,事件处理程序强制将处理推送到事件分发线程,因为事件是从调用 `ArticleSummary.update()` 的线程触发的,而自动更新的情况下,该线程*不是*事件分发线程。

历史

版本 1.0.0.0 - 初始版本。

版本 1.0.0.1 - 添加了 User 类(参见第二部分)

有用链接

codeprojectarticle.aspx(第一部分,文章)

codeprojectuser.aspx(第二部分,用户)

codeprojectkevinbacon.aspx(第三部分,凯文·贝肯)

其他许可说明

请随时在您的工作中随意使用此代码,但请注意,此处使用的是修改版的 The Code Project Open License (CPOL),基本上它与标准许可证相同,只是此代码*不得*未经事先授权用于商业或非营利性商业用途。请参阅包含的源代码和演示文件中的 license.txt 或 license.pdf。

© . All rights reserved.