2019-10-19-dotnet-给MatterMost订阅RSS博客
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博客的更多相关文章
- 10个值得我们关注的python博客
大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注 ...
- 忍者钩爪 ( ninja) 题解———2019.10.19
可以到这里测..嘿嘿嘿 题目: [问题 描述 ] 小 Q 是一名酷爱钩爪的忍者, 最喜欢飞檐走壁的感觉, 有一天小 Q 发现一个练习使用钩 爪的好地方,决定在这里大显身手. 场景的天花板可以被描述为一 ...
- TNetHttpClient支持异步访问(Delphi 10.1 Berlin,红鱼儿的博客)
Delphi 10.1进一步改进自Delphi 10带来的Http访问控件TNetHttpClient,支持异步访问,同时增加ConnectionTimeout及ResponseTimeout两个超时 ...
- 给博客添加rss订阅
如果是自己搭建博客,有一个问题是如何写一篇新的文章就可以告诉读者,你写了一篇新的?一个简单方法是使用 rss ,RSS订阅是站点用来和其他站点之间共享内容的一种简易方式,即Really Simple ...
- 2019-9-2-给博客添加rss订阅
title author date CreateTime categories 给博客添加rss订阅 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 17:23 ...
- IE订阅博客
思来想去,qq邮箱订阅似乎也不是很方便,尝试了下,点击“博客”中的“订阅”,博客竟然被ie订阅了,据介绍,博客中有更新,即时IE不打开,也会看到信息,这不,我来尝试了,RSS真是不试不知道,一试真方便 ...
- 【集美大学1411_助教博客】团队作业10——项目复审与事后分析(Beta版本)
写在前面的话 软件工程课结束了,大家开心吗?是不是再也不用熬夜写代码了?如果这门课你真的熬夜写代码了,相信你一定有收获,如果这门课结束了你觉得是自己一个全新的开始,那么这门课的意义就实现了.团队作业全 ...
- 开启 Django 博客的 RSS 功能
作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 博客提供 RSS 订阅应该是标配,这样读者就可以通过一些聚合阅读工具订阅你的博客,时 ...
- 基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索
前言 笔者认为,一个博客网站,最核心的是阅读体验. 在开发StarBlog的过程中,最耗时的恰恰也是文章的展示部分功能. 最开始还没研究出来如何很好的使用后端渲染,所以只能先用Editor.md组件做 ...
随机推荐
- redis数据库基本使用
redis数据库 # 1.安装redis与可视化操作工具 # 选择安装路径.圈中默认配置环境变量 # 2.在服务中管理redis服务器的开启关闭 # 3.命令行简单使用redis: -- redis- ...
- JQuery--val()、html()、text()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Mathcad 是一种工程计算软件,主要运算功能:代数运算、线性代数、微积分、符号计算、2D和3D图表、动画、函数、程序编写、逻辑运算、变量与单位的定义和计算等。
Mathcad软件包Mathcad是由MathSoft公司(2006 年4 月被美国PTC收购)推出的一种交互式数值计算系统. Mathcad 是一种工程计算软件,作为工程计算的全球标准,与专有的计算 ...
- Facebook POP 进阶指南
本文转自Kevin Blog Facebook 在发布了 Paper 之后,似乎还不满足于只是将其作为一个概念性产品,更进一步开源了其背后的动画引擎 POP,此举大有三年前发布的 iOS UI 框架 ...
- day39-Spring 05-Spring的AOP:不带有切点的切面
Spring底层的代理的实现: 不带切点的切面是对类里面的所有的方法都进行拦截. 做Spring AOP的开发需要两个包:一个是AOP的包,一个是AOP联盟的包(因为规范是由AOP联盟提出来的). 用 ...
- Leetcode783.Minimum Distance Between BST Nodes二叉搜索树结点最小距离
给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值. 示例: 输入: root = [4,2,6,1,3,null,null] 输出: 1 解释: 注意,root是树结点对象(Tr ...
- Python3 写的远程批量修改文件内容的脚本
一.说明: 1.利用Python的paramiko模块,调用远程的shell命令去修改相应文件. 2.有一个专用配置文件,列出服务器清单. 3.Python循环读取配置文件的服务器IP去连接它,并执行 ...
- 2016 Asia Jakarta Regional Contest A - Confusing Date Format UVALive 7711 【模拟题】
A - Confusing Date Format 题目大意:就是有六种日期格式,给你一个字符串,判断它能组成多少种可能的日期. 第一次WA是:1.没有判重,2.没有特判题目要求的数据,3.判断天数时 ...
- python 数据的写入
- php 正则表达式怎么匹配标签里面的style?
$str = '<div style="margin:0px;text-align:left;padding:0px;">任意内容</div>'; $reg ...