写在开头。

说说初衷吧,其实之前一直使用狗耳朵订阅新闻或者blog,但是不知何原因,某天发现莫名其妙用不了了,多方联系狗耳朵制作者也没任何回应。尔后又发现,最近好像封了特别多类似狗耳朵的推送网站,不知道是不是因为很多网站都支持订阅墙外内容的原因。(rss订阅基本没有什么版权问题,实在想不出什么其他原因。)

所以一怒之下,决定自己做一个。给这一整套服务取名为——rss4kindle,并提供同名公众号服务。

rss4kindle主要用于做kindle的rss订阅服务,简单来讲,就是将感兴趣的rss订阅源内容聚合到一起,然后推送到kindle设备上。 rss4kindle服务示意图

也就是说,用户没有必要每天到不同的网站获取感兴趣的内容,rss4kindle会自动将这些内容搜集起来,其实也就是实现了rss阅读器的功能,这是其一;感兴趣的内容聚合之后,会将这些内容制作成电子书,并推送至kindle设备上,方便kindle迷妹迷弟们阅读,这是其二。 就这么两个简单的功能,当然为了使用方便,后期还加上了公众号订阅服务。

实现过程中,用到了几个主要技术,rss, web.py, kindlegen,其中rssweb.py都与Aaron Swartz有关,Aaron是一个才华横溢的年轻人,一个纯粹的人,理想型人格,却被迫自杀,让人扼腕,后面会专门写篇文章讲他。

rss4kindle实现的主要内容有:

  1. rss4kindle架构
  2. 公众号及网页搭建
  3. utils工具模块
  4. 电子书制作 a. rss源内容整合 b. 生成电子书 c. 电子书推送

由于内容较多,准备分两篇介绍实现方式,本篇会对整体架构做一个介绍,并公众号和服务器的搭建。

最最开始的想法,只是做一个rss的推送功能供个人使用,因此,架构是这样子的:最初模块设计

好处是简单易实现,坏处也是显而易见的,没有用户管理,无法灵活的配置订阅源等等。

在此基础上引入数据库,并做了扩充。 下面进入正题。


1. rss4kindle概述

rss4kindle面向kindle用户提供rss订阅的推送服务,该服务与微信公众号相结合,用户首先需要将公众号的发送邮箱加入其亚马逊的邮箱信任列表中,再通过微信公众号访问web设置页面,填入其用户信息(kindle邮箱),选择需要订阅的rss源,并选择发送时间,完成设置。

rss4kindle会在指定的发送时间,根据用户的选择,制作出包含其勾选的rss订阅源的当天资讯文章的电子书,并将该电子书推送至用户的kindle上。

1.1 rss4kindle架构

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'))
)