文章统计跟踪器





5.00/5 (1投票)
一个跟踪您的 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 网站的更改需要代码更新