微信公众号文章订阅与推送。自动部署 wechat-download-api 服务,定时轮询关注的公众号,检测新文章后总结并推送到飞书。触发条件:用户提到"公众号订阅"、"微信文章推送"、"wechat watch"、"公众号更新"等,或由 cron 定时任务触发。前置条件:用户需要有微信公众号(订阅号/服务号均可)用于扫码登录。 具体请看这篇文章:https://mp.weixin.qq.com/s/04vWKtCOyRCKS
微信公众号订阅与推送是一项面向实际任务的技能,主要用于自动部署 wechat-download-api 服务;获取登录二维码供用户扫码;
用户必须有微信公众号 (订阅号或服务号均可),用于扫码登录获取凭证;凭证有效期约 4 天,过期后需要重新扫码;步骤 0:首次使用引导;当用户首次使用此 skill 时:。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
/ ├── SKILL.md ← skill 定义(AI 读取此文件执行) ├── services/ │ └── wechat-download-api/ ← 微信 API 服务 │ ├── app.py ← 服务入口 │ └── data/ │ └── rss.db ← 文章缓存数据库 ├── scripts/ │ └── check_articles.py ← 检查新文章脚本 └── data/ └── pushed_articles.json ← 已推送文章记录
用户必须有微信公众号(订阅号或服务号均可),用于扫码登录获取凭证。
凭证有效期约 4 天,过期后需要重新扫码。
当用户首次使用此 skill 时:
services/wechat-download-api/app.py 是否存在)curl -s http://localhost:5000/api/health
如果返回非 200,说明服务未启动,需要启动服务。
curl -s http://localhost:5000/api/admin/status
如果未登录:
/api/login/session/{sessionid} 创建会话/api/login/getqrcode 获取二维码/api/login/check 等待登录成功添加订阅:
/api/public/searchbiz?query=公众号名称 搜索公众号fakeid/api/rss/subscribe 添加订阅查看订阅:
curl -s http://localhost:5000/api/rss/subscriptions
取消订阅:
curl -X DELETE http://localhost:5000/api/rss/subscribe/{fakeid}
┌─────────────────────────────────────────────────────────────┐
│ wechat-download-api │
│ │
│ RSS Poller(每小时自动) │
│ ↓ │
│ 轮询订阅的公众号 → 缓存到 SQLite(含完整内容) │
│ │
│ 数据表: │
│ - subscriptions:订阅列表 │
│ - articles:文章缓存(title, content, publish_time 等) │
│ │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ wechat-watch skill │
│ │
│ Cron (10:00 / 18:00) │
│ ↓ │
│ 从 SQLite 读取缓存文章 │
│ ↓ │
│ 按 publish_time 筛选时间段 │
│ ↓ │
│ 总结 + 推送到飞书 │
│ │
└─────────────────────────────────────────────────────────────┘
核心设计:利用项目缓存,避免重复请求微信 API
每天两次检查,按时间段筛选:
| 任务时间 | 查询范围 |
|---|---|
| 每天 10:00 | 前一天 18:00 ~ 当天 10:00 |
| 每天 18:00 | 当天 10:00 ~ 当天 18:00 |
时间段筛选逻辑:
文章数据有 publish_time 字段(Unix 时间戳),按以下方式筛选:
import time
from datetime import datetime, timedelta
# 早上10点任务:前一天18点到当天10点
if hour == 10:
start_time = int((datetime.now() - timedelta(hours=16)).timestamp()) # 昨天18:00
end_time = int(datetime.now().replace(hour=10, minute=0, second=0).timestamp())
# 晚上18点任务:当天10点到18点
if hour == 18:
start_time = int(datetime.now().replace(hour=10, minute=0, second=0).timestamp())
end_time = int(datetime.now().replace(hour=18, minute=0, second=0).timestamp())
# 筛选文章
for article in articles:
if start_time <= article['publish_time'] <= end_time:
# 这是新文章,需要推送
从 SQLite 缓存读取,不请求微信 API:
import sqlite3
from datetime import datetime, timedelta
# 连接数据库(使用相对路径,基于 skill 目录)
import os
skill_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # skill 根目录
db_path = os.path.join(skill_dir, "services", "wechat-download-api", "data", "rss.db")
conn = sqlite3.connect(db_path)
conn.row_factory = sqlite3.Row
# 计算时间段
now = datetime.now()
if now.hour == 10:
# 早上10点:前一天18点到当天10点
start_time = int((now - timedelta(hours=16)).timestamp()) # 昨天18:00
end_time = int(now.replace(hour=10, minute=0, second=0).timestamp())
else:
# 晚上18点:当天10点到18点
start_time = int(now.replace(hour=10, minute=0, second=0).timestamp())
end_time = int(now.replace(hour=18, minute=0, second=0).timestamp())
# 从缓存读取文章
cursor = conn.execute("""
SELECT a.*, s.nickname
FROM articles a
JOIN subscriptions s ON a.fakeid = s.fakeid
WHERE a.publish_time BETWEEN ? AND ?
ORDER BY a.publish_time DESC
""", (start_time, end_time))
articles = [dict(row) for row in cursor]
conn.close()
流程:
python /scripts/check_articles.py data/pushed_articles.json有新文章时:
📰 公众号文章更新(X 篇) 查询时间范围:YYYY-MM-DD HH:00 ~ YYYY-MM-DD HH:00 --- **【公众号名称】** - **文章标题**:XXX - **内容总结**:XXX... - **原文链接**:[链接](URL) --- **【另一个公众号】** - **文章标题**:XXX - **内容总结**:XXX... - **原文链接**:[链接](URL)
无新文章时:
📰 公众号文章更新 查询时间范围:YYYY-MM-DD HH:00 ~ YYYY-MM-DD HH:00 暂无新文章更新。
| 接口 | 方法 | 说明 |
|---|---|---|
/api/health |
GET | 健康检查 |
/api/admin/status |
GET | 登录状态 |
/api/login/session/{sessionid} |
POST | 创建登录会话 |
/api/login/getqrcode |
GET | 获取登录二维码 |
/api/login/check |
GET | 检查扫码状态 |
/api/public/searchbiz |
GET | 搜索公众号 |
/api/public/articles |
GET | 获取文章列表 |
/api/article |
POST | 获取文章内容 |
/api/rss/subscribe |
POST | 添加订阅 |
/api/rss/subscriptions |
GET | 获取订阅列表 |
/api/rss/subscribe/{fakeid} |
DELETE | 取消订阅 |
# 检查 Docker docker --version # 检查 Python python3 --version
cd/services git clone https://github.com/tmwgsicp/wechat-download-api.git cd wechat-download-api cp env.example .env docker-compose up -d
cd/services git clone https://github.com/tmwgsicp/wechat-download-api.git cd wechat-download-api bash start.sh
记录已推送的文章 ID 和上次检查时间,避免重复推送:
{
"pushed_ids": [
"article_id_1",
"article_id_2"
],
"last_check": "2026-03-24T18:00:00+08:00",
"last_time_range": {
"start": "2026-03-24T10:00:00+08:00",
"end": "2026-03-24T18:00:00+08:00"
}
}
### subscriptions.json(可选)
如果用户想用自己的订阅管理而不是服务的:
```json
{
"accounts": [
{
"fakeid": "MzA1MjM1ODk2MA==",
"nickname": "人民日报",
"alias": "rmrbwx"
}
]
}
MEDIA: 语法发送到飞书已封装请求逻辑到脚本,自动处理间隔:
# 运行检查脚本 bash/scripts/check_articles.sh
脚本内置间隔规则:
执行时请使用脚本,不要直接调用 API,避免忘记间隔。
微信会检测频繁请求并触发风控,返回"请求过于频繁,请4秒后重试"。
必须遵守以下间隔规则:
| 操作 | 最小间隔 |
|---|---|
| 搜索公众号 | 3 秒 |
| 获取文章列表 | 3 秒 |
| 获取文章内容 | 5 秒 |
| 添加订阅 | 3 秒 |
示例代码:
# 获取多篇文章内容时,每次请求后 sleep 5
for url in "${urls[@]}"; do
curl -s -X POST "http://localhost:5000/api/article"
-H "Content-Type: application/json"
-d "{"url":"$url"}"
sleep 5 # 必须!
done
如果触发风控:
PROXY_URLS 环境变量)用户可以说:
建议配置两个定时任务,每天自动检查并推送公众号文章更新。
检查时间段:昨天 18:00 ~ 今天 10:00(16 小时,覆盖晚上 + 早上)
{
"agentId": "info_collector",
"name": "公众号文章推送 - 早",
"schedule": {
"kind": "cron",
"expr": "0 10 * * *",
"tz": "Asia/Shanghai"
},
"sessionTarget": "isolated",
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"message": "运行公众号文章检查脚本:python3 /scripts/check_articles.pynn脚本会自动从 SQLite 缓存读取指定时间段的文章,输出飞书格式的推送内容。定时任务框架会自动将输出推送到配置的目标用户。"
},
"delivery": {
"mode": "announce",
"channel": "feishu",
"to": "user:你的飞书_USER_ID"
}
}
检查时间段:今天 10:00 ~ 今天 18:00
{
"agentId": "info_collector",
"name": "公众号文章推送 - 晚",
"schedule": {
"kind": "cron",
"expr": "0 18 * * *",
"tz": "Asia/Shanghai"
},
"sessionTarget": "isolated",
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"message": "运行公众号文章检查脚本:python3 /scripts/check_articles.pynn脚本会自动从 SQLite 缓存读取指定时间段的文章,输出飞书格式的推送内容。定时任务框架会自动将输出推送到配置的目标用户。"
},
"delivery": {
"mode": "announce",
"channel": "feishu",
"to": "user:你的飞书_USER_ID"
}
}
| 配置项 | 说明 | 如何修改 |
|---|---|---|
agentId |
执行任务的 agent | 保持 info_collector 或改为你的 agent ID |
delivery.to |
推送目标用户 | 必须修改为你的飞书 user ID |
schedule.expr |
cron 表达式 | 可根据需要调整时间 |
user:ou_xxx 格式的 ID有新文章时:
📰 公众号文章更新(X 篇) 查询时间范围:2026-03-24 10:00 ~ 2026-03-24 18:00 --- **【公众号名称】** - **文章标题**:XXX - **内容总结**:XXX... - **原文链接**:[链接](URL)
无新文章时:
📰 公众号文章更新 查询时间范围:2026-03-24 10:00 ~ 2026-03-24 18:00 暂无新文章更新。
check_articles.py 输出飞书格式的 Markdown 到 stdoutdelivery 配置自动将输出推送到目标用户delivery.to相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 133.9万人学习
共49课时 | 82.5万人学习
最新文章