---
name: freshrss-new-article-monitor
description: FreshRSS 新文章监控与推送 - 浏览器自动化检查指定订阅源的新文章并推送到消息渠道
category: mlops
---

# FreshRSS 新文章监控与推送

基于浏览器自动化的 FreshRSS 订阅源新文章检查与推送流程。

## 使用场景

- 定时检查指定订阅源是否有新文章
- 提取文章标题、摘要、链接
- 格式化后推送到微信/钉钉等消息渠道

## 完整流程

### 1. 登录 FreshRSS

```python
browser_navigate("https://your-freshrss-domain/i/")
# 填写登录表单
browser_type(ref="username_field", text="admin")
browser_type(ref="password_field", text="password")
browser_click(ref="login_button")
```

### 2. 访问指定订阅源

订阅源 URL 格式：`https://domain/i/?a=normal&get=f_{FEED_ID}`

Feed ID 可在订阅管理页面找到，或通过搜索功能定位。

```python
browser_navigate(f"https://domain/i/?a=normal&get=f_{feed_id}")
```

### 3. 提取新文章

**方法 A：提取未读文章**

```javascript
Array.from(document.querySelectorAll('.flux.not_read')).slice(0, 10).map(flux => ({
  title: flux.querySelector('.title a')?.textContent?.trim(),
  summary: flux.querySelector('.text')?.textContent?.trim().substring(0, 200),
  link: flux.querySelector('.title a')?.href
}))
```

**方法 B：提取分类下所有文章（含已读）**

适用于每日摘要场景，提取指定分类下最新文章：

```javascript
Array.from(document.querySelectorAll('#stream .flux')).slice(0, 10).map(f => ({
  title: f.querySelector('.flux_header .title')?.textContent?.trim(),
  source: f.querySelector('.websiteName')?.textContent?.trim(),
  link: f.querySelector('.flux_header .title')?.href,
  date: f.querySelector('.date time')?.textContent?.trim(),
  summary: f.querySelector('.flux_content .content')?.textContent?.trim().substring(0, 150),
  category: f.dataset?.category  // 分类 ID
}))
```

**字段说明：**
- `title`: 文章标题
- `source`: 订阅源名称（如"36 氪"、"IT 之家"）
- `link`: 文章原文链接
- `date`: 发布时间（格式："2026 年 4 月 17 日 07:13"）
- `summary`: 摘要内容
- `category`: 分类 ID（用于筛选 24 小时内文章）

### 4. 英文内容翻译（如需要）

- 调用翻译 API 将英文标题和摘要翻译成中文
- 保留专有名词，翻译后在括号内标注原文

### 5. 格式化推送内容

```
🔔 重要源更新提醒 [时间]

📌 [订阅源名称]
📝 [中文标题] (英文原标题)
📄 中文摘要（100 字以内）
🔗 原文链接
```

### 6. 推送到消息渠道

#### 企业微信机器人

```bash
curl -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_WEBHOOK_KEY" \
  -H "Content-Type: application/json" \
  -d '{"msgtype":"markdown","markdown":{"content":"你的内容"}}'
```

**注意：** webhook key 是 `key=` 后面的部分，不包含 `@im.wechat` 等后缀。

#### 钉钉机器人

```bash
curl -X POST "https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"msgtype":"markdown","markdown":{"title":"更新提醒","text":"你的内容"}}'
```

## 常见订阅源 Feed ID 参考

| 订阅源 | 分类 | 典型 Feed ID |
|--------|------|-------------|
| 小道消息 | 微信公众号 | f_148 |
| MacTalk | 技术博客 | f_14 |
| 槽边往事 | 文化阅读 | f_113 |
| 离别歌 | 技术博客 | f_26 |
| 阮一峰的网络日志 | 技术博客 | f_2 |

Feed ID 因实例而异，需在订阅管理页面确认。

## 常见分类 Category ID 参考（rss.liupeizhi.top 实例）

| 分类名称 | Category ID | 文章数量 |
|----------|-------------|----------|
| 技术博客 | c_2 | ~417 |
| 科技媒体 | c_3 | ~1916 |
| 财经商业 | c_5 | ~404 |
| 文化阅读 | c_7 | ~826 |
| 微信公众号 | c_10 | ~545 |
| 新闻资讯 | c_4 | - |
| 软件应用 | c_6 | - |
| 游戏娱乐 | c_8 | - |

**使用示例：**
```python
# 访问技术博客分类
browser_navigate("https://rss.liupeizhi.top/i/?a=normal&get=c_2")

# 访问科技媒体分类
browser_navigate("https://rss.liupeizhi.top/i/?a=normal&get=c_3")
```

## 替代方案：直接 RSS 提取（无需登录）

如果只需提取单个订阅源内容，可直接从 OPML 文件获取 RSS 地址，无需登录 FreshRSS：

```bash
# 1. 从 OPML 文件查找订阅源 RSS 地址
grep "订阅源名称" /root/.openclaw/workspace/rss-service/subscriptions.opml

# 输出示例：
# <outline type="rss" text="二丫讲梵" xmlUrl="https://wiki.eryajf.net/rss.xml"/>

# 2. 获取 RSS 最新内容
curl -s "https://wiki.eryajf.net/rss.xml" | head -100

# 3. 用 jina.ai 提取文章全文
curl -s "https://r.jina.ai/http://文章 URL"
```

**优势：**
- 无需 FreshRSS 登录凭证
- 更快速，适合单次提取
- 可配合 `execute_code` 批量处理

### 完整示例：总结单篇最新文章

```python
from hermes_tools import terminal

# 步骤 1：查找 RSS 地址
result = terminal('grep "阮一峰" /root/.openclaw/workspace/rss-service/subscriptions.opml')
# 输出：<outline type="rss" text="阮一峰的网络日志" xmlUrl="https://www.ruanyifeng.com/blog/atom.xml"/>

# 步骤 2：获取 RSS 获取最新文章 URL
rss = terminal('curl -s "https://www.ruanyifeng.com/blog/atom.xml"')
# 解析 XML 提取最新 <link> 标签

# 步骤 3：用 jina.ai 提取全文
article = terminal('curl -s "https://r.jina.ai/http://www.ruanyifeng.com/blog/2026/04/weekly-issue-392.html"')

# 步骤 4：总结并推送
# 提取标题、发布日期、核心内容，格式化后发送微信
```

**成功案例：** 2026-04-15 使用此方法成功总结"二丫讲梵"和"阮一峰博客"最新文章，全程无需 FreshRSS 登录。

## pitfalls

1. **Webhook URL 格式**：企业微信机器人地址是 `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=KEY`，KEY 不包含 `@im.wechat` 后缀

2. **订阅源不存在**：某些订阅源可能未在该 FreshRSS 实例中订阅，需先检查订阅管理页面

3. **FreshRSS 正确访问地址**：
   - 域名：`https://rss.liupeizhi.top`（不是 `liupeizhi.top/freshrss` 或 `liupeizhi.top/reader`）
   - API 认证可能失效，建议优先使用 OPML 直接提取方案

4. **OPML 文件位置**：
   - 常见路径：`/root/.openclaw/workspace/rss-service/subscriptions.opml`
   - 可用 `grep` 快速查找订阅源 RSS 地址

4. **会话超时**：登录后会话可能过期，需检查是否仍为登录状态

4. **文章数量限制**：建议只提取最新 5-10 篇文章，避免推送内容过长

5. **英文翻译**：如有英文内容，必须先翻译后推送，保留专有名词并标注原文

6. **子代理会话不共享**：使用 `delegate_task` 创建子代理时，浏览器登录会话**不会共享**。每个子代理需要独立登录 FreshRSS。主代理中获取的 cookie 不会传递给子代理。

7. **分类 vs 订阅源 URL**：
   - 按分类提取：`/i/?a=normal&get=c_{CATEGORY_ID}`（如 c_2=技术博客，c_3=科技媒体，c_5=财经商业）
   - 按订阅源提取：`/i/?a=normal&get=f_{FEED_ID}`
   - 分类 ID 和订阅源 ID 需在订阅管理页面确认

9. **微信推送凭证**：
   - 企业微信机器人：需要 webhook key（用于群消息），格式：`https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=WEBHOOK_KEY`
   - 微信公众号客服消息：需要 access_token（通过 OAuth 获取，有 2 小时有效期）
   - 用户 ID 格式 `xxx@im.wechat` 是公众号 openid，需要公众号后台的 access_token 才能推送
   - **错误码 93000**：`invalid webhook url` — 说明使用了错误的推送方式。`@im.wechat` 后缀是个人微信 openid，不能用企业微信 webhook 推送，必须用公众号客服消息 API
   - 如推送失败，检查是否配置了正确的凭证类型

10. **24 小时文章筛选**：FreshRSS 页面不直接显示文章时间戳，需通过 `browser_console` 提取日期字段后自行过滤。日期格式通常为 "2026 年 4 月 14 日 20:20" 或 "2026 年 4 月 15 日 07:44"。

11. **定时任务输出**：
   - cron 任务运行时没有用户交互，最终响应会自动交付给用户
   - 如微信推送不可用，可直接输出摘要作为最终响应，系统会自动交付
   - 使用 `send_message` 需要预先配置正确的渠道凭证

## 定时任务配置

可配合 `cronjob` 工具创建定时任务：

```python
cronjob(action="create", schedule="0 9 * * *", prompt="检查 FreshRSS 新文章并推送")
```

## 验证步骤

1. 确认能成功登录 FreshRSS
2. 确认目标订阅源存在且有未读文章
3. 测试 webhook 地址是否有效（发送简单测试消息）
4. 确认推送格式在目标平台显示正常

## 多分类摘要模板（每日推送）

如需生成多分类的每日摘要（如技术博客、科技媒体、财经商业、文化阅读等），参考以下流程：

### 1. 遍历各分类

```python
categories = [
    ("c_2", "技术博客"),
    ("c_3", "科技媒体"),
    ("c_5", "财经商业"),
    ("c_7", "文化阅读"),
    ("c_10", "微信公众号"),
]

for cat_id, cat_name in categories:
    browser_navigate(f"https://domain/i/?a=normal&get={cat_id}")
    # 提取文章...
```

### 2. 摘要格式

```
📱 FreshRSS 每日摘要 [YYYY-MM-DD]

💻 技术博客（精选 5 篇）
1. [中文标题] - 来源
   📝 中文摘要（50 字以内）
2. ...

📊 统计：今日共 X 篇新文章 | 英文 X 篇 | 中文 X 篇
```

### 3. 字数控制

- 总字数控制在 800 字以内（微信消息限制）
- 每个分类精选 5 篇
- 摘要精简到 50 字以内