mcpField
R
rss-monitor

rss-monitor

github.com/winsorllc生产力0109 次安装35 周前更新
代码仓库

关于 rss-monitor

RSS Monitor 是用于获取和跟踪 RSS 与 Atom 订阅源的 JavaScript 工具,可提供订阅源元数据和条目详情,并查找上次检查后发布的新内容。

主要功能

  1. 01获取 RSS 和 Atom 订阅源
  2. 02跟踪多个订阅源
  3. 03查找上次检查后的条目
  4. 04读取订阅源元数据
  5. 05设置条目数量和超时

适用场景

  1. 01阅读指定订阅源的近期文章
  2. 02监控多个博客的新内容
  3. 03查看订阅源信息和条目内容

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/winsorllc/upgraded-carnival --skill rss-monitor

安装后在 Claude Code 中输入/rss-monitor确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

index.js
package-lock.json
package.json
test.js

详细介绍

RSS 监视器

跟踪 RSS 和 Atom 订阅源中的新内容。

安装

npm install feedparser

快速开始

获取基本订阅源
const { fetchFeed } = require('./rss-monitor');

const items = await fetchFeed('https://example.com/feed.xml');
console.log(items); // Array of feed items
跟踪多个订阅源
const { trackFeeds } = require('./rss-monitor');

const feeds = [
  { url: 'https://blog1.com/rss', name: 'Blog 1' },
  { url: 'https://blog2.com/atom.xml', name: 'Blog 2' }
];

const results = await trackFeeds(feeds);
console.log(results);
检查新条目
const { checkForNewItems } = require('./rss-monitor');

const lastCheck = new Date('2024-01-01T00:00:00Z');
const newItems = await checkForNewItems('https://example.com/feed.xml', lastCheck);
console.log(`Found ${newItems.length} new items`);

常见操作

获取最新条目
const items = await fetchFeed('https://xkcd.com/atom.xml', { limit: 10 });
获取订阅源元数据
const feed = await fetchFeedMetadata('https://example.com/feed.xml');
console.log(feed.title, feed.link, feed.description);
使用选项解析订阅源
const items = await fetchFeed('https://example.com/feed.xml', {
  limit: 20,
  includeContent: false,
  timeout: 5000
});
与上次检查结果对比
const newItems = await checkForNewItems(
  'https://example.com/feed.xml',
  lastCheckDate,
  { limit: 50 }
);

输出格式

每个订阅源条目包含:

  • title - 条目标题
  • link - 条目 URL
  • description - 条目摘要/描述
  • pubDate - 发布日期(ISO 字符串)
  • author - 作者姓名(如果有)
  • content - 完整内容(如果有且 includeContent: true)
  • categories - 标签/分类
  • enclosures - 媒体附件(图像、音频、视频)

示例

RSS 订阅源阅读器
const rssMonitor = require('./rss-monitor');

async function readFeeds() {
  const feeds = [
    'https://xkcd.com/atom.xml',
    'https://blog.github.com/feed/',
    'https://news.ycombinator.com/rss'
  ];
  
  for (const feedUrl of feeds) {
    try {
      const items = await rssMonitor.fetchFeed(feedUrl, { limit: 5 });
      console.log(`\n📰 ${feedUrl}`);
      items.forEach(item => {
        console.log(`  • ${item.title}`);
        console.log(`    ${item.link}`);
      });
    } catch (err) {
      console.error(`Failed to fetch ${feedUrl}:`, err.message);
    }
  }
}
监视新内容
const rssMonitor = require('./rss-monitor');
const fs = require('fs').promises;

const STATE_FILE = './last-check.json';

async function monitorFeeds() {
  // Load last check times
  let lastChecks = {};
  try {
    lastChecks = JSON.parse(await fs.readFile(STATE_FILE, 'utf8'));
  } catch (e) {
    // No state file yet
  }
  
  const feeds = [
    { url: 'https://xkcd.com/atom.xml', name: 'XKCD' },
    { url: 'https://blog.github.com/feed/', name: 'GitHub Blog' }
  ];
  
  for (const feed of feeds) {
    const lastCheck = lastChecks[feed.url] ? new Date(lastChecks[feed.url]) : null;
    const newItems = await rssMonitor.checkForNewItems(feed.url, lastCheck);
    
    if (newItems.length > 0) {
      console.log(`\n🆕 ${feed.name}: ${newItems.length} new items`);
      newItems.forEach(item => {
        console.log(`  • ${item.title}`);
      });
    }
    
    lastChecks[feed.url] = new Date().toISOString();
  }
  
  await fs.writeFile(STATE_FILE, JSON.stringify(lastChecks, null, 2));
}

说明

  • 支持 RSS 2.0 和 Atom 1.0 格式
  • 自动检测订阅源格式
  • 处理重定向和常见订阅源变体
  • 默认超时时间:10 秒
  • 按发布日期排序条目(最新的在前)

评论

支持 Markdown