字
字节笔记本
2026年2月22日
rss_everyday:基于 Go 的 RSS 自动推送工具
本文介绍 rss_everyday,一个基于 Go 语言开发的 RSS 订阅推送工具。该项目通过 GitHub Actions 定时任务,每四小时采集一次订阅源的新文章,并自动通过 Telegram Bot 推送到指定频道或群组。
项目简介
rss_everyday 是由 dianbanjiu(GuangzheJiang)开发维护的开源项目,采用 MIT 许可证。截至目前,该项目在 GitHub 上已获得 205+ stars 和 53 个 fork,是一个轻量级但功能完善的 RSS 自动化推送解决方案。
核心特性
- 定时采集:每 4 小时自动采集 RSS 订阅源
- TG 推送:通过 Telegram Bot 自动推送至频道或群组
- 时间筛选:基于文章发布时间智能筛选,只推送新内容
- GitHub Actions:完全基于 GitHub Actions 实现,无需服务器
- 配置简单:仅需配置 Bot Token 和 Channel ID 即可运行
- 多源支持:支持同时订阅多个 RSS 源
技术栈
- Go 语言:项目完全使用 Go 编写
- gofeed:RSS 解析库,用于解析各类 RSS 订阅源
- telegram-bot-api:Telegram Bot API 的 Go 封装
- GitHub Actions:定时触发任务执行
安装指南
前置要求
- GitHub 账号
- Telegram 账号
- 基本的 Git 操作知识
配置步骤
1. 创建 Telegram Bot
添加 @BotFather 机器人,注册一个新 bot,记录 bot 的 token。
2. 创建 Telegram 频道/群组
创建频道:
- 创建一个新的 Channel
- 添加之前创建的 bot 为管理员
- 赋予发送消息权限
获取 Channel ID:
登录网页版 Telegram,点击频道,链接格式类似 https://web.telegram.org/#/im?p=cxxx_ppp,其中 -100xxx 即为 Channel ID。
3. Fork 仓库并配置 Secrets
- Fork rss_everyday 仓库
- 进入仓库的
Settings - Secrets and variables - Actions - 添加两个 Repository secrets:
BOTTOKEN:你的 Telegram Bot TokenCHANNELID:频道或群组 ID
4. 配置 RSS 订阅源
编辑仓库中的 rss.json 文件,添加你想要订阅的 RSS 源:
json
{
"rss_info": [
{
"title": "示例订阅",
"url": "https://example.com/feed.xml",
"full_content": false
}
]
}如果网站没有提供 RSS 链接,可以通过 RSSHub 生成对应的 RSS 链接。
核心代码解析
RSS 配置结构
go
type RSSInfos struct {
RssInfo []RssInfo `json:"rss_info"`
}
type RssInfo struct {
Title string `json:"title"`
Url string `json:"url"`
FullContent bool `json:"full_content"`
}文章采集逻辑
go
func GetPostInfo(rss RssInfo) []string {
var msg = make([]string, 0)
now := time.Now().UTC()
// 计算 4 小时前的时间范围
startTime := now.Add(-4 * time.Hour)
start := time.Date(startTime.Year(), startTime.Month(),
startTime.Day(), startTime.Hour(), 0, 0, 0, now.Location()).Unix()
end := time.Date(now.Year(), now.Month(),
now.Day(), now.Hour(), 0, 0, 0, now.Location()).Unix()
fp := gofeed.NewParser()
feed, err := fp.ParseURL(rss.Url)
if err != nil {
fmt.Print(err.Error())
} else {
for _, item := range feed.Items {
// 筛选发布时间在指定范围内的文章
if item.PublishedParsed != nil &&
item.PublishedParsed.Unix() >= start &&
item.PublishedParsed.Unix() < end {
msgItem := fmt.Sprintln(item.Title, item.Link)
msg = append(msg, msgItem)
}
}
}
return msg
}消息推送
go
func PushPost(msg []string) {
bot, err := tgbotapi.NewBotAPI(*BotToken)
if err != nil {
panic(err)
}
for _, s := range msg {
_, _ = bot.Send(tgbotapi.NewMessage(*ChannelID, s))
}
}使用示例
手动触发
进入仓库的 Actions 页面,选择 RSS Everyday 工作流,点击 Run workflow 手动执行。
自动运行
GitHub Actions 会按照 .github/workflows/index.yml 中的定时配置自动运行:
yaml
on:
schedule:
- cron: '0 */4 * * *' # 每 4 小时执行一次注意事项
- 发布时间字段:代码使用文章的发布时间进行筛选,如果 RSS 源无法解析该字段,建议不要添加到
rss.json - 时区处理:代码使用 UTC 时间进行计算,确保服务器时区设置正确
- 错误处理:最新版本已修复 RSS 响应中发布时间为空时导致 panic 的问题
项目链接
- GitHub 仓库:https://github.com/dianbanjiu/rss_everyday
- 许可证:MIT License
- Stars:205+
- Forks:53
总结
rss_everyday 是一个简单实用的 RSS 自动化推送工具,适合需要定时获取资讯并推送到 Telegram 的用户。其基于 GitHub Actions 的架构设计使得部署成本极低,无需维护服务器即可实现自动化运营。
分享: