[教程]免费搭建类似狗耳朵的Kindle RSS推送系统

前言、既然有了狗耳朵,为什么还要自己搭建RSS推送

近期平板盒子网的小编小小才入手了Kindle Paperwhite 2日版,阅读体验非常好,也同时使用了一下大家都推荐的狗耳朵RSS推送,感觉也蛮不错。但是我所不满意的是,狗耳朵的自定义订阅和推送中的图片功能均只有付费VIP用户才能使用。本着试试看的心态在Github上进行了搜索,巧了,还真给我找到两个能将RSS订阅生成类似狗耳朵那样的每日期刊的开源项目。

其中一个名为Kindlereader,它原先使用Google Reader,程序源码可以搭建在GAE、Linux、Windows上,但是Google关闭Google Reader之后,其源码之后的分支只能搭建于Linux、Windows上。作为普通的一名学生,我不可能花钱去买一台服务器搭建这样的程序,而且也不长久,所以不予以选择,放弃。

现在介绍的KindleEar是由cdhigh编写的能运行在GAE上的类狗耳朵第三方推送,其最吸引人的好处就是:免费、搭建方便、可自由定制订阅、推送中有图片、生成的电子期刊页面精美。

KindleEar期刊演示

在写此教程的同时,笔者又找到了Kindle4RSS,其推送的效果和我即将要介绍的KindleEar差不多,文章中也能显示图片。但是,自动递送功能只有付费用户才能使用这一点依旧让我很不爽。Anyway,我的推送我做主,免费又高质的RSS推送谁不想要呢?

一、前期准备

1、相关知识简析

笔者是学软件的,所以下文中很多名词,可能我觉得很习惯,但是大部分非技术人士可能觉得很陌生。So BYW,我将可能一些可能涉及到的名词进行解析。

  • 推送:所谓的Kindle推送,严格意义说就是Kindle个人文档服务,可以免费将您的个人文档通过电子邮件传输至您的Kindle设备或Kindle阅读软件。
  • Feed(RSS or ATOM):无论是RSS也好,ATOM也好,均是一种基于XML格式对于信息的描述。其规范中详细定义了一系列的Scheme和DTD(口胡,无视)来使得其可以被解析成为HTML格式的图文样式显示于第三方的平台上。
    对于使用者我们而言,目前基本大一点的网站和博客均提供RSS或者ATOM输出,我们可以用KindleEar定时获取我们感兴趣的网站上的内容,然后推送到设备上阅读
  • Kindle期刊:对于Kindle使用者的而言,期刊杂志的阅读与一般的书籍阅读有所区别(用户手册里面有专门介绍过),在国外Stackoverflow的问答贴中有关于Kindle期刊格式的详细介绍。一般情况下,期刊(Periodical)已知的创建方式有三种:
  1. 使用Kindle出版软件KindleGen将.opf.ncx格式的文件转换为期刊。(现在已经不再使用)
  2. 注册成为Kindle杂志的出版提供商,但是目前已经关闭公开注册,申请条件十分坑爹。
  3. 使用Calibre创建期刊格式的文档,此软件通过反编译Kindle官方的期刊文件获取了期刊格式的基本编码规范。所以,本文即将推荐的KindleEar亦是通过python移植实现了对应的库。

2、什么是GAE

GAE一般代指Google App Engine(谷歌应用引擎),也就是目前网上炒得很火的云的一种(PaaS平台即服务)。对于我们而言,不管云不云主要是它是免费的,其每天都有一定的免费配额,超出配额就要付费,但是对于Kindle的推送免费配额就够了。(由于GAE限制每小时可发送的邮件数量,详细设置时还请注意后面的注意事项。)

3、什么是GoAgent

GoAgent其实说白了就是基于前面介绍的GAE的基础上软件爱好者使用python书写的跨平台(Windows/Linux/Mac/路由器/手机均可使用)的网络反代软件。

使用此软件的原因是GAE搭建的HTTP应用的网址在大陆均被屏蔽无法访问,如果你懂别的方法,比如隧道连接。你可以跳过下面的GoAgent配置环节。或者你有钱买得起独立域名的话,可以使用GAE企业版绑定域名,比如笔者的RSS推送

4、什么是KindleEar

通俗点说,就是一个程序,能够让你通过它向你的Kindle设备推送你设置好的网站订阅。作者于今年7月在ChinaUnix论坛上介绍了此项目

1)程序介绍

这是一个运行在Google App Engine(GAE)上的Kindle个人推送服务器,生成排版精美的杂志模式MOBI格式自动每天推送至您的kindle,此网站应用目前的功能有:

  1. 支持类似calibre的recipe格式的自定义RSS收集,需要写代码,需要有一点点python基础
  2. 自定义RSS,不需要python基础,直接输入RSS链接和标题即可自动推送
  3. 多账号管理,也就是支持多kindle
  4. 带图的杂志格式MOBI
  5. 自动每天定时推送

2)作者开发心得(可以直接PASS)

  • 为何不使用GAE自带的Webapp框架,而选择Web.py?

其实最重要的就是Webapp缺少移植性,只能在GAE上使用,反正Webapp和Web.py都需要学习,为何不学习一个以后在其他平台上也能使用的框架呢?还有,最开始时我也使用了django搭建了初始版本,后来发现使用django太繁琐了,太笨重了,而且时不时有各种各样的问题要解决,一气之下就丢一边去了。然后看了网上对于各种Web框架的一大堆讨论分析对比,还是按照自己的心意和喜好选定了Web.py。

  • 为何不使用Web.py自带的模板,而使用jinja2?

其实我之前已经使用web.py的模板搭建好系统框架了,后来发现Templetor模板(Web.py自带模板)的“模板继承”功能太弱,各个页面之间的重复代码太多,就考虑换一个模板系统,因为学过django,所以jinja2无疑是首选,语法类似,并且jinja2也是GAE推荐,根据网上评测,性能也很好,所以就选定了jinja2。

题外话:我没有使用Web.py封装的jinja2接口,而是直接使用jinja2的Environment() API。也是为了更通用,不被绑死在Web.py上,比如万一我哪天不爽,想切换成Bottle……

  • 模块动态加载(插件机制)

此网站支持插件机制,类似于Calibre的Recipe,写一个特定格式的py文件放到books目录下,网站自动加载并显示在“我的订阅”页面。

def LoadBooks():
    for bkfile in os.listdir(os.path.dirname(__file__)):
        if bkfile.endswith('.py') and not bkfile.startswith('__') and not bkfile.endswith("base.py"):
            bookname = os.path.splitext(bkfile)[0]
            mbook = __import__("books." + bookname, fromlist='*')
            bk = mbook.getBook()
            RegisterBook(bk)
  • 更好的Urlfetch

有些网站很可恶,如果你不带Cookie访问,会返回302,并重定向到同一个地址,如果再次访问,有一定的概率会返回200。所以GAE时不时会报Too many redirects异常,又不是每次重现,之前因为这个问题,折腾了我好几天,后来经过Google的反复调教,终于明白是Cookie的问题,带Cookie访问就没这个问题了。

还有,因为要抓取网页,有时候网页中的一些图片会导致无法访问或访问超时,也会时不时出错,当然了,也是经过万能的Google的帮助,在一位前辈那里学会了给Urlfetch增加失败重试功能。

然后,我再将上面两个解决方案合一,参见Urlopener.py,使用此类代替Urlfetch后,网站稳定了。

  • Web.py在GAE上使用Session

Web.py的Session机制无法直接部署到GAE上,因为GAE不支持本地文件存储。

这个问题的解决方案也是Google来的,特地整理在这里,就是使用Memcache实现一个Store子类,参见Memcachestore.py文件。

  • 尽管是个人网站,但是密码也不使用明文保存

但是也没有必要加密过甚,因此使用最简单的MD5即可。

    import hashlib
    passwd = hashlib.md5(password).hexdigest()

二、搭建GoAgent

1、注册Google账号

如果,你已经有了Google账号直接下一步,打开注册页面
Google注册

点击下一步,在选择SMS验证方式,在新页面中输入手机短信验证码,点击下一步。
SMS短信验证

到此为止,我们的Google账号就算注册完毕。

2、建立Google App Engine 应用

打开GAE网站,在页面中输入密码,点击登陆。

GAE初始化

第一次登陆时便是如上页面,英文看不懂,大丈夫(没关系)。容我一步步教你。

点击Create Application,在如下的新页面输入必要的信息:

创建GAE应用

  • 首先输入Application Identifier(应用标识),中英文混合至少6位,点击右侧按钮Check Availability,如果显示Yes, "XXXXXX" is available!的话即可。请记住这里输入的字串,后面配置时需要用到。
  • 输入Application Title(应用标题)下的自定义标题,中英文均可,长度不限,只做标示。
    创建GAE应用-协议
  • 页面移动至底部,勾选I accept these terms.前的确认框。
  • 点击最下方的按钮Create Application,程序创建完毕。
    GAE程序创建成功
  • 出现如上页面,表示程序创建成功。

3、配置GoAgent项目

下载GoAgent
打开Github上的GoAgent发布页面在新页面上选区最新版本下载,比如截图中最新是v3.0.8版本。下载到本地解压后,修改local文件夹里面的proxy.ini文件。
编辑GoAgent配置文件
将图中紫色高亮的部分改成前面创建应用时自定义的Application Identifier,然后将下面的profile = google_cn改为profile = google_hk最后保存文件。回到上一级根目录,打开server文件夹里面的uploader.bat批处理文件。
GoAgent上传
按照提示,首先输入APPID(Application Identifier),也就是前面在proxy.ini文件里面输入的字串,按回车继续。
程序提示输入Email,请输入你前面第一步注册的Gmail邮箱,格式类似xxx@gmail.com,按回车继续。
下面要输入的就是Password(密码),注意的是,在这里输入的密码会以*显示,按回车继续(不要按数字键盘的回车)。
上传成功
按照程序提示,再一次分别输入邮箱和密码,按回车结束。稍后片刻,程序下方提示上传成功。

三、搭建KindleEar

1、下载最新版本源码

由于GAE的坑爹BUG比较多,KindleEar程序到目前为止依旧还在开发过程中,我们可以从项目主页上获取最新的代码。下载地址为:戳我,目前最新的版本是1.6.10 。

由于程序使用Google Appengine SDK开发,所以上传方法较为麻烦,作者cdhigh提供上传工具uploader,下载地址为:戳我

2、修改上传项目至GAE

  • 首先,我们按照上面建立Google App Engine 应用里面描述的步骤建立一个新的GAE应用。
  • 然后我们解压kindleear_uploader.rar,将KindleEar-master.zip解压在kindleear_uploader目录下,并将解压出来的KindleEar-master文件夹改名为kindleear。修改好的结果如下图所示:
    文件夹层次
  • 进入kindleear目录,修改app.yaml文件,将第一行kindleear改为你第二次创建GAE应用时输入的Application Identifier,然后保存。
    修改配置文件
  • 继续修改config.py中的这几个变量:

    SRC_EMAIL:你前面创建的Gmail邮箱
    TIMEZONE:默认时区

  • 返回kindleear_uploader目录下,双击运行uploader.bat文件。与GoAgent步骤相类似,程序首先提示你输入Email,然后输入密码。值得注意的是,此处输入的密码不会显示任何提示,按回车继续。
    上传Kindleear
    上传成功
  • 稍候片刻,程序提示Deployment successful

四、配置KindleEar

1、启动GoAgent

GoAgent的使用离不开游览器插件,由于笔者使用Chrome所以后面的均以Chrome为基础说明。

打开SwitchySharp的插件页面,待网页加载完毕后,点击右上角按钮添加到游览器。
安装插件
在弹出的新对话框内点击添加,稍候片刻插件安装完毕。
导入配置

插件安装完毕后自动打开插件配置页面,点击导入/导出,在最下方的在线恢复备份右侧输入地址:https://goagent.googlecode.com/files/SwitchyOptions.bak。点击按钮在线恢复备份
程序提示确认恢复备份吗?,点击确认。

双击运行GoAgent的local目录下的goagent.exe,将弹出的黑色对话框最小化,不要关闭。

2、访问KindleEar的设置页面

继续前面的步骤,点击Chrome游览器右上角的灰色地球图标,选择GoAgent

打开页面http://xxx.appspot.com/,请把xxx替换为你注册的第二个GAE应用的Application Identifier,第一次打开页面的时间很久,笔者差不多等了10秒钟。
KindleEar首页

如果你能看见上述的页面,那么恭喜你了,下面开始详细配置过程。

3、登录设置

点击按钮请先登录,在新页面中输入用户名和密码,默认都是admin
基本设置
进入后台后点击设置,输入你的Kindle Email,并按照你的喜好调整下面的选项,最后点击页面底部的保存设置即可。

打开亚马逊个人文档设置页面,在已认可的发件人电子邮箱列表中添加你一开始注册的Gmail邮箱账号。

投递日志内将会记录到目前为止的推送历史,如果此处显示状态为OK,但是你的Kindle还没有收到推送的话,还请耐心等待,一般会有1~2个小时的延迟,所以建议推送时间为4点~6点。如果一直收不到推送,还请确定是否添加邮箱至已认可的发件人电子邮箱列表,并查看你的Gmail中是否有推送失败的记录。
订阅设置
我的订阅中可以设置自定义订阅,自定义订阅将和狗耳朵类似,直接一个文件推送,由于推送文件越大,延迟越大。所以,如果推送周期为一天的话,自定义订阅数就不要超过10个。推送周期越长,自定义订阅数还是尽量少。想要分时段推送,在账户管理里设置多账户,使用不同账户设置推送时段,自定义账户数也不要超过10个。

自定义RSS里面主要注意的是那个红色的iffulltext,勾选之后表示RSS是全文输出。对于非全文输出,需要爬虫去检索,所以推送的时间会比较慢,建议添加RSS时最好勾选。

4、注意事项

  1. 如果你使用“自定义RSS”,所有的通过RSS订阅的内容会生成一本电子书,格式如程序FAQ中所示的那样,如果单独的RSS的内容本身就很多,建议按照模板自己写一个Book的模板。
  2. 如果网站本身提供RSS订阅,不论是摘要还是全文都很好办,复制一下南方周末的py文件,修改py文件文件中的几处内容可以了。当然追求完美的话,你可以为这本书设计一个封面和页眉,但是封面和页眉在一本书中只会出现一次。(此部分配置需要一定编程基础)
  3. 订阅的内容较多的话建议新建一个帐号,分时段推送,这样可以错开推送的高峰期。由于GAE免费资源的坑爹性,一个小时内只能发送4封免费邮件,强烈建议您多账户分时段推送。
  4. 对于某些网站,如Nature、BBC等比较友好,生成的书籍比较工整,基本上不需要修改。但是对某些网站,可以通过remove_classes、remove_id等方式删除其中的广告内容,还可以顶点删除某些不需要的内容和调整格式,当然这需要你多次尝试和查看网页的源代码。
  5. RSS过多导致内存占用过大,可以在GAE后台Application Settings的 Performance 设置中,将Frontend Instance Class选择为F2(1200MHz,256MB),这是FAQ中的内容。
    当然为了节约资源,你还可以将Max Idle Instances滑动到最左边,将Min Pending Latency滑动到最右边,这样可以保证24小时内系统资源仍然不被消耗完。
  6. 编写Book的py文件时,可以查看GAE后台的Log文件,便于找出编写不规范的地方,py的格式很重要,任何一个小小的格式问题都可能导致运行失败。
  7. 最后一点,生成的电子书可以使用早期Kindle设备的“自动朗读”功能。

五、开始RSS推送

相关订阅列表推荐

附录、相关参考网址

后记

废话了这么多,感谢你的耐心阅读,如果我的教程对您有帮助还请使用我的Dropbox邀请链接注册账号来帮我增加空间,谢谢。

作者:小小

雨帆就是我,一直很年轻的孩子。

5条评论

  1. 你好,感谢你细致的分享,但到最后还是出现了问题,在输入admin登陆后我的页面出现internal server error的字样,我已束手无策,还望赐教。

评论已关闭。