forked from cdhigh/KindleEar
-
Notifications
You must be signed in to change notification settings - Fork 0
/
faq.html
280 lines (256 loc) · 23.9 KB
/
faq.html
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>FAQ - Kindle's Ear</title>
<meta name="description" content="KindleEar is a service for Amazon Kindle owners that lets you aggregate feeds you chosen and have them delivered to your Kindle in a convenient, easy-to-navigate format." />
<link rel="stylesheet" href="base.css" type="text/css" charset="utf-8"/>
<style type="text/css">
h2{
font-size:1.2em;
margin-top:2em;
padding-left:0.8em;
border-left:0.5em outset silver;
border-bottom:1px dotted silver;
}
li{margin:0.5em;list-style-type:square;}
ul#navlst > li{list-style-type:circle;}
</style>
</head>
<body>
<div id="header">
<h1><a href="/">KindleEar</a></h1>
<div class="clear"></div>
</div>
<div class="faqnav">
<ul id="navlst">
<li><a href="#whatis">KindleEar是什么?</a></li>
<li><a href="#needserver">此应用需要自己的服务器吗?</a></li>
<li><a href="#ownserver">如何搭建自己的推送服务器?</a></li>
<li><a href="#notreceived">为什么我收不到推送的RSS?</a></li>
<li><a href="#whatisfulltext">何为全文RSS?</a></li>
<li><a href="#fulltextandsummary">全文RSS能否按照摘要RSS处理?反之是否可以?</a></li>
<li><a href="#weekly">如何按周订阅?</a></li>
<li><a href="#moretimesperday">如何一天推送多次?</a></li>
<li><a href="#urlfilter">URL过滤器功能如何使用?</a></li>
<li><a href="#gfwblock">部分RSS有敏感内容,被墙屏蔽了怎么办?</a></li>
<li><a href="#imagesfolder">自定义书籍py文件,如何将封面/报头放到py同一目录?</a></li>
<li><a href="#sslerror">GAE上传遇到SSL出错,如何解决?</a></li>
<li><a href="#garbled">有部分文章乱码?</a></li>
<li><a href="#forgotpwd">忘记密码了怎么办?</a></li>
<li><a href="#mailservice">xxx@appid.appspotmail.com邮件地址怎么用?</a></li>
<li><a href="#delaytocn">推送至亚马逊中国邮箱有比较大的延迟?</a></li>
<li><a href="#errorcodes">在gae后台时不时有fetch rss failed(450)等错误是什么问题?</a></li>
<li><a href="#mergebooks">为何合并多本书籍推送后无法查词典?</a></li>
<li><a href="#share">“高级设置”里的归档和分享功能如何使用?</a></li>
<li><a href="#needlogin">有的网站需要登陆才能阅读文章的问题如何解决?</a></li>
<li><a href="#inie6">网站在IE6下显示不正常?</a></li>
<li><a href="#pushseparate">内置书籍订阅时“Separate”选项是什么意思?</a></li>
<li><a href="#internalerror">部署应用后打开网页出现“internal server error”如何处理?</a></li>
</ul>
</div>
<span id="whatis"></span>
<h2>KindleEar是什么?</h2>
<p>KindleEar是部署在Google Appengine上的免费应用,主要功能是自动定期通过RSS收集网络文章然后制作成图文并茂的电子书推送至你的Kindle。</p>
<p class="answer">主要特性:
<ul>
<li>自定义RSS</li>
<li>支持RSS全文抓取</li>
<li>多账号管理,也就是支持多kindle</li>
<li>带图的杂志格式MOBI</li>
<li>自动每天定时推送</li>
<li>强大并且方便的邮件中转服务</li>
</ul>
优点:
<ul>
<li>全免费,不单此应用免费,而是GAE免费提供托管空间,你不需要付一分钱。</li>
<li>生成精美的杂志格式书籍。样例如下(左一为kindle3,右两个为kindle touch):</li>
<a href="periodical.gif" target="_blank"><img src="periodical.gif" style="width:750px;" /></a>
</ul>
</p>
<span id="needserver"></span>
<h2>此应用需要自己的服务器吗?</h2>
<p class="answer">此应用托管在Google App Engine服务器上,不需要你自己的服务器。</p>
<span id="ownserver"></span>
<h2>如何搭建自己的推送服务器?</h2>
<p class="answer"><strong>以下是正规的搭建步骤:</strong>
<ol>
<li>在 <a href="http://www.github.com/cdhigh/kindleear">Github</a> 页面上下载KindleEar的最新版本,在页面的右下角有一个按钮"Download ZIP",点击即可下载一个包含全部源码的ZIP文档,然后解压到你喜欢的目录,比如C:\KindleEar(下面以这个为例)。</li>
<li>你需要一个GAE账号,请移步 <a href="https://appengine.google.com/">Google AppEngine</a> 申请。使用G你的gmail账号登陆后,点击"Create Application",进入到帐号短信激活界面,选择Others,输入你自己的手机号(中国手机国家号:+86),输入完毕点击Send,稍后就可以在手机上收到激活信息,待激活后再次点击Create Application,在Application Identifier一栏输入你选择的应用名字(如:KindleEar123)。其余选项保持默认即可,点击页尾的Create Application即成功创建了一个GAE程序(用来上传KinldeEar之用)。</li>
<li>安装 <a href="http://www.python.org/getit/">Python 2.7.x</a>,在此页面中选择你的系统平台对应的2.7.x版本下载,然后直接双击安装。注意不要安装成Python 3.x版本,GAE暂不支持。</li>
<li>下载 <a href="https://developers.google.com/appengine/downloads?hl=zh-CN">GAE SDK</a>,这是用来上传GAE程序用的。在此页面中的区段“Google App Engine SDK for Python”中选择你的系统平台对应的版本点击即可下载,然后安装,一路next无话。</li>
<li>打开资源管理器,进入之前下载的KindleEar目录C:\KindleEar,使用任何文本编辑器打开app.yaml和module-worker.yaml文件,将第一行的kindleear字样修改为你之前申请的GAE程序名(比如kindleear123),保存退出。</li>
<li>在app.yaml的同一个目录,打开config.py文件,修改SRC_EMAIL为你的gmail账号,DOMAIN为你的应用的域名。其他的选项也可以根据注释有选择性的修改,或者使用默认即可。</li>
<li>正式上传KindleEar。可以使用Google App Engine Launcher或使用命令行,因为Launcher不太稳定,这里介绍一下windows下使用命令行的方式。
<li>依次点击:开始-运行-输入CMD,打开命令行窗口</li>
<li>进入到App Engine SDK安装目录;例如:cd "C:\Program Files\Google\google_appengine"</li>
<li>输入“上传”命令:c:\python27\python.exe appcfg.py update C:\kindleear\app.yaml c:\kindleear\module-worker.yaml</li>
<li>依次输入gmail账号及密码(密码输入时屏幕不显示)既可成功上传。</li></li>
<li>显示上传成功后使用你的浏览器打开域名:kindleear123.appspot.com(举例而已,kindleear123要改为你申请的GAE程序名称),如果能正常打开,则还有最后一步。</li>
<li>将你的gmail账号加入kindle推送邮箱的白名单。这一步你应该早就会了吧。</li>
<li>然后呢?享受你自己的推送服务吧!</li>
</ol>
<p><strong>以下是推荐的简化搭建步骤(使用uploader):</strong>
<ol>
<li>下载<a href="http://www.github.com/cdhigh/kindleear">KindleEar</a>和申请GAE账号,并创建一个application。</li>
<li>下载<a href="https://drive.google.com/folderview?id=0ByRickMo9V_XNlJITzhYM3JOYW8&usp=sharing">uploader</a>。如果此链接被墙,可以使用此 <a href="http://yunpan.cn/QGiHjKRZ6EreW">墙内地址</a>(提取密码:beaa)。</li>
<li>解压uploader到特定目录,将之前下载并解压的KindleEar目录拷贝到此目录下,改名为kindleear,然后双击执行uploader.bat后根据提示输入appid/email/timezone后会正式启动上传程序,输入email和密码即可上传代码。</li>
</ol></p>
</p>
<span id="notreceived"></span>
<h2>为什么我收不到推送的RSS?</h2>
<p class="answer">收不到推送的RSS原因很多,如下是几种可能:
<ol>
<li>没有打开"自定义RSS"的投递开关,此开关在设置网页的最下面。</li>
<li>没有在kindle邮箱的白名单中加入你的gmail地址:</li>
<ul><li>解决方案:登陆http://www.amazon.com/,增加白名单即可</li></ul>
<li>添加RSS过多导致内存占用过大,程序被自动终止。
<ul><li>打开module-worker.yaml,将instance_class值修改为B4,然后重新上传。</li></ul>
</li>
<li>你输入的订阅地址不是合法的RSS/ATOM订阅(XML格式)。</li>
</ol></p>
<span id="whatisfulltext"></span>
<h2>何为全文RSS?</h2>
<p class="answer">全文RSS就是在RSS的XML文件中已经给出了文章全文的RSS,使用浏览器打开RSS对应的链接,查看是否已经有全部的文章内容?如果是,则为全文RSS。如果仅给出文章摘要,则不是。</p>
<span id="fulltextandsummary"></span>
<h2>全文RSS能否按照摘要RSS处理?反之是否可以?</h2>
<p class="answer">全文RSS当然可以按照摘要RSS处理,这样就忽略RSS链接中给出的文章内容,而直接到原链接中获取,只是时间要多花费不少,导致支持的RSS数量下降。如果是摘要RSS,则不能按全文RSS处理,否则会导致文章内容不全。</p>
<span id="weekly"></span>
<h2>如何按周订阅?</h2>
<p class="answer">有些RSS每周更新,这样每天推送同样的内容就蛋疼了点,碰到这种情况,有两种处理方法:
<ol>
<li>在books目录下添加一个py文件,将参数deliver_days设置为你需要推送的星期(英文星期单词),注意deliver_days是一个列表,你也可以设置为几个单词,这样的话,其实也可以设置为哪天不推送。
<br />比如:<code>deliver_days=['Friday']</code></li>
<li>使用管理员登陆,新增一个账号,退出,使用新账号登陆,添加需要的RSS,然后在“设置”页面仅选择你需要的其中一个“投递日”,在页面下方的“最旧文章”中选择“一个星期”。</li></ol></p>
<span id="moretimesperday"></span>
<h2>如何一天推送多次?</h2>
<p class="answer">需要及时跟踪网站最新消息的同学可能有一天推送多次的需求,以下步骤告诉你如何实现:
<ol>
<li>在books目录下添加一个py文件。</li>
<li>deliver_times设置为你需要推送的整点时间列表。
<br />比如:<code>deliver_times=[6,14,22] #6:00,14:00,22:00三次推送</code>
</li>
<li>如果需要,oldest_article设置为多次推送的间隔秒数,这样就不推送重复文章了。
<br />比如:<code>oldest_article=28800 #8*60*60</code>
</li>
</ol>
</p>
<span id="urlfilter"></span>
<h2>URL过滤器功能如何使用?</h2>
<p class="answer">URL过滤器为高级功能,面向懂python正则表达式的同学,应用场景是这样的:有一些RSS的一部分固定的图像会一直下载不了,为了节省时间支持更多的RSS,则建议过滤这些图像URL,不再下载。URL过滤器支持正则表达式,请严格按python正则表达式的语法编写URL过滤器。</p>
<span id="gfwblock"></span>
<h2>部分RSS有敏感内容,被墙屏蔽了怎么办?</h2>
<p class="answer">升级到1.5及以上版本,并且将被qiang的RSS的链接协议改为https。</p>
<span id="imagesfolder"></span>
<h2>自定义书籍py文件,如何将封面/报头放到py同一目录?</h2>
<p class="answer">升级到1.5及以上版本,在封面/报头文件设置中有全路径信息即可,如下:<ul>
<li>mastheadfile = 'books/xxxx.gif'</li>
<li>coverfile = 'books/xxxx.jpg'</li></ul></p>
<span id="sslerror"></span>
<h2>GAE上传遇到SSL出错,如何解决?</h2>
<p class="answer">墙内的朋友有时候在上传代码时遇到此错误:urllib2.URLError: <urlopen error [Errno 8] _ssl.c:504: EOF occurred in violation of protocol>,如果这样,改hosts即可:“74.125.229.174 appengine.google.com”</p>
<span id="garbled"></span>
<h2>有部分文章乱码?</h2>
<p class="answer">对于自定义RSS和不指定编码的内置书籍,软件使用多种方法综合确定网页的编码:HTTP头/HTML头/python模块chardet检测的编码,最终结果并不是100%正确的,如果检测错误,则文章可能乱码,这在浏览器上偶尔碰到网页乱码一样道理。
<br />因为这种情况很少见,KindleEar仅提供一个不是很优雅的hack方案:手工更改数据库缓存的chardet检测的编码。<br />方法如下:
<ol><li>使用admin登陆appid.appspot.com(假定你的应用名字为appid)。</li>
<li>浏览器地址栏中输入https://appid.appspot.com/dbviewer,翻到页面UrlEncoding区段,查看乱码文章对应网站的编码信息,如果编码不对,记下ID号,进行下一步。</li>
<li>地址栏中输入https://appid.appspot.com/dbviewer?action=modurlenc&id=dbid&feedenc=fenc&pageenc=penc
<ul>解释一下,在这一长串字符串中,你先要更改:
<li>dbid:你记下来的编码对应网站ID。</li>
<li>fenc:你希望更改FeedEncoding的编码。</li>
<li>penc:你希望更改PageEncoding的编码。</li>
</ul></li>
<li>或者你可以在GAE后台的Datastore Viewer中修改。</li>
<li>至于怎么获取正确的编码,可以通过在浏览器中查看网页源码。</li>
<li>如果你在dbviewer页面中找不到你需要修改的网站,则说明KindleEar一直没有使用chardet检测过此网站任何网页编码,仅使用HTTP头/HTML头信息,这种情况你可以设置config.py文件中的ALWAYS_CHAR_DETECT变量为True再尝试。</li>
<li>如果设置ALWAYS_CHAR_DETECT为True还是乱码,则说明chardet检测到的编码错误,并且HTTP头/HTML头编码信息不一致(还是有这种奇葩的网站的),这种情况还可以尝试将TRUST_ENCODING_IN_HEADER_OR_META设置为True。</li>
<li>尝试了ALWAYS_CHAR_DETECT和TRUST_ENCODING_IN_HEADER_OR_META都不行的话,软件无能为力了,请增加一个py文件,然后手工指定正确的编码吧。</li>
</ol>
</p>
<span id="forgotpwd"></span>
<h2>忘记密码了怎么办?</h2>
<p class="answer">如果是忘记非管理员账号的密码,则可以通知管理员改密码。如果是管理员密码,则可以登陆appengine.google.com,在左边选择"Datastore Admin",删除KeUser的所有数据,则所有账号的信息都会被删除,或者建议将所有数据库都删除,然后重新使用admin/admin登陆你的应用即可。没有找到"Datastore Admin"?则可以先在"Application Settings"里面打开。
<br />如果你会编程,则你会有其他方法,不用我说。</p>
<span id="mailservice"></span>
<h2>xxx@appid.appspotmail.com邮件地址怎么用?</h2>
<p class="answer">xxx@appid.appspotmail.com是KindleEar附送的邮件服务,在部署好KindleEar后,你自动拥有了无数个EMAIL邮箱地址,格式为:xxx@appid.appspotmail.com,xxx为任意合法字符串,appid为你的应用名。<br />
<ul> <li>此邮箱将收到的邮件正文转换为邮件附件推送至你注册的Email邮箱。如果邮件中只有链接(多个链接则每行一个),则抓取链接的网页内容制作成电子书然后再推送。</li>
<li>要使用此功能,先要添加白名单,如果为'*'则允许所有邮件,否则格式为'xx@xx.xx'或'@xx.xx'。</li>
<li>默认推送至管理员注册的邮箱,如果要推送至其他用户的邮箱,则使用格式:username__xxx@appid.appspotmail.com。(注意是双下划线)</li>
<li>如果将电子书下载链接发送至book@appid.appspotmail.com 或 username__book@appid.appspotmail.com则KindleEar直接下载对应的电子书并转发至注册的邮箱(注意GAE对后缀名有限制,不能发送可能有安全隐患的文件后缀比如exe等,zip文件能发送,但是zip文件内不能包含可能有安全隐患的文件)。<br />
GAE可邮件发送的后缀名列表参见:<a href="https://developers.google.com/appengine/docs/python/mail#Python_Sending_mail_with_attachments">Mail Python API Overview</a><br />
(book/file/download邮件地址保留为下载电子书使用)
</li>
<li>发送至trigger@appid.appspotmail.com 或 username__trigger@appid.appspotmail.com,则触发一次手动投递。邮件标题为空或为all则完全等同于网页上的“现在投递”按钮。如果需要推送特定书籍,则在标题上写书籍名字,多个书籍名字使用逗号分隔。<br />注意:邮件标题上写多个书籍名字则自动合并推送为一本书。</li>
</ul>
</p>
<span id="delaytocn"></span>
<h2>推送至亚马逊中国邮箱有比较大的延迟?</h2>
<p class="answer">这个经过网友们试验,和伟大的墙有关系,有一个解决方法:KindleEar先推送至某个个人邮箱,然后此个人邮箱自动转发至中亚的kindle邮箱。<br />不过还面临一个问题:部分邮箱设置自动转发需要发到邮箱的验证,而亚马逊邮箱不能登陆无法验证。其实你需要的是找一个不需要目标邮箱确认的邮箱来设置自动转发,比如outlook.com。</p>
<span id="errorcodes"></span>
<h2>在gae后台时不时有fetch rss failed(450)等错误是什么问题?</h2>
<p class="answer">括号里面的数字表示错误码,除了标准的HTTP错误码外,以下是KindleEar自定义的错误码。
<ul><li>504:超时,请适当增加config.py文件里面的超时设置;</li>
<li>509:文件超大,GAE限制每个文件不能大于4MB;</li>
<li>452:网站不支持HTTPS访问;</li>
<li>453:网站需要访问认证;</li>
<li>450:下载失败;</li>
<li>451:其他异常;</li></ul></p>
<span id="mergebooks"></span>
<h2>为何合并多本书籍推送后无法查词典?</h2>
<p class="answer"> 如果有外文RSS而且需要在kindle上查字典的话,请将自定义RSS的语言设置为对应的外文。 <br />
同时,还要注意合并书籍推送的其他特性:<br />
<ol>
<li>合并后的书籍使用默认报头和封面;</li>
<li>合并后的书籍使用自定义RSS设定的标题和语言设置;</li>
</ol>
</p>
<span id="share"></span>
<h2>“高级设置”里的归档和分享功能如何使用?</h2>
<p class="answer">启用此功能后,KindleEar会在每篇文件的最后都附加一个超链接,在Kindle上点击此超链接会自动打开浏览器将你正在阅读的此文章归档至网络笔记或分享至社交网络(需要打开网络连接)。<br />
有几点需要注意的:
<ol><li>请先修改config.py里面的DOMAIN为你申请的应用域名;</li>
<li>如果你在红墙内,可能需要打开“我需要翻墙(针对中国用户)”开关,默认的翻墙转发器采用作者在heroku上搭建的免费服务器: http://kforwarder.herokuapp.com,如果你有余力或者注重隐私,建议自己搭建一个,源码托管在 <a href="https://github.com/cdhigh/forwarder">https://github.com/cdhigh/forwarder</a>。(如果将来墙也封锁了heroku,则此翻墙方法无效)</li></ol>
</p>
<span id="needlogin"></span>
<h2>有的网站需要登陆才能阅读文章的问题如何解决?</h2>
<p class="answer">
有些网站需要先注册账户然后登陆后才能阅读和下载文章,对于此类网站,则可以仿照books目录下的预置书籍,增加一个新的py文件,然后设置这几个属性:
<ol>
<li><code>needs_subscription</code> :设置为True</li>
<li><code>login_url</code> :为此网站的登陆网页URL</li>
<li><code>form_4_login</code> :可选(如果你不会看网页HTML源码就暂时不用设置),如果不设置或设置为None则KindleEar尝试自动判断;设置为整数则表示此网页中第几个form为登陆表单(0为第一个);设置为字符串则表示对应登陆表单form的名字,'#'打头表示id,'.'打头表示class,否则则匹配name/id/class任何一个。</li>
<li>登陆KindleEar后,在“我的订阅”页面先订阅对应书籍,然后书籍行右边会新出现一个按钮“登陆信息”, 点击后请在新页面中输入正确的账号和密码。</li>
</ol>
<p>注1:因为GAE环境的限制,需要执行javascript或要输入验证码的网站则无法支持。</p>
<p>注2:对于一些足够特殊和复杂的网站,可能你需要在书籍子类中重写login()函数。</p>
<p>注3:你输入的密码将加密保存,密钥为每个账号都不一样的8位随机字符串,有一定的安全性,而且我尽量照顾你的密码安全,你可以随时删除保存的密码信息,书籍退订后也马上删除密码,但因为密钥也保存在GAE上(在另外的数据表),所以不能保证很高的安全性,请自己明白并愿意承担其中的风险。</p>
</p>
<span id="inie6"></span>
<h2>网站在IE6下显示不正常?</h2>
<p class="answer">在IE6下网站排版混乱并且无法显示导航栏,因为网站的排版采用YAHOO的CSS框架pure,而此框架要求IE7以上的IE,或者chrome/firefox,如果你使用的IE版本过低,建议升级到新版本。</p>
<span id="pushseparate"></span>
<h2>内置书籍订阅时“Separate”选项是什么意思?</h2>
<p class="answer">一旦你选择了“合并推送”,则所有订阅源都会合并成一本书籍推送至kindle,如果你需要有部分订阅源分开单独推送,则在订阅时选择“Separate“。</p>
<span id="internalerror"></span>
<h2>部署应用后打开网页出现“internal server error”如何处理?</h2>
<p class="answer">
有部分网友在部署后打开此应用的“我的订阅”和“投递日志”网页会出现“internal server error”错误,一般情况下因为gae没有及时生成对应数据库的索引导致。<br />你可以打开gae后台,查看logs日志,看是否有“NeedIndexError: no matching index found.”异常,如果有的话,证明是没有生成索引。<br />你也可以在gae后台查看“Datastore Indexes”,看每个条目的“Status”,正常情况下应该都是“Serving”,如果是“Building”或其他值,则说明索引也没有正确生成。<br />
如果你部署步骤完全正确的话,可以稍等几分钟到几十分钟,等gae自动生成索引,如果gae没有成功自动生成索引,你也可以手动更新索引:<br />
<code>python appcfg.py update_indexes KindleEar/</code><br />
在终端窗口执行此命令,注意最后一个KindleEar是你保存的此应用的目录名。<br />
执行了此命令后稍等还是不行的话,请按照正确步骤重新部署。
</p>
<div id="footer">
<div class="clear"></div>
2013 © KindleEar |
<a href="/static/faq.html" target="_blank" style="text-decoration:none;">FAQ</a>
|
<a href="https://github.com/cdhigh/kindleear" target="_blank" style="text-decoration:none;">Github page</a>
|
<a href="http://appengine.google.com" target="_blank" style="text-decoration:none;">App Engine</a>
<pre><p></p></pre>
</div>
</body>
</html>