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 代码

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

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

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

  1. var xml = await httpClient.GetStringAsync(feedUri);

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

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

  1. private XmlFeedReader GetXmlFeedReader(string xml, XmlReader xmlReader)
  2. {
  3. var xDocument = XDocument.Load(new StringReader(xml));
  4. var rootName = xDocument.Root.Name;
  5. if (rootName.Namespace.NamespaceName.Contains("Atom", StringComparison.OrdinalIgnoreCase))
  6. {
  7. return new AtomFeedReader(xmlReader);
  8. }
  9.  
  10. if (rootName.LocalName.Contains("feed", StringComparison.OrdinalIgnoreCase))
  11. {
  12. return new AtomFeedReader(xmlReader);
  13. }
  14.  
  15. if (rootName.ToString().Contains("rss", StringComparison.OrdinalIgnoreCase))
  16. {
  17. return new RssFeedReader(xmlReader);
  18. }
  19.  
  20. return new AtomFeedReader(xmlReader);
  21. }

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

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

  1. using (var xmlReader = XmlReader.Create(new StringReader(xml)))
  2. {
  3. XmlFeedReader feedReader = GetXmlFeedReader(xml, xmlReader);
  4. Console.WriteLine("Read");
  5. while (await feedReader.Read())
  6. {
  7. try
  8. {
  9. if (feedReader.ElementType == SyndicationElementType.Item)
  10. {
  11. ISyndicationItem item = await feedReader.ReadItem();
  12. rssNewsItems.Add(item);
  13. }
  14. }
  15. catch (Exception e)
  16. {
  17. }
  18. }
  19. }

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

  1. public class Blog
  2. {
  3. public string Title { get; set; }
  4.  
  5. public string Url { get; set; }
  6.  
  7. public string Description { get; set; }
  8.  
  9. public DateTime Time { set; get; }
  10.  
  11. /// <inheritdoc />
  12. public override string ToString()
  13. {
  14. return $"{Title} {Time}\n{Url}";
  15. }
  16. }

这个做法很逗比

  1. var blogList = new List<Blog>();
  2. foreach (var syndicationItem in syndicationItems)
  3. {
  4. var description =
  5. syndicationItem.Description.Substring(0, Math.Min(200, syndicationItem.Description.Length));
  6. var time = syndicationItem.Published;
  7. var uri = syndicationItem.Links.FirstOrDefault()?.Uri;
  8.  
  9. if (time < syndicationItem.LastUpdated)
  10. {
  11. time = syndicationItem.LastUpdated;
  12. }
  13.  
  14. blogList.Add(new Blog()
  15. {
  16. Title = syndicationItem.Title,
  17. Description = description,
  18. Time = time.DateTime,
  19. Url = uri?.AbsoluteUri
  20. });
  21. }

现在就拿到了 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. redis数据库基本使用

    redis数据库 # 1.安装redis与可视化操作工具 # 选择安装路径.圈中默认配置环境变量 # 2.在服务中管理redis服务器的开启关闭 # 3.命令行简单使用redis: -- redis- ...

  2. JQuery--val()、html()、text()

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Mathcad 是一种工程计算软件,主要运算功能:代数运算、线性代数、微积分、符号计算、2D和3D图表、动画、函数、程序编写、逻辑运算、变量与单位的定义和计算等。

    Mathcad软件包Mathcad是由MathSoft公司(2006 年4 月被美国PTC收购)推出的一种交互式数值计算系统. Mathcad 是一种工程计算软件,作为工程计算的全球标准,与专有的计算 ...

  4. Facebook POP 进阶指南

    本文转自Kevin Blog Facebook 在发布了 Paper 之后,似乎还不满足于只是将其作为一个概念性产品,更进一步开源了其背后的动画引擎 POP,此举大有三年前发布的 iOS UI 框架  ...

  5. day39-Spring 05-Spring的AOP:不带有切点的切面

    Spring底层的代理的实现: 不带切点的切面是对类里面的所有的方法都进行拦截. 做Spring AOP的开发需要两个包:一个是AOP的包,一个是AOP联盟的包(因为规范是由AOP联盟提出来的). 用 ...

  6. Leetcode783.Minimum Distance Between BST Nodes二叉搜索树结点最小距离

    给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值. 示例: 输入: root = [4,2,6,1,3,null,null] 输出: 1 解释: 注意,root是树结点对象(Tr ...

  7. Python3 写的远程批量修改文件内容的脚本

    一.说明: 1.利用Python的paramiko模块,调用远程的shell命令去修改相应文件. 2.有一个专用配置文件,列出服务器清单. 3.Python循环读取配置文件的服务器IP去连接它,并执行 ...

  8. 2016 Asia Jakarta Regional Contest A - Confusing Date Format UVALive 7711 【模拟题】

    A - Confusing Date Format 题目大意:就是有六种日期格式,给你一个字符串,判断它能组成多少种可能的日期. 第一次WA是:1.没有判重,2.没有特判题目要求的数据,3.判断天数时 ...

  9. python 数据的写入

  10. php 正则表达式怎么匹配标签里面的style?

    $str = '<div style="margin:0px;text-align:left;padding:0px;">任意内容</div>'; $reg ...