字节笔记本

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 频道/群组

创建频道:

  1. 创建一个新的 Channel
  2. 添加之前创建的 bot 为管理员
  3. 赋予发送消息权限

获取 Channel ID: 登录网页版 Telegram,点击频道,链接格式类似 https://web.telegram.org/#/im?p=cxxx_ppp,其中 -100xxx 即为 Channel ID。

3. Fork 仓库并配置 Secrets

  1. Fork rss_everyday 仓库
  2. 进入仓库的 Settings - Secrets and variables - Actions
  3. 添加两个 Repository secrets:
    • BOTTOKEN:你的 Telegram Bot Token
    • CHANNELID:频道或群组 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 小时执行一次

注意事项

  1. 发布时间字段:代码使用文章的发布时间进行筛选,如果 RSS 源无法解析该字段,建议不要添加到 rss.json
  2. 时区处理:代码使用 UTC 时间进行计算,确保服务器时区设置正确
  3. 错误处理:最新版本已修复 RSS 响应中发布时间为空时导致 panic 的问题

项目链接

总结

rss_everyday 是一个简单实用的 RSS 自动化推送工具,适合需要定时获取资讯并推送到 Telegram 的用户。其基于 GitHub Actions 的架构设计使得部署成本极低,无需维护服务器即可实现自动化运营。

分享: