实现kindle的订阅及推送服务(一)——整体架构
写在开头。
说说初衷吧,其实之前一直使用狗耳朵订阅新闻或者blog,但是不知何原因,某天发现莫名其妙用不了了,多方联系狗耳朵制作者也没任何回应。尔后又发现,最近好像封了特别多类似狗耳朵的推送网站,不知道是不是因为很多网站都支持订阅墙外内容的原因。(rss订阅基本没有什么版权问题,实在想不出什么其他原因。)
所以一怒之下,决定自己做一个。给这一整套服务取名为——rss4kindle,并提供同名公众号服务。
rss4kindle主要用于做kindle的rss订阅服务,简单来讲,就是将感兴趣的rss订阅源内容聚合到一起,然后推送到kindle设备上。
也就是说,用户没有必要每天到不同的网站获取感兴趣的内容,rss4kindle会自动将这些内容搜集起来,其实也就是实现了rss阅读器的功能,这是其一;感兴趣的内容聚合之后,会将这些内容制作成电子书,并推送至kindle设备上,方便kindle迷妹迷弟们阅读,这是其二。 就这么两个简单的功能,当然为了使用方便,后期还加上了公众号订阅服务。
实现过程中,用到了几个主要技术,rss, web.py, kindlegen,其中rss 和web.py都与Aaron Swartz有关,Aaron是一个才华横溢的年轻人,一个纯粹的人,理想型人格,却被迫自杀,让人扼腕,后面会专门写篇文章讲他。
rss4kindle实现的主要内容有:
- rss4kindle架构
- 公众号及网页搭建
- utils工具模块
- 电子书制作 a. rss源内容整合 b. 生成电子书 c. 电子书推送
由于内容较多,准备分两篇介绍实现方式,本篇会对整体架构做一个介绍,并公众号和服务器的搭建。
最最开始的想法,只是做一个rss的推送功能供个人使用,因此,架构是这样子的:
好处是简单易实现,坏处也是显而易见的,没有用户管理,无法灵活的配置订阅源等等。
在此基础上引入数据库,并做了扩充。 下面进入正题。
1. rss4kindle概述
rss4kindle面向kindle用户提供rss订阅的推送服务,该服务与微信公众号相结合,用户首先需要将公众号的发送邮箱加入其亚马逊的邮箱信任列表中,再通过微信公众号访问web设置页面,填入其用户信息(kindle邮箱),选择需要订阅的rss源,并选择发送时间,完成设置。
rss4kindle会在指定的发送时间,根据用户的选择,制作出包含其勾选的rss订阅源的当天资讯文章的电子书,并将该电子书推送至用户的kindle上。
1.1 rss4kindle架构
如图1所示,rss4kindle分为两个大的部分:web和core。
- web负责提供web服务,创建网页,向微信公众号提供服务。
- core 实现rss源内容的获取、电子书生成、邮件发送的功能。
- utils提供一些工具,目前只有针对数据库的工具封装。
NOTE: rss4kindle跑在服务器上。
1.2 web模块
web模块的架构及实现,见实现kindle的订阅及推送服务(二)——订阅网页搭建
1.3 core模块
core模块的架构及实现,见实现kindle的订阅及推送服务(三)——订阅内容获取、电子书生成及推送
1.4 utils工具模块
utils一般存放项目的通用工具,目前只实现了数据库读写的dbExecutor。
web.py本身已对数据库接口进行了封装,以支持不同数据库的使用。 目前支持的数据库有mysql, sqlite, postgres, firebird, mssql, oracle,但在使用前,必须首先确保本机已经安装该数据库。 考虑到数据量不会太大,本项目采用sqlite,且另一个原因是python2.7自带对sqlite3的支持,免去了额外的导入。
由于web模块以及core模块都需要用到数据库,本文没有使用web.py自带数据库接口,而是根据自身需求将sqlite3 module封装成dbExecutor,方便使用统一数据库接口。
rss4kindle只包含两张表,一为用户表,记录用户的kindle账号和发送时间;一为订阅表,记录某一用户选择的订阅源。 userSubscribe_t中的SENDTIME其实是一个冗余值,为今后扩展暂时做保留。
CREATE TABLE user_t (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
SENDTIME TEXT,
ADDRESS CHAR(50) NOT NULL,
UPDATETIME TimeStamp NOT NULL DEFAULT (datetime('now','localtime'))
)
CREATE TABLE userSubscribe_t (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
SENDTIME TEXT,
ADDRESS CHAR(50) NOT NULL,
FEED CHAR(50),
UPDATETIME TimeStamp NOT NULL DEFAULT (datetime('now','localtime'))
)
- CentOS8服务器上部署Docker memos+Nginx反向代理实现外网访问
- macOS搭建Apache2.4 + PHP7.3 + MySQL8.0 + ThinkPHP6.0开发环境
- macOS系统Apache配置虚拟主机vhost
- Win10下部署Apache+PHP+MySQL环境
- ubuntu18.04下安装ss-qt5并配置Chrome和Terminal科学上网
- 一个定制微信朋友圈截图的小程序示例
- Windows上RobotFramework&RIDE的环境部署
- [解决]Github pages 无法自动更新
- 利用 Github Pages 搭建博客
- Windows上部署Jekyll