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组件做 ...
随机推荐
- 强力Django+杀手级xadmin开发在线教育网站
强力Django+杀手级xadmin开发在线教育网站采用 Python3.7全新开发 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的 ...
- 2017年Android SDK下载安装及配置教程(附带原文地址)
首先声明: Unity版本5.6.3f1 最近试着在Unity中利用高通做AR开发时,发布项目文件需要发布到Android平台,遇到一些问题,看了网上的一些资料,踩了一些坑,现在总结出来,希望有相同的 ...
- python 模块的作用
- Codeforces 336C
这题是大一暑假时候做的,当时没有出,直到今天突然觉得应该把没过的题目再做一边,不然真的是越积越多. 现在能够独立做出来真的是难以表达的兴奋,刚开始的时候就觉得 O(30 * 30 * n)的复杂度有点 ...
- Kubernetes1.4正式发布
Kubernetes1.4正式发布. 昨天刚预测1.4即将正式发布,结果晚上Kubernetes1.4就正式发布了. 先看看Kubernetes发布历史: Kubernetes 1.0 - 2015年 ...
- 【JZOJ4846】【NOIP2016提高A组集训第5场11.2】行走
题目描述 数据范围 对于70%的数据保证 n <= 1000 对于100%的数据保证 n,q <= 10^5,c_i,v_i <= 10^{18} 保证每次修改后的边权小于等于原来的 ...
- Unity3D 物体旋转之Quaternion.Slerp
实现的功能:1个物体以一定的速度转向目标物体 Quaternion TargetRotation = Quaternion.LookRotation(m_Target.transform.positi ...
- MyBatis动态批量插入、更新Mysql数据库的通用实现方案
一.业务背景 由于需要从A数据库提取大量数据同步到B系统,采用了tomikos+jta进行分布式事务管理,先将系统数据源切换到数据提供方,将需要同步的数据查询出来,然后再将系统数据源切换到数据接收方, ...
- python 替换字符串的方法replace()、正则re.sub()
一.replace()函数1用字符串本身的replace方法: a = 'hello word' b = a.replace('word','python') print b 1 2 3 二.re ...
- 什么是实例化? 标签: vb 2015-02-08 20:26 1026人阅读 评论(30) 收藏
为什么要写这个博客呢?可能是因为自己的基础太差,昨天敲三层的注册,各层都敲完了以后,死活报错,无奈之下只能找晓婵求救,她只改了三个地方,犯了同一个错误,我的源码是这样写的:Dim uA As Ent ...