部署RSSHub并使用Telegram-bot推送

1. 基本概念

1.1 RSS简介

RSS(Really Simple Syndication):简易信息聚合,当网站内容更新时,可以通过订阅RSS源在Telegram Bot、RSS阅读器上获取更新的信息。可以打造自己的订阅生态圈,以保证内容的高质量。

RSS源:一些个人博客网站大多都有主动提供,而主流的社交媒体网站为了打造自己的内容闭环,通常主动不提供,可以通过RSSHub抓取生成。

1.2 RSSHub简介

RSSHub 是一个开源、简单易用、易于扩展的 RSS 生成器,可以给任何奇奇怪怪的内容生成 RSS 订阅源。RSSHub 借助于开源社区的力量快速发展中,目前已适配数百家网站的上千项内容。号称“万物皆可RSS”。

项目地址:https://github.com/DIYgod/RSSHub

1.3 Telegram Bot简介

Telegram Bot 是基于 Telegram 客户端的第三方程序。 用户可以通过向Bot发送信息、照片、指令、在线请求等一系列的方式与Bot互动。 Bot的所有者通过 Bot 的API 访问并请求Telegram Server的信息。

1.4 Flowerss Bot 简介

flowerss bot 是一个支持应用内即时预览的 Telegram RSS Bot,有着丰富的订阅设置,可以作为个人订阅和频道订阅。

项目地址:https://github.com/indes/flowerss-bot

1.5 成品展示

RSSBot订阅成品

2. 部署前的准备工作

以下所有服务均选择自建,我将采用宝塔面板与Docker混合部署的方式(宝塔面板安装Nginx环境并开启HTTPS,Docker安装MySQL、RSSHub、Flowerssr),VPS系统用的是Debian 10 x86_64。

VPS的购买及配置、域名解析、宝塔面板的搭建及使用、Docker的概念及使用…这些基本的就不再赘述了,如果不会的话见我的另一篇博客:VPS基本部署环境的搭建与配置

如果你对Telegram和Telegram Bot还不够熟悉,可以先去看看我的另一篇博客:Telegram及Telegram Bot使用指南

2.1 Docker环境搭建

2.1.1 卸载旧版本Docker

旧版本的 Docker 称为 docker 或者 docker-engine,使用以下命令卸载旧版本:

1
2
3
4
$ apt-get install -y sudo
$ sudo apt-get remove docker \
docker-engine \
docker.io

2.1.2 安装HTTPS传输包及CA证书

由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们需要添加使用 HTTPS 传输的软件包以及 CA 证书。

Step1:更新apt包索引

1
$ sudo apt-get update

Step2:安装包以允许apt通过HTTPS使用存储库

1
2
3
4
5
6
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common

Step3:添加Docker的官方GPG密钥

1
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

Step4:验证您现在拥有带指纹的密钥

1
$ sudo apt-key fingerprint 0EBFCD88

Step5:添加源

1
2
3
4
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"

2.1.3 安装DOCKER CE

1
2
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

2.1.4 启动Docker服务并查看版本

1
2
$ sudo systemctl start docker
$ sudo docker --version

注:如果是apt安装的docker,开机自启脚本已经自动放置在/etc/init.d/目录下了,无需配置。

2.2 Docker-MySQL环境搭建

2.2.1 搜索MySQL镜像

1
$ docker search mysql

docker-mysql

通常选择OFFICIAL里Star数最多的那个镜像,即mysql。

2.2.2 拉取MySQL镜像

1
$ docker pull mysql:5.7

2.2.3 创建实例容器并运行

1
2
3
4
5
6
7
$ docker run -p 3306:3306 --name mysql \
-e TZ=Asia/Shanghai \
-v /mydocker/mysql/conf:/etc/mysql/conf.d \
-v /mydocker/mysql/logs:/var/log/mysql \
-v /mydocker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=[password] \
-d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

命令解释说明:

1
2
3
4
5
6
7
8
9
10
-p 3306:3306:将主机的3306端口映射到docker容器的3306端口。
--name mysql:运行服务名字
-e TZ=Asia/Shanghai:时区是使用了世界标准时间(UTC)。因为在中国使用,所以需要把时区改成东八区的。
-v /mydocker/mysql/conf:/etc/mysql/conf.d :将主机/mydocker/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d
-v /mydocker/mysql/logs:/var/log/mysql:将主机/mydocker/mysql目录下的logs目录挂载到容器的 /logs。
-v /mydocker/mysql/data:/var/lib/mysql :将主机/mydocker/mysql目录下的data目录挂载到容器的 /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=[password]:初始化 root 用户的密码。
-d mysql:5.7 : 后台程序运行mysql5.7
--character-set-server=utf8mb4 :设置字符集
--collation-server=utf8mb4_unicode_ci:设置校对集

设置开机自启

1
$ docker update mysql --restart=always

2.2.4 创建数据库及用户

在本地使用Navicat工具使用root用户连接上该数据库(国外服务器建议配置代理),使用如下四条命令创建数据库及用户。

1
2
3
4
5
6
7
8
9
10
11
--创建新的数据库,并设置数据库编码
$ CREATE DATABASE 你的数据库名 DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;

--创建新的用户
$ CREATE USER '你的用户名'@'你的服务器IP' IDENTIFIED BY '你的密码';

--把数据库的管理权限给予刚刚创建的MySQL用户
$ GRANT ALL PRIVILEGES ON *.* TO '你的用户名'@'%';

--刷新权限,使用设置生效
$ FLUSH PRIVILEGES;

注:如果连接数据库时出现Access denied for user '用户名'@'某IP' (using password: YES)问题,则是第三句授权出了问题,你的本地外网IP被拦截了,那个’%’代表的是访问IP不受限制。

2.3 申请泛域名证书

SSL证书是一种数字证书,用于加密从用户的浏览器发送到Web服务器的数据。 通过这种方式,发送的数据对于使用Wireshark等数据包嗅探器来拦截和窃听您的通信的黑客来说是安全的。

Chrome一直在推动https,所有的http协议网站被标记为不安全,如果再不对网站进行https改造的话,那么可能会对信任度造成一定的影响,所以说对一个面向用户的网站来说,开启https是非常有必要的。

下面将使用acme.sh开源项目申请免费的 Let’s Encrypt 泛域名SSL证书。

注:如果懒得折腾泛域名证书,也可在宝塔面板直接傻瓜式申请Let’s Encrypt的单域名SSL证书(宝塔面板——网站——设置——SSL——Let’s Encrypt——勾选域名,点文件验证——申请出来后设置强制HTTPS)。

2.3.1 安装 acme.sh

1
$ curl  https://get.acme.sh | sh

acme.sh

普通用户和 root 用户都可以安装使用,安装过程进行了以下几步:

  • [1] 把 acme.sh 安装到你的 root 目录下,并创建 一个 bash 的 alias, 方便你的使用。

  • [2] 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。

注:安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中。那个socat未安装的问题不用管,那是http验证无Web Server时才需要的。

2.3.2 生成SSL泛域名证书

acme.sh 实现了 acme 协议支持的所有验证协议,一般有两种方式验证:http 和 dns 验证。

  • http 验证:http 方式需要在你的网站根目录下放置一个文件,来验证你的域名所有权。
  • dns 验证:dns 方式,在域名上添加一条 txt 解析记录,验证域名所有权。

dns 方式的可以使用域名解析商提供的 API 自动添加 txt 记录完成验证,下面我们将采用这种方法申请Namesilo的泛域名证书。

Step1:打开 https://www.namesilo.com/account/api-manager 去申请 NameSilo API,勾选第2个复选框,点击Generate,即可生成。

申请NameSilo API

注:务必不要勾选上Generate key for read-only access的哪个复选框,否则会导致Unable to add the DNS record. Error add txt for domain的问题。另外,生成的API只出现一次,如果没记下来只能重置。

Step2:在服务器输入以下命令,实现自动dns验证生成泛域名证书。

1
2
3
$ cd /root/.acme.sh
$ export Namesilo_Key="xxxxxxxxxxxxxxxxxxxxxxxx"
$ ./acme.sh --issue --dns dns_namesilo --dnssleep 1800 -d example.com -d *.example.com

等待1800s即可看到申请下来的SSL证书(NameSilo的验证比较慢,官方文档上写的900s有时不足以验证完)

申请下来的SSL证书

生成文件都放在/root/.acme.sh/example.com/目录下,其中:example.com.key是密钥文件,fullchain.cer是证书文件。

注:如果你的域名不是NameSilo的,上述操作有所不同,具体请参考: https://github.com/acmesh-official/acme.sh/wiki/dnsapi

2.4 申请Telegram Bot

2.4.1 申请 Telegram Bot

找 BotFather 官方机器人申请自己的 Telegram Bot,需要记录下:BotName、TOKEN、CHATID等信息。

  • Step1:在Telegram中添加BotFather这个账号,然后依次发送/start/newbot,按照提示即可创建一个新的机器人。记下来给你生成的token。
  • Step2:搜索刚刚创建的机器人的名字,并给它发送一条消息。(注意:需要先与机器人之间创建会话,机器人才能下发消息,否则机器人无法主动发送消息)
  • Step3:在Telegram中搜索userinfobot,并给它发送一条消息,它会返回给你chatid,将它也记下来。

2.4.2 修改 Telegram Bot 头像

还是找 BotFather 官方机器人,先发送/setuserpic,它会让你选择为哪个Bot修改,选择完之后发送头像图片给它即可。

注:头像以图片的形式发送,不要以文件的形式发送(发送时点上那个压缩图片即为图片的形式发送)

3. 部署RSSHub制作RSS源

官方提供的服务是https://rsshub.app/,用的人太多,容易失效,强烈建议自己部署 RSSHub 服务。

3.1 使用Docker部署RSSHub

以下我采用了最简的部署方式,一些高级配置我都没有配,会导致部分服务用不了,详见官方文档:https://docs.rsshub.app/en/install/

3.1.1 拉取镜像并部署RSSHub

依次执行以下三条命令,拉取镜像并部署RSSHub,然后设置了开机自启

1
2
3
$ docker pull diygod/rsshub
$ docker run -d --name rsshub -p 1200:1200 diygod/rsshub
$ docker update rsshub --restart=always

这时我们用Chrome打开http://ip:1200/路径,即可看到以下页面,说明部署成功。

RSSHub部署成功

3.1.2 设置反向代理并开启HTTPS

Step1:开启HTTPS

打开宝塔面板——网站——设置——SSL——其他证书,把example.com.key密钥文件、fullchain.cer证书文件复制上去,强制https。

Step2:设置反向代理

宝塔面板——网站——设置——反向代理——添加反向代理——填写代理名称和目标URL(http://127.0.0.1:1200)

设置完之后,我们部署的服务地址即为:https://域名/

3.2 使用RSSHub制作RSS源

3.2.1 根据官方文档手工制作

RSSHUB的使用方法非常简单,查看 RSSHub使用手册 拼接出对应服务的订阅地址即可。

RSSHub生成的RSS订阅地址基本模板为:RSSHub服务地址/订阅的网站路由/订阅页面id

说明:RSSHub服务地址就是你刚才搭建的那个服务地址,把它替换掉官方的https://rsshub.app/,订阅的网站路由查看官方文档,订阅页面id去目标网站获取。

RSSHub支持的平台非常之多,几乎你能想象到的都支持,要么怎么叫万物皆可RSS呢,下面给出几个我常用的,摘自官方文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[1] Bilibili UP主投稿
举例: https://rsshub.app/bilibili/user/video/2267573
路由: /bilibili/user/video/:uid/:disableEmbed?
参数:
uid, 必选 - 用户 id, 可在 UP 主主页中找到
disableEmbed, 可选 - 默认为开启内嵌视频, 任意值为关闭

[2] 知乎热榜
举例: https://rsshub.app/zhihu/hotlist
路由: /zhihu/hotlist
参数: 无

[3] 知乎用户动态
举例: https://rsshub.app/zhihu/people/activities/diygod
路由: /zhihu/people/activities/:id
参数:
id, 必选 - 作者 id, 可在用户主页 URL 中找到

[4] 豆瓣 正在上映的高分电影
举例: https://rsshub.app/douban/movie/playing/7.5
路由: /douban/movie/playing/:score
参数:
score, 必选 - 返回大于等于这个分数的电影

[5] 豆瓣 即将上映的电影
举例: https://rsshub.app/douban/movie/later
路由: /douban/movie/later
参数: 无

[6] Github Trending
举例: https://rsshub.app/github/trending/daily/javascript
路由: /github/trending/:since/:language?
参数:
since, 必选 - 时间跨度, 可在 Trending 页 URL 中找到, 可选 daily weekly monthly
language, 可选 - 语言, 可在 Trending 页 URL 中找到

[7] 腾讯视频 播放列表
举例: https://rsshub.app/tencentvideo/playlist/jx7g4sm320sqm7i
路由: /tencentvideo/playlist/:id
参数:
id, 必选 - 播放列表 ID,可以在 URL 中找到

[8] 原神 动态
举例: https://rsshub.app/yuanshen
路由: /yuanshen/:location?/:category?
参数:
location, 可选 - 区域,可选 zh_CN 或 zh_TW
category, 可选 - 分类,(最新:latest、新闻:news、公告:notice、活动:activity),默认为最新

注:有些服务可能用不了,因为在部署服务时略过了一些高级配置,非要用的话去看官方文档自己研究一下对应的配置。

3.2.2 使用RSSHub-Radar自动生成

RSSHub-Radar 是 RSSHub 的衍生项目,是一个可以帮助你快速发现和订阅当前网站 RSS 和 RSSHub 的浏览器扩展。

  • 快速发现和订阅当前页面自带的 RSS
  • 快速发现和订阅当前页面支持的 RSSHub
  • 快速发现当前网站支持的 RSSHub
  • 支持一键订阅 RSS 到 Tiny Tiny RSS、Miniflux、FreshRSS、Nextcloud News、Feedly、Inoreader、Feedbin、The Old Reader、Feeds.Pub、BazQux Reader、本地阅读器

RSSHub-Radar

Chrome商店安装:https://chrome.google.com/webstore/detail/kefjpfngnndepjbopdmoebkipbgkggaa

压缩包解压安装:https://github.com/DIYgod/RSSHub-Radar/releases

4. 部署 Flowerss Bot 订阅 RSS

Flowerssr bot支持多种部署方式,下面我将以 Docker 的方式部署 Flowerssr bot,数据库选择的是MySQL,VPS系统用的是Debian 10 x86_64。其他方式见:Flowerssr bot 使用文档

4.1 Docker部署Flowerssr bot

Step1:下载配置文件,在项目目录下新建 config.yml 文件

1
2
3
$ mkdir ~/flowerss &&\
wget -O ~/flowerss/config.yml \
https://raw.githubusercontent.com/indes/flowerss-bot/master/config.yml.sample

Step2:修改配置文件(主要是填写Telegram bot Token和数据库信息,其他的按需修改即可)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
bot_token: 你的Telegram Bot Token(必填)
telegraph_token:
telegraph_account:
telegraph_author_name:
telegraph_author_url:
socks5:
update_interval: 10
user_agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36

mysql:
host: 数据库IP(必填)
port: 数据库端口号(必填)
user: 数据库用户(必填)
password: 数据库密码(必填)
database: 数据库名称(必填)

telegram:
endpoint:

log:
level: release
db_log: false # 打印数据库日志,false则只会打印数据库错误日志

sqlite:
path: ./data.db

allowed_users:

配置说明:

Flowerssr-bot配置说明

Step3:创建实例容器并运行

1
2
$ docker run -d --name rssbot -v ~/flowerss:/root/.flowerss indes/flowerss-bot  
$ docker update rssbot --restart=always

正常的话就可以使用了,如果没有部署成功,可以用下面命令看一下日志

1
$ docker logs -f rssbot --tail 100

4.2 Flowerssr bot 的使用

主要分为个人订阅(在Bot里推送)和频道订阅(在频道里推送)flowerss-bot,具体使用可以在 Flowerssr bot 里面使用/help命令查看帮助。

[1] 个人订阅

1
2
3
4
5
6
7
8
9
10
11
12
13
/sub [url] 订阅(url 为可选)
/unsub [url] 取消订阅(url 为可选)
/list 查看当前订阅
/set 设置订阅
/check 检查当前订阅
/setfeedtag [sub id] [tag1] [tag2] 设置订阅标签(最多设置三个Tag,以空格分隔)
/setinterval [interval] [sub id] 设置订阅刷新频率(可设置多个sub id,以空格分隔)
/activeall 开启所有订阅
/pauseall 暂停所有订阅
/import 导入 OPML 文件
/export 导出 OPML 文件
/unsuball 取消所有订阅
/help 帮助

[2] 频道订阅

Step1:将 Bot 添加为 Channel 管理员

Step2:发送相关命令给 Bot

1
2
3
4
5
6
7
8
9
10
/sub @ChannelID [url] 订阅
/unsub @ChannelID [url] 取消订阅
/list @ChannelID 查看当前订阅
/check @ChannelID 检查当前订阅
/unsuball @ChannelID 取消所有订阅
/activeall @ChannelID 开启所有订阅
/setfeedtag @ChannelID [sub id] [tag1] [tag2] 设置订阅标签(最多设置三个Tag,以空格分隔)
/import 导入 OPML 文件
/export @ChannelID 导出 OPML 文件
/pauseall @ChannelID 暂停所有订阅

注:ChannelID 只有设置为 Public Channel 才有。如果是 Private Channel,可以暂时设置为 Public,订阅完成后改为 Private,不影响 Bot 推送消息。

5. 参考资料

[1] RSSHub项目地址 from Github

[2] RSSHub部署 from 官方文档

[3] RSSHub使用手册 from 官方文档

[4] Telegram Bot 使用文档 from cnblogs

[5] Telegram RSS机器人 Flowerssr bot from 勿埋我心

[6] flowerss-bot项目地址 from Github

[7] flowerss-bot使用说明 from 官方文档

[8] 简化查找和订阅 RSS 和 RSSHub 的浏览器扩展 from Github