UWP 获取博客园积分,并以图标形式呈现变化趋势

先看一下效果吧

1. 分析

说实话,之前还真没在乎过博客园的排名和积分,博客园默认也不给显示。需要自己到选项里面勾选才可以。

之前也有几个大佬写过类似的文章,不过是很早了。博客园关于获取积分的api已经变了。

也不算是api吧,毕竟不是官方公开的。不过自己可以通过查看页面元素,找到博客园的积分url。

在你勾选?了上面的选项之后,打开你的博客主页,比如我的就是https://www.cnblogs.com/hupo376787/

按F12,调出开发者工具,进入Network选项卡。

如果在下面的列表里面没有数据,F5刷新一下页面即可。

然后,点击【sidecolumn.aspx】,右侧就会出现相信的信息。

右击【sidecolumn.aspx】,【copy link address】,这个url就是我们要找的。

然后根据这个url返回的信息,我们利用正则表达式或者其他手段找到积分和排名的数据即可。

2. 写Xaml界面

既然根据上面的分析,可以拿到积分和排名的数据,那么写代码就简单多了。

我这里使用C#来写的,语言只是一种工具,你也可以用Java、Swift、JavaScript、Flutter等,还可以用Python写。

无论哪一种,只要能拿到数据,用图表展示出来即可。

在xaml中,定义一下用户名输入框,还有一个图表控件。

图表使用的Microcharts。这是一个开源的图表控件,Github上已经斩获1000多个??????????

<StackPanel>
            <TextBox
                x:Name="textBlockUser"
                Background="Transparent"
                Padding="0, 5"
                BorderThickness="0"
                Width="200"
                HorizontalAlignment="Left"
                PlaceholderText="hupo376787"
                TextChanged="User_TextChanged"/>
            <TextBlock x:Name="textBlockDate"/>
            <TextBlock x:Name="textBlockScore"/>
            <TextBlock x:Name="textBlockRank"/>

            <charts:ChartView x:Name="microChart"
                              Height="300"/>
        </StackPanel>

3. 获取网页数据

利用HttpClient写代码,获取指定url的网页源代码。

user是文本框可以输入的用户id。

然后根据Http返回来的数据,做成一个List<string>。这样就不用写正则表达式查找??了。

其实主要是我不大会写正则表达式而已。

不好意思暴露了。

 string url = "https://www.cnblogs.com/" + user + "/ajax/sidecolumn.aspx";
                HttpClient client = new HttpClient();
                HttpResponseMessage message = await client.GetAsync(url);
                string content = await message.Content.ReadAsStringAsync();
                List<string> lines = content.Replace("积分与排名", "").Split("\n").ToList();

                var scoreHeaderIndex = lines.FindIndex(x => x.Contains("积分"));
                var rankHeaderIndex = lines.FindIndex(x => x.Contains("排名"));

                int score = Convert.ToInt32(lines[scoreHeaderIndex + 1]);
                int rank = Convert.ToInt32(lines[rankHeaderIndex + 1]);

4. 生成图表

因为要做成趋势图,并且博客园返回的数据只是当天的信息,并不不包含历史记录。

所以需要手动记录数据,并存放在本地。

之前那几个大佬也是这样子,写成了python或者js,每天自动运行一次,保存数据。

UWP想要记录数据,需要一点额外的权限。

因为需要记录txt文件,而这样的文本文件最好放在user/document文件夹下。

首先,用记事本打开Package.appxmanifest,加上

<Capabilities>
   <uap:Capability Name="documentsLibrary" />
</Capabilities>

然后在vs中打开Package.appxmanifest,添加声明。按照图示设置。

这样就有权限写入txt到文档文件夹了。

                StorageFolder storageFolder = KnownFolders.DocumentsLibrary;
                StorageFile file = await storageFolder.CreateFileAsync("cnBlogs.txt", CreationCollisionOption.OpenIfExists);
                string existData = await FileIO.ReadTextAsync(file);
                List<string> list = existData.Split("\r\n").ToList();

我这儿首先读取了txt里面的数据,如果这个txt不存在,就创建。已经存在的话,直接打开读取数据。

然后绘图

                Random rnd = new Random();
                List<ChartEntry> entries = new List<ChartEntry>();
                foreach(var item in list)
                {
                    if (item.Trim() == "")
                        continue;

                    var singleLineArray = item.Split(",");
                    var entry = new ChartEntry((float)Convert.ToDouble(singleLineArray[1]))
                    {
                        Label = singleLineArray[0],
                        ValueLabel = singleLineArray[1],
                        Color = SKColor.Parse(String.Format("#{0:X6}", rnd.Next(0x1000000)))
                    };
                    entries.Add(entry);
                }var chart = new LineChart {
                    Entries = entries,
                    MinValue = 100000,
                    BackgroundColor = SKColors.Transparent
                };
                this.microChart.Chart = chart;

如果在生成折线图的时候,不加上

BackgroundColor = SKColors.Transparent

生成的图表默认白色。但是背景透明好看。

5. 记录获取的积分和排名数据

为了防止一天内多次打开app,重复记录,所以我做了一个检查。

利用System.IO写入数据。

                string contentToWrite = "";
                //Add Today
                if (!existData.Contains(DateTime.Now.ToString("yyyy-MM-dd")))
                {
                    var entryToday = new ChartEntry((float)Convert.ToDouble(score))
                    {
                        Label = score.ToString(),
                        ValueLabel = DateTime.Now.ToString("yyyy-MM-dd"),
                        Color = SKColor.Parse(string.Format("#{0:X6}", rnd.Next(0x1000000)))
                    };
                    entries.Append(entryToday);

                    contentToWrite = existData + "\r\n" + DateTime.Now.ToString("yyyy-MM-dd") + "," + score + "," + rank;
                }
                else
                    contentToWrite = existData;

                //Write
                await FileIO.WriteTextAsync(file, contentToWrite);

6. 完成的代码

        private async Task GetData(string user)
        {
            try
            {
                string url = "https://www.cnblogs.com/" + user + "/ajax/sidecolumn.aspx";
                HttpClient client = new HttpClient();
                HttpResponseMessage message = await client.GetAsync(url);
                string content = await message.Content.ReadAsStringAsync();
                List<string> lines = content.Replace("积分与排名", "").Split("\n").ToList();

                var scoreHeaderIndex = lines.FindIndex(x => x.Contains("积分"));
                var rankHeaderIndex = lines.FindIndex(x => x.Contains("排名"));

                int score = Convert.ToInt32(lines[scoreHeaderIndex + 1]);
                int rank = Convert.ToInt32(lines[rankHeaderIndex + 1]);

                textBlockDate.Text = DateTime.Now.ToString("yyyy-MM-dd");
                textBlockScore.Text = score.ToString();
                textBlockRank.Text = rank.ToString();

                StorageFolder storageFolder = KnownFolders.DocumentsLibrary;
                StorageFile file = await storageFolder.CreateFileAsync("cnBlogs.txt", CreationCollisionOption.OpenIfExists);
                string existData = await FileIO.ReadTextAsync(file);
                List<string> list = existData.Split("\r\n").ToList();

                Random rnd = new Random();
                List<ChartEntry> entries = new List<ChartEntry>();
                foreach(var item in list)
                {
                    if (item.Trim() == "")
                        continue;

                    var singleLineArray = item.Split(",");
                    var entry = new ChartEntry((float)Convert.ToDouble(singleLineArray[1]))
                    {
                        Label = singleLineArray[0],
                        ValueLabel = singleLineArray[1],
                        Color = SKColor.Parse(String.Format("#{0:X6}", rnd.Next(0x1000000)))
                    };
                    entries.Add(entry);
                }

                string contentToWrite = "";
                //Add Today
                if (!existData.Contains(DateTime.Now.ToString("yyyy-MM-dd")))
                {
                    var entryToday = new ChartEntry((float)Convert.ToDouble(score))
                    {
                        Label = score.ToString(),
                        ValueLabel = DateTime.Now.ToString("yyyy-MM-dd"),
                        Color = SKColor.Parse(string.Format("#{0:X6}", rnd.Next(0x1000000)))
                    };
                    entries.Append(entryToday);

                    contentToWrite = existData + "\r\n" + DateTime.Now.ToString("yyyy-MM-dd") + "," + score + "," + rank;
                }
                else
                    contentToWrite = existData;

                var chart = new LineChart {
                    Entries = entries,
                    MinValue = 100000,
                    BackgroundColor = SKColors.Transparent
                };
                this.microChart.Chart = chart;

                //Write
                await FileIO.WriteTextAsync(file, contentToWrite);
            }
            catch
            {

            }
        }

之所以加了try{ ... } catch{ ... },是因为在输入用户名的时候,可以根据文本变化,实时检测是不是有效的用户,并生成图表。

7. 总结

获取并显示数据,本身不是一件很难的事情,关键是怎么利用得到的数据,并把它很有的呈现出来。

当然,我这里也少做了一步,就是让应用自启动,开机的时候获取一次数据,这样就可以防止某天忘记打开,导致数据断层的问题了。

关于uwp如何随开机启动,我还没研究过,以后有时间的写一些分享心得。

OK,Merry Christmas!Lonely Christians!

??????????????????????????????????????

??????????????????????

????????????????????????????????????????????

??????????????????????????????????????

????????????????????????????????????????

????????????????????????????????????????

原文地址:https://www.cnblogs.com/hupo376787/p/12094009.html

时间: 2024-08-27 18:28:58

UWP 获取博客园积分,并以图标形式呈现变化趋势的相关文章

博客园积分与排名升级攻略(转)

博客园积分算法探讨 今天在dudu的<博客园FAQ>上看到了博客积分算法规则.因为同样是搞互联网的,平时工作也涉及到用户积分算法的设计,所以特把此问题拿出来分析探讨.初衷只是纯学术的研究探讨,并不构成对博客园积分机制的意见建议. 我们先来看看现行规则,用公式表示为:-------------------------------------------------------------------BlogScore = BeRead + 10 * BeComment + 50 * Commen

使用Nodejs获取博客园博客数据并处理转发

通过查询了解到博客园是有开发博客查询相关的接口的,列表如下: Uri Method Description 48HoursTopViewPosts/{itemCount} GET 48小时阅读排行 bloggers/recommend/{pageIndex}/{pageSize} GET 分页获取推荐博客列表 bloggers/recommend/count GET 获取推荐博客总数 bloggers/search GET 根据作者名搜索博主 post/{postId}/comments/{pa

使用python获取博客园作者的文章列表的超链接以及标题

# -*- coding: utf-8 -*- """ Created on Thu Jun 12 09:37:48 2014 @author: lifeix """ import re import urllib2 import cookielib url = 'http://www.cnblogs.com/wendingding/tag/IOS%E5%BC%80%E5%8F%91/default.html?page=' #url = 'htt

[2016-02-18][通过wiz为知笔记给博客园发博客]

1.打开wiz并编辑笔记,wiz笔记带有发布博客的插件,对,就是上面那个东西 2.获取博客园api地址(其他的博客请点上面的帮助,or百度) 打开你的博客园博客的管理页面,在设置选项卡页面最下面的MetaWeblog访问地址就是了 3.复制上面的API地址,端口默认80,用户名密码你懂的,然后点确定即可 常见的问题: 1.API地址不对,点下面的获取最新分类会提示错误,(但是用户名密码错误是没有提示的) 2.如果笔记存在系统目录下,权限不够的话,会提示未知错误(嗯,本人系统权限被弄得乱七八糟,结

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

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

Scrapy爬取博客园精华区内容

程序爬取目标 获取博客园精华区文章的标题.标题链接.作者.作者博客主页链接.摘要.发布时间.评论数.阅读数和推荐数,并存储到MongoDB中. 程序环境 已安装scrapy 已安装MongoDB 创建工程 scrapy startproject cnblogs 在命令提示符中执行上述命令后,会建立一个名为cnblogs的文件夹. 创建爬虫文件 cd cnblogs scrapy genspider cn cnblogs.com 执行上述命令后,会在cnblogs\spiders\下新建一个名为c

黄聪:博客园的积分和排名算法探讨,积分是怎么计算的?(转)

我们先来看看现行规则,用公式表示为:-------------------------------------------------------------------BlogScore = BeRead + 10 * BeComment + 50 * CommentBlogScore:博客积分BeRead:个人博客所有随笔和文章的阅读数之和BeComment:个人博客被评论总数Comment: 个人所发表的评论总数---------------------------------------

博客园 博客积分与排名 查看设置

博客园 博客积分与排名 查看设置 博客园 博客积分与排名 默认是不显示的. 如果想要显示出来,需要在博客园的“设置”里进行设置. 具体操作步骤如下: 1.在博客园的“设置”中,选择“常用选项”,点击进入. 2.在“选项”中,找到“积分与排名”,勾选,保存即可. 3.刷新博客页面,即可看到自己博客的积分与排名情况,效果如下: 原文地址:https://www.cnblogs.com/miracle-luna/p/11789269.html

Python爬虫入门教程:博客园首页推荐博客排行的秘密

1. 前言 虽然博客园注册已经有五年多了,但是最近才正式开始在这里写博客.(进了博客园才知道这里面个个都是人才,说话又好听,超喜欢这里...)但是由于写的内容都是软件测试相关,热度一直不是很高.看到首页的推荐博客排行时,心里痒痒的,想想看看这些大佬究竟是写了什么文章这么受欢迎,可以被推荐.所以用Python抓取了这100位推荐博客,简单分析了每个博客的文章分类,阅读排行榜,评论排行榜及推荐排行榜,最后统计汇总并生成词云.正好这也算是一篇非常好的Python爬虫入门教程了. 2. 环境准备 2.1