title author date CreateTime categories
dotnet 给MatterMost订阅RSS博客
lindexi
2019-10-19 08:12:36 +0800
2019-10-18 14:37:48 +0800
dotnet

其实MatterMost是有插件可以用来订阅RSS博客的,但是这个订阅插件需要一个个网址输入,而不是一次性输入很多个,于是我去就自己写了一个控制台程序做订阅

这个工具用到 Microsoft.SyndicationFeed.ReaderWriter 库,通过这个库可以用来解析RSS内容,所以开发的代码十分少

先通过 NuGet 安装或修改 csproj 代码

    <PackageReference Include="Microsoft.SyndicationFeed.ReaderWriter" Version="1.0.2" />

在使用RSS之前需要知道有两个通用的格式,一个是 RSSFeed 格式,一个是 AtomFeed 格式,这两个格式需要分别使用两个不同的方式读取

先用 HttpClient 获取 RSS 内容,定义参数 feedUri 表示需要获取的博客链接

            var xml = await httpClient.GetStringAsync(feedUri);

如我的博客是 https://blog.lindexi.com/ 我的订阅地址是 https://blog.lindexi.com/ 也就是在 feedUri 里面写的是订阅地址

读取到的内容是 xml 内容,通过下面方法判断当前博客使用的是哪个格式,分别返回不同的读取

        private XmlFeedReader GetXmlFeedReader(string xml, XmlReader xmlReader)
{
var xDocument = XDocument.Load(new StringReader(xml));
var rootName = xDocument.Root.Name;
if (rootName.Namespace.NamespaceName.Contains("Atom", StringComparison.OrdinalIgnoreCase))
{
return new AtomFeedReader(xmlReader);
} if (rootName.LocalName.Contains("feed", StringComparison.OrdinalIgnoreCase))
{
return new AtomFeedReader(xmlReader);
} if (rootName.ToString().Contains("rss", StringComparison.OrdinalIgnoreCase))
{
return new RssFeedReader(xmlReader);
} return new AtomFeedReader(xmlReader);
}

上面判断方法是用逗比代码写的,其实 AtomFeedReader 的判断不用那么复杂

判断完成之后就可以使用 feedReader.Read 方法不断读取,因为我只需要博客的内容,所以只获取内容

            using (var xmlReader = XmlReader.Create(new StringReader(xml)))
{
XmlFeedReader feedReader = GetXmlFeedReader(xml, xmlReader);
Console.WriteLine("Read");
while (await feedReader.Read())
{
try
{
if (feedReader.ElementType == SyndicationElementType.Item)
{
ISyndicationItem item = await feedReader.ReadItem();
rssNewsItems.Add(item);
}
}
catch (Exception e)
{
}
}
}

在 ISyndicationItem 里面就包括了博客的标题,描述和发布时间,可以定义另一个类做封装

    public class Blog
{
public string Title { get; set; } public string Url { get; set; } public string Description { get; set; } public DateTime Time { set; get; } /// <inheritdoc />
public override string ToString()
{
return $"{Title} {Time}\n{Url}";
}
}

这个做法很逗比

                var blogList = new List<Blog>();
foreach (var syndicationItem in syndicationItems)
{
var description =
syndicationItem.Description.Substring(0, Math.Min(200, syndicationItem.Description.Length));
var time = syndicationItem.Published;
var uri = syndicationItem.Links.FirstOrDefault()?.Uri; if (time < syndicationItem.LastUpdated)
{
time = syndicationItem.LastUpdated;
} blogList.Add(new Blog()
{
Title = syndicationItem.Title,
Description = description,
Time = time.DateTime,
Url = uri?.AbsoluteUri
});
}

现在就拿到了 blogList 可以给 MatterMost 发送信息,发送的方法请看 dotnet core 集成到 Mattermost 聊天工具

做出来的效果是这样

我将这个项目代码放在 github 欢迎小伙伴下载,如果觉得好像在哪看过这个代码,那么证明你看过dotnet 代码调试方法 我在这个博客将这个代码作为例子演示如何调试

用这个方法做的RSS订阅没有 RSS Stalker 好用

2019-10-19-dotnet-给MatterMost订阅RSS博客的更多相关文章

  1. 10个值得我们关注的python博客

    大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注 ...

  2. 忍者钩爪 ( ninja) 题解———2019.10.19

    可以到这里测..嘿嘿嘿 题目: [问题 描述 ] 小 Q 是一名酷爱钩爪的忍者, 最喜欢飞檐走壁的感觉, 有一天小 Q 发现一个练习使用钩 爪的好地方,决定在这里大显身手. 场景的天花板可以被描述为一 ...

  3. TNetHttpClient支持异步访问(Delphi 10.1 Berlin,红鱼儿的博客)

    Delphi 10.1进一步改进自Delphi 10带来的Http访问控件TNetHttpClient,支持异步访问,同时增加ConnectionTimeout及ResponseTimeout两个超时 ...

  4. 给博客添加rss订阅

    如果是自己搭建博客,有一个问题是如何写一篇新的文章就可以告诉读者,你写了一篇新的?一个简单方法是使用 rss ,RSS订阅是站点用来和其他站点之间共享内容的一种简易方式,即Really Simple ...

  5. 2019-9-2-给博客添加rss订阅

    title author date CreateTime categories 给博客添加rss订阅 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 17:23 ...

  6. IE订阅博客

    思来想去,qq邮箱订阅似乎也不是很方便,尝试了下,点击“博客”中的“订阅”,博客竟然被ie订阅了,据介绍,博客中有更新,即时IE不打开,也会看到信息,这不,我来尝试了,RSS真是不试不知道,一试真方便 ...

  7. 【集美大学1411_助教博客】团队作业10——项目复审与事后分析(Beta版本)

    写在前面的话 软件工程课结束了,大家开心吗?是不是再也不用熬夜写代码了?如果这门课你真的熬夜写代码了,相信你一定有收获,如果这门课结束了你觉得是自己一个全新的开始,那么这门课的意义就实现了.团队作业全 ...

  8. 开启 Django 博客的 RSS 功能

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 博客提供 RSS 订阅应该是标配,这样读者就可以通过一些聚合阅读工具订阅你的博客,时 ...

  9. 基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索

    前言 笔者认为,一个博客网站,最核心的是阅读体验. 在开发StarBlog的过程中,最耗时的恰恰也是文章的展示部分功能. 最开始还没研究出来如何很好的使用后端渲染,所以只能先用Editor.md组件做 ...

随机推荐

  1. PHP加密解密方法

    加密解密方法 //字符串解密加密 function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { $ckey_l ...

  2. 【Vue】详解组件的基础与高级用法

    Vue.js 最核心的功能就是组件(Component),从组件的构建.注册到组件间通信,Vue 2.x 提供了更多方式,让我们更灵活地使用组件来实现不同需求. 一.构建组件 1.1 组件基础 一个组 ...

  3. 通用、封装、简化 webpack 配置

    通用.封装.简化 webpack 配置 现在,基本上前端的项目打包都会用上 webpack,因为 webpack 提供了无与伦比强大的功能和生态.但在创建一个项目的时候,总是免不了要配置 webpac ...

  4. R语言-组间差异的非参数检验

    R语言-组间差异的非参数检验 7.5 组间差异的非参数检验 如果数据无法满足t检验或ANOVA的参数假设,可以转而使用非参数方法.举例来说,若结果变量在本质上就严重偏倚或呈现有序关系,那么你可能会希望 ...

  5. 【JZOJ3886】【长郡NOIP2014模拟10.22】道路维护

    CCC 最近徆多人投诉说C国的道路破损程度太大,以至亍无法通行 C国的政府徆重视这件事,但是最近财政有点紧,丌可能将所有的道路都进行维护,所以他们决定按照下述方案进行维护 将C国抽象成一个无向图,定义 ...

  6. Directx11教程37 纹理映射(7)

    原文:Directx11教程37 纹理映射(7)     本章是在教程35.36的基础上来实现一个光照纹理结合的程序,就是把场景中旋转的cube加上纹理.    lighttex.vs中顶点的结构现在 ...

  7. 2019-8-31-C#-循环的判断会进来几次

    title author date CreateTime categories C# 循环的判断会进来几次 lindexi 2019-08-31 16:55:58 +0800 2018-06-14 0 ...

  8. Leetcode724.Find Pivot Index寻找数组的中心索引

    给定一个整数类型的数组 nums,请编写一个能够返回数组"中心索引"的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和. 如果数组不 ...

  9. Go语言开发教程

    Go语言简述 兴起:2009年Gogle发布的第二款开源编程语言 特征: 语法简单:语法标准比较严格,适合开发人员短时间高效的服务端开发. 并发模型:Goroutine是Go最显著的特征,使用类协程的 ...

  10. phpcms信息模型使用

    PHPCMS V9 分类信息模型测试版下载 安装 1.确定您的phpcms版本为20110318版本以上 2.将所有文件覆盖到网站目录下,运行install_info. 3.将文件中所有的phpcms ...