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. 2015年10月5日 正式启用该博客

    2015年10月5日 正式启用该博客 转载于:https://www.cnblogs.com/tyks/p/4855877.html

  2. 教你10分钟搭建酷炫的个人博客

    以个人博客为例,博客地址 准备工作 安装 $ npm install -g hexo-cli 初始化 $ hexo init <folder> $ cd <folder> $ ...

  3. ASP.NET Core中实现单体程序的事件发布/订阅 - LamondLu - 博客园

    标题:ASP.NET Core中实现单体程序的事件发布/订阅作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10468058.html 项目源代码:h ...

  4. 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 ...

  5. Win 10系统修复,DISM_se7en3_新浪博客

    在Win10系统中,当系统出现文件受损或丢失后,我们可以使用DISM工具进行联机修复(DISM.exe部署映像服务和管理)在过去版本的Windows中可以起到联机修复Windows版本的系统. 而一般 ...

  6. mysql for mac 10.12_mac 10.12 版本 安装mysql - sylvia的博客

    今天安装mysql 遇到了坑,总结如下: 我的mac版本是10.12.1,于是安装了   https://dev.mysql.com/downloads/mysql/    下的DMG Archive ...

  7. Acronis Backup  Recovery 10 key_七夕小子_新浪博客

    workstation或server是靠序列号来区分的 Acronis Backup & Recovery 10 Workstation 11345: A7VQKG6W-ZM94MVVT-XM ...

  8. 舅妈的计算机课1-9,舅妈 - 高二 - 课堂党年级博客|作文

    快乐中秋节 妈妈说中秋节是我国传统的节日,也是一家人团聚的日子,我和爸爸.妈妈还有妹妹要和舅舅.舅妈.姐姐一起回姥姥家啦,姥姥和姥爷在老家开封,我真高兴,要见到姐姐啦,老家还有很多好玩的东西,太期待啦 ...

  9. 给博客添加rss订阅

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

最新文章

  1. 关于参数类型的转换问题
  2. android preference tab,Android SharedPreference - TabHost问题
  3. 6463: Tak and Hotels II(倍增)
  4. 2019 VOD编码工具指南
  5. java 四字节uid,Java入门教程-序列化版本号serialVersionUID的作用
  6. 蓝桥杯基础模块7:PWM脉宽调制
  7. python安装cv2模块_python - OpenCV已成功安装但未导入错误:没有名为“ cv2”的模块 - 堆栈内存溢出...
  8. 计算机技术在工程施工中的应用,浅析计算机技术及网络在工程施工中的应用
  9. 视觉错觉模型_极具视觉爆发力的影院设计
  10. Rushcrm:CRM系统怎么让企业如此青睐?
  11. python元组是有序还是无序_python-03 元组和字典
  12. Windows自动关机设置
  13. excel常用的数据处理方法
  14. 按键精灵手机助手之实战篇(二)防封
  15. 算法来为图像找到好的裁剪
  16. 计算机显存影响什么,老司机告诉你显存是怎样影响电脑速度的
  17. 笔记十一:提升高效技术领导的创新能力
  18. mysql spider引擎安装_【转】MySQL之Spider存储引擎原理详解
  19. 转载maven版本更新
  20. 【angular学习】自定义实现双向绑定

热门文章

  1. 文件加密解密操作——源码开源
  2. php://filter协议的另一个姿势
  3. 阿里内推邀请:If not now, when? If not you, who?
  4. 用Python Scrapy爬取某电影网站并存储入mysql
  5. 《数据清洗》——数据转换课后作业
  6. 序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)
  7. winscp普通用户上传文件没有权限解决
  8. extra加ing_英语词缀extra- (outside; beyond) 与派生词
  9. [总结] 大神成神之路?你会了吗?
  10. QT + VS + C++ 《控件的创建与删除》