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

文章统计跟踪器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2021年7月22日

CPOL

5分钟阅读

viewsIcon

6430

downloadIcon

196

一个跟踪您的 CodeProject 文章统计信息的简单应用程序。

引言

当你没有朋友,没有社交生活,只关心点击量、浏览量和喜欢数……这实在有点可悲。

但如果你像我一样,是一个专业的“专业闲散人员”,并且无事可做,只能看着数字提醒你该多出去走走,那么我这里正好有一个东西。

我没有社交生活的唯一原因是我待在家里写关于应用程序和文章(更不用说我内省的“我不在乎”性格缺陷了)。如果你也没有自己的生活,那么这个工具可以帮助你消磨时间,同时欣赏你自己(真实的或想象的)写作才能在这个统计的镜子里映射出来,以此来弥补你朋友的缺失。你可能会发现关于你自身价值的令人沮丧的真相。除非你有朋友、家人和爱你的人,那样的话,就不用管这些了。

应用程序

上图显示了我文章列表的最新报告。显然,有人刚刚下载了 “线索游戏” 的副本,现在正快乐地在“污秽的豪宅”里侦探,询问 Peacock 女士是否在舞厅里拿着扳手。首次运行时,默认 URL 设置为我的,所以如果你想看到你自己的,你需要调用 ContextMenu 并点击 setURL

然后会弹出一个分组框,你可以在其中复制粘贴 Code-Project 作者的文章列表(通过点击页面右上角你名字下方出现的“我的文章”选项找到)。将相应的 URL 粘贴到文本框中,然后点击 ok。第一次加载时,应用程序不会报告任何更改,因为它以前从未见过该页面。你可以在下图中看到,Bin/Debug/ 目录(工作目录)中有一些文件,其中包含看起来可疑的 XML 文件。这就是你文章信息的存储位置。当你尝试了几个不同的作者的文章列表后,每个作者都有自己的 XML 文件,应用程序会在 URL 输入 textbox 下方的 ListBox 中提供一个可供选择的姓名列表。当你点击 listbox 中的姓名时,就会加载该作者的文章,进行比较并报告更改。

当你运行这个应用程序时,你会注意到“Views”(浏览量)统计数据总是以 10 的倍数递增,但请放心,Code-Projects 的年鉴中并没有隐藏着点击农场,它们以十倍的速度浏览你的文章,试图让你觉得你实际上有读者,浏览量被人为地夸大了……不,不,不。这里发生的是,浏览量正在被正确地统计,并且只有当它们达到最低计数十次时,包含你所有文章的网页才会被更新。弗拉基米尔·普京与此无关。

菜单选项都很直接。

  • Refresh - 重新加载选定作者的文章并更新输出
  • set Delay - 更改自动更新之间的延迟时间
  • set URL - 输入新的 URL
  • set Toggles - 允许你选择要报告哪些字段
  • clear - 清空 RichTextBox 中的文本(rtx 将在运行时保存并重新加载)
  • Hide - 隐藏窗体,直到更新导致你的统计数据发生变化。你也可以使用 CTRL-PrntScrn 键来切换窗体的 Visible 属性。
  • TopMost - 选中时将应用程序的窗体保持在 Windows 前台
  • exit - 我差点把它命名为 Egress,但与 P.T. Barnum 不同,我没看到其中的利润。

Using the Code

这个应用程序没什么复杂的。我一直在使用一个叫做 HTML-ator 的工具来弄清楚我需要对 HTML 文件做什么才能从网站上提取我想要的数据。使用这个工具,我解析了 HTML 文件,提取了文章统计数据,并将它们存储在一个 classArticle 对象列表中,该列表跟踪它们的统计数据。这些文章以标题作为搜索键存储在二叉树中,然后当选定的作者更改时记录到 XML 文件中。

这里有一些从 classURL 中解析 HTML 的代码

public List<classArticleChanges> GetReports() 方法。

它定义了一个 HTML 标签的结束,该标签出现在每篇文章信息之前。然后它查找这个 HTML 标签的实例,并提取告诉你的网页浏览器如何绘制每篇文章统计数据的 HTML 片段。

string strArticle_Field_Start = "<tr id=";
string strArticle_Field_End = "MainArticleRow\" valign=\"top\">";

int intArticleIndex_End = strHTML_Source.IndexOf(strArticle_Field_End);

int intArticleIndex_Start = intArticleIndex_End;
int intTemp = 0;
string strDebug = "";
int intBest = strHTML_Source.IndexOf(strArticle_Field_Start);
while (intTemp >= 0 && intTemp < intArticleIndex_End)
{
    intTemp = strHTML_Source.IndexOf(strArticle_Field_Start, intTemp + 1);
    strDebug = intTemp >= 0
                            ? strHTML_Source.Substring(intTemp, 130)
                            : "";
    if (intTemp >= 0 && intTemp < intArticleIndex_End)
        intBest = intTemp;
}
intArticleIndex_Start = intBest;
                        
strDebug = intBest >= 0
                    ? strHTML_Source.Substring(intBest, 130)
                    : "";
            
while (intArticleIndex_Start >= 0 && intArticleIndex_End > intArticleIndex_Start)
{
    string strHTML_Article = classStringLibrary.HTML_GetNext
           (strHTML_Source, "<tr", "</tr>", intArticleIndex_Start);
    strHTML_Source = strHTML_Source.Replace(strHTML_Article, "");
    List<classArticle_Field> lstFields = classArticle.getFields(strHTML_Article);
    if (lstFields != null)
    {
        classArticle cArticle = classArticle.Tree_Search
                                ((string)lstFields[(int)enuArticleFields.Title].value);
        if (cArticle == null)
        {
            cArticle = new classArticle();
            cArticle.lstFields_Current
                = cArticle.lstFields_Next
                = lstFields;
            classArticle.Tree_Insert(ref cArticle);
        }
        lstArticles.Add(cArticle);

        cArticle.lstFields_Current = cArticle.lstFields_Next;
        cArticle.lstFields_Next = lstFields;
                    

然后,在下面的 While-Loop 部分,调用

string strHTML_Article = 
  classStringLibrary.HTML_GetNext(strHTML_Source, "<tr", "</tr>", intArticleIndex_Start);

提取每篇文章的 HTML,并通过下一个调用提取该文章不同的“字段”统计信息,该调用会删除所有 HTML 标签,精简结果文本直到看起来像英文,然后解析出相关的统计信息到一个列表中。

List<classArticle_Field> lstFields = classArticle.getFields(strHTML_Article);

然后使用 lstFields 中的 Title 字段在 Articles 二叉树中搜索 classArticle 的现有实例。如果在树中找不到该名称的文章,则创建一个新的文章,并将其插入到树中,将新的统计信息列表设置为“旧”数据和“新”数据,并且本次不记录更改。如果在树中找到一篇文章,则将其旧数据与新数据进行比较,并将这些统计数据中的任何更改显示在屏幕上。

关注点

不……没什么复杂的。我没有进行任何“尝试崩溃它”的硬核测试,但它已经稳定运行几天了,所以应该没问题。

历史

  • 2021 年 7 月 21 日:文章发布
  • 2022 年 3 月 21 日:CodeProject.com 网站的更改需要代码更新
© . All rights reserved.