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博客相关推荐
- 2015年10月5日 正式启用该博客
2015年10月5日 正式启用该博客 转载于:https://www.cnblogs.com/tyks/p/4855877.html
- 教你10分钟搭建酷炫的个人博客
以个人博客为例,博客地址 准备工作 安装 $ npm install -g hexo-cli 初始化 $ hexo init <folder> $ cd <folder> $ ...
- ASP.NET Core中实现单体程序的事件发布/订阅 - LamondLu - 博客园
标题:ASP.NET Core中实现单体程序的事件发布/订阅作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10468058.html 项目源代码:h ...
- linux下安装mysql5.7.19,Linux下MySQL5.1升级到高版本MySQL5.7.19详解 | zifangsky的个人博客...
一 数据备份 (1)查看当前版本: Shell [root@centos ~]# mysql -V 1[root@centos~]# mysql -V (2)备份数据: Shell [root@cen ...
- Win 10系统修复,DISM_se7en3_新浪博客
在Win10系统中,当系统出现文件受损或丢失后,我们可以使用DISM工具进行联机修复(DISM.exe部署映像服务和管理)在过去版本的Windows中可以起到联机修复Windows版本的系统. 而一般 ...
- mysql for mac 10.12_mac 10.12 版本 安装mysql - sylvia的博客
今天安装mysql 遇到了坑,总结如下: 我的mac版本是10.12.1,于是安装了 https://dev.mysql.com/downloads/mysql/ 下的DMG Archive ...
- Acronis Backup Recovery 10 key_七夕小子_新浪博客
workstation或server是靠序列号来区分的 Acronis Backup & Recovery 10 Workstation 11345: A7VQKG6W-ZM94MVVT-XM ...
- 舅妈的计算机课1-9,舅妈 - 高二 - 课堂党年级博客|作文
快乐中秋节 妈妈说中秋节是我国传统的节日,也是一家人团聚的日子,我和爸爸.妈妈还有妹妹要和舅舅.舅妈.姐姐一起回姥姥家啦,姥姥和姥爷在老家开封,我真高兴,要见到姐姐啦,老家还有很多好玩的东西,太期待啦 ...
- 给博客添加rss订阅
如果是自己搭建博客,有一个问题是如何写一篇新的文章就可以告诉读者,你写了一篇新的?一个简单方法是使用 rss ,RSS订阅是站点用来和其他站点之间共享内容的一种简易方式,即Really Simple ...
最新文章
- 关于参数类型的转换问题
- android preference tab,Android SharedPreference - TabHost问题
- 6463: Tak and Hotels II(倍增)
- 2019 VOD编码工具指南
- java 四字节uid,Java入门教程-序列化版本号serialVersionUID的作用
- 蓝桥杯基础模块7:PWM脉宽调制
- python安装cv2模块_python - OpenCV已成功安装但未导入错误:没有名为“ cv2”的模块 - 堆栈内存溢出...
- 计算机技术在工程施工中的应用,浅析计算机技术及网络在工程施工中的应用
- 视觉错觉模型_极具视觉爆发力的影院设计
- Rushcrm:CRM系统怎么让企业如此青睐?
- python元组是有序还是无序_python-03 元组和字典
- Windows自动关机设置
- excel常用的数据处理方法
- 按键精灵手机助手之实战篇(二)防封
- 算法来为图像找到好的裁剪
- 计算机显存影响什么,老司机告诉你显存是怎样影响电脑速度的
- 笔记十一:提升高效技术领导的创新能力
- mysql spider引擎安装_【转】MySQL之Spider存储引擎原理详解
- 转载maven版本更新
- 【angular学习】自定义实现双向绑定
热门文章
- 文件加密解密操作——源码开源
- php://filter协议的另一个姿势
- 阿里内推邀请:If not now, when? If not you, who?
- 用Python Scrapy爬取某电影网站并存储入mysql
- 《数据清洗》——数据转换课后作业
- 序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)
- winscp普通用户上传文件没有权限解决
- extra加ing_英语词缀extra- (outside; beyond) 与派生词
- [总结] 大神成神之路?你会了吗?
- QT + VS + C++ 《控件的创建与删除》