KindleEar 搭建教程:推送 RSS 订阅到 Kindle
* 特别提示:自 2019 年 11 月 30 日起,必须向 Google Cloud 的结算账户添加支持美元支付的信用卡(如 Visa、MastCard 等)才能正常使用 GAE,绑卡后只要不超资源限额仍可持续免费使用。
KindleEar 是一款开源的 Python 程序,由网友 cdhigh 发起,托管在 Github。它可运行在免费的 Google APP Engine(GAE)上,把 RSS 生成排版精美的杂志模式的 MOBI 文件,并按照设置定时自动推送至你的 Kindle。如果你有 Python 和前端基础,还可以自定义排版,生成你需要的最完美的 MOBI 文件。
▲ KindleEar 搭建成功后的首页界面
▲ KindleEar 推送到 Kindle 的阅读效果
KindleEar 目前的功能有:
- 支持类似 Calibre 的 recipe 格式的不限量 RSS/ATOM 或网页内容收集
- 不限量自定义 RSS,直接输入 RSS/ATOM 链接和标题即可自动推送
- 多账号管理,支持多用户和多 Kindle
- 生成带图的杂志格式 mobi 或带图的有目录 epub
- 自动每天定时推送
- 强大而且方便的邮件中转服务
- 和 Evernote/Pocket/Instapaper 等系统的集成
看到这些让人心动、那些收费的推送服务网站才有的功能是不是很心动了?其实搭建起来其实很简单,如果你什么都不懂,只要按照本文所给出的步骤一步一步操作就可以搞定。本文是更新后的教程,原方法需要配置上传环境,较为繁琐,现在只需要保证能科学上网,通过 Google 云端 Shell,只需要一行命令就可以搞定。现在,立即开始搭建自己的私有专属的 RSS 推送服务器吧!
目录
一、准备工作
1、能够科(fan)学(qiang)上网
2、注册 Google/Gmail 账号
3、对 Google 账号进行安全设置
4、创建一个 Google Cloud 项目
5、为结算账户添加支付方式
6、创建 Google App Engine 应用
7、授权 GAE 用 Gmail 发信
二、上传应用
方法一:自动上传(强烈推荐!)
方法二:手动上传
三、访问应用
四、设置推送
1、添加订阅
2、设置推送
3、投递日志
4、账户管理
5、高级设置
6、网友分享
五、常见问题
1、访问页面提示 internal serve error
2、投递状态显示 wrong SRC_EMAIL
3、如何修改 KindleEar 登录密码
4、访问页面提示 500 Server Error
5、点手动推送显示 internal server error
六、其它事项
七、自制订阅
本教程适用于 Windows 系统和 Mac OS X 系统,所以请注意下载适合你操作系统的软件,以及选择适合你操作系统的步骤。本文步骤没有多余的废话,请严格按照下面的步骤进行操作。遇到意外情况请留言提问,如果提出的问题文中已有说明将不再重复回答。
一、准备工作
KindleEar 依赖 Google APP Engine,所以你需要有一枚 Google 账号(注册完记得安步骤说明设置一下安全选项),然后创建一个 GAE 应用。以下步骤中,如果某个条件已具备,请忽略相应步骤继续。
1、能够科(fan)学(qiang)上网
对于中国大陆用户来说,由于无法正常访问 Google 的相关服务,需要借助科学上网软件实现访问。你可以使用你习惯使用的科学上网软件,也可以选择下面为你推荐的任意一款科学上网软件。
* 提示:Lantern 免费版限制流量,如果想要购买专业版,使用邀请码 HBNVPW 可获得 1 或 3 个月额外时长。
2、注册 Google/Gmail 账号
点击下面的链接,注册一枚带 @gmail.com 后缀的 Google 账号。
Google 账号注册页面:https://accounts.google.com/SignUp
3、对 Google 账号进行安全设置
Google 账号在默认可能会拒绝将 KindleEar 上传到 GAE,所以需要设置一下。点击下面的链接进入你的 Google 账号“登录与安全”设置页面,找到“允许不够安全的应用”这一项,点击右边的滑动按钮,将其状态切换为“已启用”。注意,为了账号安全,上传完之后建议将此设置恢复为停用状态。
Google 账号设置页面:https://myaccount.google.com/security#connectedapps
4、创建一个 Google Cloud 项目
KindleEar 只能运行在 Google Cloud 的 Google App Engine(GAE)上,因此你需要先创建一个 Google Cloud 项目,然后再创建一个 GAE 应用。点击下面的链接并用你的 Google 账号登录。
创建 Google Cloud 项目页面:https://console.cloud.google.com
点击页面左上角的“选择项目”,点击弹出对话框右上角的“新建项目”,然后在“新建项目”页面中输入你喜欢的“项目名称”。项目名称可随意填写,只要是你喜欢并且符合它限定的规则即可。
需要着重注意的是项目名称下方的“项目 ID”,这个 ID 也就是我们后面提到的项目 ID。默认情况下,系统会根据你输入的项目名称自动生成项目 ID,但是自动生成字符没有意义,为了方便记忆最好是自定义。点击项目 ID 后面的【修改】按钮,将其修改成你喜欢的字符串组合。这样等 KindleEar 部署成功后,你就可以通过 http://项目ID.appspot.com 访问了(注意把项目 ID 换成你真实的项目 ID)。
由于 KindleEar 需要用到 Cloud Tasks API 和 Cloud Scheduler API 这两个服务,请确保它们已开启。
5、为结算账户添加支付方式
通过菜单导航或以下链接(把 YOUR-PROJECT—ID 替换为你自己的项目 ID)进入“结算(Billing)”页面,点击左侧的“付款方式(Payment method)”添加一张支持美元支付的信用卡。
https://console.cloud.google.com/billing/linkedaccount?YOUR-PROJECT-ID
* 提示:自 2019 年 11 月 30 日起,Google App Engine 将使用 Google Cloud Build 构建 ,而使用 Google Cloud Build 必需关联有效支付账户。也就是说从这天起必需绑定信用卡后才能正常使用 Google App Engine 了。Google Cloud Build 提供了免费套餐,只要构建时间不超过 120 分钟就不会收费,Google App Engine 仍可在不超出免费配额的前提下免费使用。需要特别注意的是,和之前免费额度用完就自动关闭应用不同的是,新政策会在免费额度用完后会自动收取超出免费额度的费用。
6、创建 Google App Engine 应用
创建完 Google Cloud 项目之后,还需要手动创建一个 Google App Engine 应用。方法有两种:一种是使用云端 Shell 创建;另一种是在 Console 页面上进行。可根据自己的喜好选用。
方法一:直接在云端 Shell 中使用命令创建。具体步骤为:点击页面右上角的 [ >_ ] 图标按钮(如下图所示),调出云端 Shell,输入以下命令按回车:
gcloud app create
命令执行后会出现 Which region would you like to choose?
字样,询问选择应用的位置,在 Please enter your numeric choice:
之后输入数字 1(或其它项),稍等片刻即可完成 GAE 应用的创建。
方法二:点击 Google Cloud 页面左上角的菜单按钮,点击弹出菜单中的“App Engine”。在“您的第一个应用”那里点击“选择一种语言”,选择“Python”。接下来“选择位置”中页面中选择“asia-east2”(或者其它你想要使用的区域,注意此选择是永久性的,一旦选择今后将不可更改),然后点击下一步。
如果你没有预先为结算账户添加支付方式,可能会弹出为当前项目启用结算账号的对话框,点击【创建结算账号】按钮会引导你进入创建结算账号的页面。如果你想要正常部署 GAE 项目,必须根据提示创建结算账号并添加可用美元支付的信用卡。至此便准备好了用来部署 KindleEar 的基础环境。
7、授权 GAE 用 Gmail 发信
默认情况下 GAE 没有使用 Gmail 发信的权限,所以你需要在 GAE 的设置中将 Gmail 的发信权限授权给 GAE 应用,否则, KindleEar 无法推送成功,日志中会出现错误提示 wrong SRC_EMAIL。
授权步骤很简单,首先在 GAE 中点击菜单中的【设置】进入设置页面,然后切换到【电子邮件发件人】,在“Mail API 已获授权的发件人”添加你的 Gmail 邮箱地址。具体步骤参考以下示意动画:
以上一切准备完毕,就可以进入第二部分的步骤,将 KindleEar 程序上传部署到 GAE。
二、上传应用
下面提供了两种将 KindleEar 应用上传到 GAE 的方法。一种是通过 Google 云端 Shell 的方式进行上传,使用书伴提供的 Shell 脚本一条命令就能搞定,完全自动化,强烈推荐使用。另一种是手动配置上网环境、手动输入命令进行上传,步骤较多也较为繁琐。请根据自己的实际情况择优选用。
方法一:自动上传(强烈推荐!)
1、进入 Google 云端控制台:https://console.cloud.google.com/home/dashboard
2、点击右上角的 Shell 图标(如下图所示)激活 Google 云端 Shell。
3、复制下面的代码,粘贴到 Google 云端 Shell(如下图所示),回车执行。
rm -f uploader.sh* && \
wget https://raw.githubusercontent.com/bookfere/KindleEar-Uploader/master/uploader.sh && \
chmod +x uploader.sh && \
./uploader.sh
代码粘贴到云端 Shell 后的效果如下图所示:
* 提示:脚本默认拉取 KindleEar 官方源代码,如果想要指定其它 KindleEar 项目分支(比如想要部署自己修改后并上传到 Github 上的 KindleEar 源代码)可在 uploader.sh 后加一个空格,然后跟上 Github 项目的 Git 地址即可。
4、根据脚本的引导,输入你的“Gmail 邮箱”和“项目 ID”等信息,等待上传成功即可。需要特别注意的是,一定要再三确认你输入的 Gmail 邮箱是正确的,拼写是无误的,否则无法推送成功。
上面的代码只需要执行一次即可,如果想要重新上传或要更新代码,直接运行 uploader.sh 即可:
./uploader.sh
* 提示:此 KindleEar 安装脚本托管在 GitHub:https://github.com/bookfere/KindleEar-Uploader
方法二:手动上传
在开始手动部署 KindleEar 步骤之前,请确保已完成本文第一部分提及的准备工作。
三、访问应用
部署成功后,就可以打开网页浏览器,输入 http://项目ID.appspot.com 来访问你搭建的 KindleEar 应用。注意!URL 中的“项目ID”务必更换成你自己的真实项目 ID,否则是无法正常访问的。
KindleEar 初始登录名和密码都是“admin”,建议登录后立即改成新密码。登录 KindleEar 后你会发现以下几个导航,你可以在这里增减 RSS 、查看推送记录或根据自己的需要进行一些个性化的设置。
对于刚部署完的 KindleEar 应用,在访问“我的订阅”页面的时候,可能会遇到“internal server error”的错误,这是由于 GAE 需要时间索引应用的相关数据,你需要耐心等待一段时间。如果长时间(如超过半个小时)仍然无法正常访问,请参考本文的“五、常见问题”中的第 1 条提供的解决方案。
* 提示:由于 appspot.com 需要科学上网才能访问,如果嫌每次都这样访问麻烦,可以按照文章《给 KindleEar 绑定可直接访问它的免费顶级域名》介绍的方法,为其绑定一个免费的顶级域名。当然你可以可以为其绑定现成的顶级域名。
四、设置推送
以下是 KindleEar 的常用功能的简要介绍,当然你也可以自行体验摸索各种功能。
1、添加订阅
登录应用后,可以点击导航上的“我的订阅”进入订阅页面,在这里在这里可以添加自定义的 RSS 地址。也可以在下方预置的一些订阅里选择自己感兴趣的。
在添加自定义 RSS 地址的时候请注意。KindleEar 仅支持 RSS/ATOM 格式的订阅(XML 格式),如果遇到添加的自定义 RSS 无法成功推送,请留意是否是格式错误导致的。
比如有些 FeedBurner 烧制的 RSS 默认是 HTML 格式(可以通过查看源代码辨别),直接添加这种 RSS 地址不能成功推送,需要在添加的 RSS 地址后面添加一个参数 ?format=xml
或 ?fmt=xml
才行。
2、设置推送
添加完订阅后,还需要设置一下推送。点击导航上的“设置”进入 KindleEar 的设置页面。在这里填写接收推送的“Kindle 邮箱”,选择投递日,所选投递日的投递时间,建议勾选“多本书籍合并投递为一本”、“使能自动定时投递”、“自动定时投递自定义 RSS”。同时还可以在“书籍标题”项填写显示在 Kindle 里的个性名称。当所有设置完后还可以点击“现在投递”测试一下。
3、投递日志
每次投递的记录。
4、账户管理
可以添加多用户,更改密码等。
5、高级设置
有手动推送订阅功能即“现在投递”,有邮件白名单、归档和分享、URL 过滤、封面图片设置。
6、网友分享
你可在此页面一键订阅他人分享的 RSS。当然你可以在“我的订阅”把自己 RSS 分享给他人。
OK,全部步骤结束。在你的 Kindle 处于联网状态时,这个你亲手建立的推送服务器,就会按照你设置的时间定时把精美的电子杂志推送到你的 Kindle 上了!Enjoy it!
五、常见问题
很多小伙伴在安装和使用 KindleEar 的过程中会遇到一些问题,这些问题很常见也很好解决,所以书伴将这些问题整理归纳如下。如果你遇到了新的问题也可以留言提出。
1、访问页面提示 internal serve error
如果是刚上传完 KindleEar,由于 GAE 需要一些时间索引数据,在此期间访问某些页面会出现“internal serve error”的错误提示,最长等待十来分钟即可正常访问。
如果等待很长时间仍然出现“internal serve error”,请尝试这样操作:点击 Google Cloud 左上角的菜单按钮,点击弹出菜单中的“数据存储”,再点击数据存储页面左侧导航中的“索引”进入索引页面。
查看一下 Book、DeliverLog、Feed 三项的状态,如果是绿色对勾则正常,否则就需要重新索引一下。具体操作为,进入 KindleEar 目录,运行下面这条命令更新一下索引:
gcloud app deploy index.yaml --version=1 --quiet
待索引状态全部变成“使用中”后,也就是每一项都变成绿色对勾,即可正常访问。
2、投递状态显示 wrong SRC_EMAIL
默认状态下 GAE 不允许发信,所以才会出现 wrong SRC_EMAIL 的提示,你需要设置一下把 Gmail 邮箱地址添加到“Mail API 已获授权的发件人”,这需要在 GAE 应用的设置中进行。
▲ 向 GAE 设置中添加 Gmail 邮箱示意动画
首先访问下面这个网址进入 GAE 应用设置(将其中的项目 ID 换成你真实的项目 ID):
https://console.cloud.google.com/appengine/settings/emailsenders?project=项目ID
* 也可以点击左上角的菜单,在弹出的菜单中点击“App Engine”,然后再点击 APP 引擎页面左侧的“设置”。
切换到“电子邮件发件人”,看一下“Mail API 已获授权发件人(Mail API authorized senders)”账号里面有无添加发送邮箱地址,如果没有就点击上方的“添加”按钮或“添加已获授权的电子邮件发件人”按钮添加一下邮箱地址,注意添加完后要按回车确认一下,最后点击“添加”,此问题即可解决。
如果确认添加了正确邮箱,却仍然出现 wrong SRC_EMAIL 错误,就需要检查一下 KindleEar 配置文件 config.py 中的 SRC_EMAIL
参数,确保填写的是【拼写正确】的 Gmail 邮箱。
▲ 仔细检查源代码 config.py 中的 SRC_EMAIL
参数
3、忘记 KindleEar 的登录密码怎么办
忘记密码可以进入 GAE 重置密码,具体方法为:访问 https://console.cloud.google.com,点击左上角的菜单,点击菜单中的“数据存储”,然后在“按种类查询”的标签项下方的“种类”中,选择“KeUser”,最后点击用户记录“名称/ID”,编辑其中的 passwd,改成 e10adc3949ba59abbe56e057f20f883e,最后点击【保存】按钮保存一下,这样就把密码临时改成了123456,登录账号修改成新密码即可。
4、访问页面提示 500 Server Error
如果你部署的 KindleEar 之前运行正常,但是突然出现内容如下的 500 Server Error 页面:
Error: Server Error
The server encountered an error and could not complete your request.
Please try again in 30 seconds.
遇到此情况请检查你的 Google App Engine 所在的 Google Cloud 项目是否关联了有效支付账户。因为 KindleEar 所使用的 Google App Engine 依赖 Google Cloud Build 服务,而要使用此服务必需关联有效支付账户(即必需绑定信用卡后才能正常使用)。Google Cloud Build 提供了免费套餐,只要构建时间不超过 120 分钟就不会收费,Google App Engine 可在不超出免费配额的前提下免费使用。注意,免费额度用完不会自动关闭应用,而是自动收取超出免费额度的费用。
5、点手动推送显示 internal server error
由于 KindleEar 需要用到 Cloud Tasks API 和 Cloud Scheduler API 这两个服务,请确保它们已开启。
六、其它事项
上文已将 KindleEar 的部署步骤和使用方法详细列出,一般情况下你只需要按照步骤一步步操作就能部署成功。如果遇到问题,请访问 KindleEar 项目提供的常见问答(FAQ)。那里可以解决你在安装 KindleEar 时遇到的绝大部分问题。如果 FAQ 没有解决你的问题,可以自行搜索看是否有可行办法。
实在解决不了可以点击这里向开发者提交一个“New issue”请求解答,也可以在本页留言请求帮助。
另外,如果你觉得 KindleEar 这款软件还不错且有软件开发能力,欢迎贡献代码。
七、自制订阅
如果你想推送的内容不提供 RSS 供稿,并且 KindleEar 内置的订阅也不能满足你的需求,建议尝试通过下面这三篇文章提供的方法自制 KindleEar 抓取脚本,教程面向没有编程基础的小伙伴。
1、如何用 KindleEar 推送无 RSS 的网站内容(上篇)
本文是如何用 KindleEar 推送无 RSS 的网站内容的上篇。对 KindleEar 抓取网站内容的两种方式以及 KindleEar 的抓取脚本做了必要说明,并提供了 KindleEar 调试环境的搭建步骤。
2、如何用 KindleEar 推送无 RSS 的网站内容(中篇)
本文是如何用 KindleEar 推送无 RSS 的网站内容的中篇。详细介绍了 KindleEar 订阅脚本的工作原理,对订阅脚本的编写过程做了详细分解说明,最终实现从网站抓取文章并转换成电子书。
3、如何用 KindleEar 推送无 RSS 的网站内容(下篇)
本文是如何用 KindleEar 推送无 RSS 的网站内容的下篇。完善了上篇编写订阅脚本,使其可处理文章列表和内容的翻页,以及抓取符合设定条件的文章条目,最后介绍了上传 KindleEar 的两种方式。
© 「书伴」原创文章,转载请注明出处及原文链接:https://bookfere.com/post/19.html
“Kindle推送”相关阅读
- 为什么推送到 Kindle 的 KF8 标准 MOBI 电子书不显示封面
- EpubPress:把打开的多个网页转成一本电子书
- 利用 IFTTT 自动推送上传到 Dropbox 的电子书
- Readability:定时或立即把长文推送到 Kindle
- 如何用 KindleEar 推送无 RSS 的网站内容(中篇)
- Calibre 使用教程之通过邮箱一键推送 Kindle 电子书
- Kindle 推送教程:教你用电子邮箱推送电子书
- 解决 Calibre 推送“500 Error: bad syntax”错误
- 如何单个或批量删除 Kindle 云端的电子书
- 通过 Send to Kindle 发送的文档已支持 KFX 增强排版功能
- BookDrop:用 Dropbox 自动同步电子书到 Kindle
- 如何用 KindleEar 推送无 RSS 的网站内容(上篇)
- Kindle 退出中国后如何继续购买电子书及使用推送服务
- 如何利用 Sigil 和 EpubCheck 插件检查和修复 EPUB 文件
- Kindle 怎么导入电子书(图解多种电子书导入方式)
测试账号和密码是错的,是改密码了吗?是否方便给个试下。
小波 您好。测试账号被人删除了,已新建。
谢谢回复,已经搞定自己的了。
如果投递日志状态显示为 wrong SRC_EMAIL,请进入 GAE 后台。在“資訊主頁 (Dashboard)”标签页中找到“App Engine”卡片,点击卡片底部的“前往 App Engine 資訊主頁 (Go to the App Engine dashboard)”,然后点击左侧的的“設定 (settings)”,看看“Email API 已獲授權的寄件者 (Email API authorized senders)”账号里面有没有添加发送邮箱地址,如果没有就点击上方的“編輯 (Edit)”添加一下,即可解决此问题。
GAE后台界面已经更新,按这路径找不到设置了,可以直接从以下链接到达:https://console.developers.google.com/appengine/settings 应用设置点修改,然后添加Gmail邮箱地址。
配置完点击我的订阅和投递日志会显示internal server error。其余页面正常,看到小贴士说要更新下索引请问下具体代码是怎样子的
AEC 您好。按照小贴士的提示操作即可:在 KindleEar 目录下执行:appcfg.py update_indexes 更新一下索引。
C:\KindleEar>appcfg.py update_indexes
‘appcfg.py’ 不是内部或外部命令,也不是可运行的程序
或批处理文件。
已找到正确代码
C:\KindleEar>cd C:\Program Files (x86)\Google\google_appengine
C:\Program Files (x86)\Google\google_appengine>C:\python27\python.exe appcfg.py update_indexes C:\kindleear
08:53 PM Host: appengine.google.com
08:53 PM Uploading index definitions.
出现如下情况 如何解决
C:\Program Files (x86)\Google\google_appengine>C:\python27\python.exe appcfg.py update C:\kindleear\app.yaml C:\kindleear\module-worker.yaml
09:50 AM Host: appengine.google.com
09:50 AM Application: kindle-lxxh; version: 1
09:50 AM Starting update of app: kindle-lxxh, version: 1
09:50 AM Getting current resource limits.
Traceback (most recent call last):
File “appcfg.py”, line 136, in
run_file(__file__, globals())
File “appcfg.py”, line 132, in run_file
execfile(_PATHS.script_file(script_name), globals_)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 5495, in
main(sys.argv)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 5486, in main
result = AppCfgApp(argv).Run()
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 2964, in Run
self.action(self)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 5142, in __call__
return method()
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 3844, in Update
self.UpdateUsingSpecificFiles()
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 3836, in UpdateUsingSpecificFiles
self.UpdateVersion(rpcserver, self.basepath, module_yaml, file_name)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 3812, in UpdateVersion
return appversion.DoUpload(paths, openfunc)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 2399, in DoUpload
self.error_fh)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 497, in GetResourceLimits
resource_limits.update(_GetRemoteResourceLimits(logging_context))
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 467, in _GetRemoteResourceLimits
yaml_data = logging_context.Send(‘/api/appversion/getresourcelimits’)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 1709, in Send
result = self.rpcserver.Send(url, payload=payload, **kwargs)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appengine_rpc_httplib2.py”, line 246, in Send
url, method=method, body=payload, headers=headers)
File “C:\Program Files (x86)\Google\google_appengine\lib\oauth2client\oauth2client\client.py”, line 579, in new_request
self._refresh(request_orig)
File “C:\Program Files (x86)\Google\google_appengine\lib\oauth2client\oauth2client\client.py”, line 787, in _refresh
self._do_refresh_request(http_request)
File “C:\Program Files (x86)\Google\google_appengine\lib\oauth2client\oauth2client\client.py”, line 806, in _do_refresh_request
self.token_uri, method=’POST’, body=body, headers=headers)
File “C:\Program Files (x86)\Google\google_appengine\lib\httplib2\httplib2\__init__.py”, line 1584, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File “C:\Program Files (x86)\Google\google_appengine\lib\httplib2\httplib2\__init__.py”, line 1332, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File “C:\Program Files (x86)\Google\google_appengine\lib\httplib2\httplib2\__init__.py”, line 1268, in _conn_request
conn.connect()
File “C:\Program Files (x86)\Google\google_appengine\lib\httplib2\httplib2\__init__.py”, line 1011, in connect
sock.connect((self.host, self.port))
File “C:\Program Files (x86)\Google\google_appengine\socks.py”, line 362, in connect
raise GeneralProxyError((5,_generalerrors[5]))
socks.GeneralProxyError: (5, ‘bad input’)
cc 您好。代理能正常使用吗?从错误提示来看应该是代理问题。
而且您看,我安装socksipy的时候,也安装不了“chenchaodeMacBook-Pro:~ chenchao$ sudo pip install PySocks
Password:
sudo: pip: command not found
chenchaodeMacBook-Pro:~ chenchao$”。然后就是手动下载的socksipy的压缩包,然后解压了(ps:解压路径就只是解压在常用的目录,教程也没说要什么特定目录)。
您的系统没有安装 pip,安装 PySocks 前需要先安装 pip。具体方法为先下载 get-pip.py,然后运行
python get-pip.py
安装 pip。您完全可以通过搜索解决这些问题。比如遇到错误“pip: command not found
”,就搜索这一错误提示,可以找到很多解决此问题的方法。按照您提示的方向我自行百度,终于把pip给安装好了。然后在上传过程中出现“2016-07-25 14:26:09,486 ERROR appcfg.py:2409 An error occurred processing file ”: [Errno 13] Permission denied: ‘/Users/apple/.appcfg_oauth2_tokens’. Aborting.”这个错误(ps:其他代码我就没粘贴过来了),看来问题似乎还是处在appcfg.py身上。同时对于mac分别输入命令上传意思是先输入“appcfg.pyupdate~/Applications/kindleear/app.yaml~/Applications/kindleear/module-worker.yaml”按下enter,等所有命令运行完后,再输入“appcfg.py update ~/Applications/kindleear”上传命令,分别输入是指这个意思吗?
1、仔细按照文内步骤操作会出现这么多错误吗?单看一个错误提示没有上下文很那判断问题所在,如果有可能的话请列出输入的命令,以及执行后出现带有上下文的错误信息。
2、两个步骤是先后操作的。执行完毕一个命令再执行另一个。
您看看,就是这个情况。找了文件路径也不对,估计是命令前面没有设置文件路径。chenchaodeMacBook-Pro:~ chenchao$ sudo/appcfg.py update ~/Applications/kindleear/app.yaml ~/Applications/kindleear/module-worker.yaml
-bash: sudo/appcfg.py: No such file or directory
chenchaodeMacBook-Pro:~ chenchao$ appcfg.py update ~/Applications/kindleear
-bash: appcfg.py: command not found
chenchaodeMacBook-Pro:~ chenchao$
麻烦您看一下,谢谢。
陈超 您好。第一条命令提示的是输入错误。第二条命令是找不到 appcfg.py 命令,请问确认安装 GAE SDK 了吗?
安装了,我的应用里显示为“GoogleAppEngineLauncher”这个名字的应用。会不会是这个“KindleEar 压缩包”解压的位置错误,我把它放在了user/apple/application里面去了。您给我看看这下怎么办?麻烦您了
KindleEar 解压到什么地方不重要(当然还是建议按照文章内所说的做),只要输入的路径正确就可以了,问题的关键是 appcfg.py 命令找不到。请先打开 GoogleAppEngineLaungcher 这个软件,然后点击左上角菜单“GoogleAppEngineLaungcher”,然后再点击弹出菜单中的“Make Symlinks…”,最后点击“OK”,这样应该就可以直接使用 appcfg.py 的命令了。
我按照您说的做,然后是这样:chenchaodeMacBook-Pro:~ chenchao$ appcfg.py update ~/Applications/kindleear/app.yaml ~/Applications/kindleear/module-worker.yaml
Traceback (most recent call last):
File “/usr/local/bin/appcfg.py”, line 18, in
import socks
ImportError: No module named socks
chenchaodeMacBook-Pro:~ chenchao$ appcfg.py update ~/Applications/kindleear
Traceback (most recent call last):
File “/usr/local/bin/appcfg.py”, line 18, in
import socks
ImportError: No module named socks
我回去看了步骤,不知道错误出在哪里了
WIN10系统,折腾过程也出现过这个提示,然后把以下要添加的代码移到这一行的上面解决了,不知道可不可以帮到你。(我原来是把代码放在这一行的下面)
“””Convenience wrapper for starting an appengine tool.”””
在它上面添加下列代码:
import socks
import socket
socket.socket = socks.socksocket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, “127.0.0.1”, 8788)
您说的这个我已经正确做了,而且我的电脑是苹果mbp,跟您的系统不一样,不过还是谢谢您的解答。目前问题还没有解决,因为一层一层的扒皮后,一个问题接着一个问题
我的已经搞定了。
是代理问题,原先用ShadowSocks软件来翻墙,后来一直出现这问题,就试着设置VPN翻墙,结果解决了,你也可以试一下。
google indexes 都上传了 可以选书选自定义rss什么的了 但是为什么现在投递还是internal server error
peter xia 您好。
是点击“现在投递”出现这个错误吗?抱歉,已看到留言,您的问题已解决。你好 我internal serve error 情况已经持续两天了 怎么解决?
已解决
配置完一直都是internal server error
攻城狮楼下小黑 您好。此问题的解决方法请参考本文的“小贴士”第三条。
C:\KindleEar>appcfg.py update_indexes
Usage: appcfg.py [options] update_indexes
appcfg.py: error: Expected a argument after ‘update_indexes’.
这个结果怎么解
缺少参数。请仔细看文中内容,后面是需要带 KindleEar 目录的。
C:\KindleEar>python appcfg.py update_indexes KindleEar/
python: can’t open file ‘appcfg.py’: [Errno 2] No such file or directory
还是不行
按楼主部步骤来,可以说成功了,能够进如kindleear网页设置,推送显示状态ok,可是推送到kindle邮箱太慢了,大约一到两个小时才能推送到,本地网速还是可以的,10M的网速,试过推送几次,有时候还不能推送到,请问这正常吗,有办法解决吗?
bogon:~ mac$ appcfg.py update ~/Applications/kindleear/app.yaml ~/Applications/kindleear/module-worker.yaml
-bash: appcfg.py: command not found
bogon:~ mac$
到这步骤执行不下去了,什么原因呢?谢谢!
先运行一下 Google App Engine 应用,再执行命令。
你好,我执行第一条语句C:\python27\python.exe appcfg.py update D:\kindleear\app.yaml D:\kindleear\module-worker.yaml成功了
但是执行第二条语句时出现这个:
C:\Program Files\Google\google_appengine>C:\python27\python.exe appcfg.py update
D:\kindleear
02:35 PM Application: zhang-kanshuai; version: 1
02:35 PM Host: appengine.google.com
****************************************************************
There is a new release of the SDK available.
———–
Latest SDK:
api_versions: [‘1’]
release: 1.9.38
supported_api_versions:
go:
api_versions: [go1]
java7:
api_versions: [‘1.0’]
python:
api_versions: [‘1’]
python27:
api_versions: [‘1’]
timestamp: 1462211654
———–
Your SDK:
api_versions: [‘1’]
release: 1.9.36
supported_api_versions:
go:
api_versions: [go1]
java7:
api_versions: [‘1.0’]
python:
api_versions: [‘1’]
python27:
api_versions: [‘1’]
timestamp: 1458250107
———–
Please visit https://developers.google.com/appengine/downloads
for the latest SDK
****************************************************************
02:35 PM Starting update of app: zhang-kanshuai, version: 1
02:35 PM Getting current resource limits.
02:35 PM Scanning files on local disk.
02:35 PM Cloning 15 static files.
02:35 PM Cloning 387 application files.
2016-07-06 14:35:41,265 ERROR appcfg.py:2569 An unexpected error occurred. Abort
ing.
Traceback (most recent call last):
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 2406, in DoUpload
missing_files = self.Begin()
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 1999, in Begin
CloneFiles(‘/api/appversion/clonefiles’, files_to_clone, ‘application’)
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 1987, in CloneFiles
payload=BuildClonePostBody(chunk))
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 1702, in Send
result = self.rpcserver.Send(url, payload=payload, **kwargs)
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appengin
e_rpc_httplib2.py”, line 247, in Send
url, method=method, body=payload, headers=headers)
File “C:\Program Files\Google\google_appengine\lib\oauth2client\oauth2client\c
lient.py”, line 569, in new_request
redirections, connection_type)
File “C:\Program Files\Google\google_appengine\lib\httplib2\httplib2\__init__.
py”, line 1584, in request
(response, content) = self._request(conn, authority, uri, request_uri, metho
d, body, headers, redirections, cachekey)
File “C:\Program Files\Google\google_appengine\lib\httplib2\httplib2\__init__.
py”, line 1332, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, he
aders)
File “C:\Program Files\Google\google_appengine\lib\httplib2\httplib2\__init__.
py”, line 1268, in _conn_request
conn.connect()
File “C:\Program Files\Google\google_appengine\lib\httplib2\httplib2\__init__.
py”, line 1014, in connect
self.disable_ssl_certificate_validation, self.ca_certs)
File “C:\Program Files\Google\google_appengine\lib\httplib2\httplib2\__init__.
py”, line 80, in _ssl_wrap_socket
cert_reqs=cert_reqs, ca_certs=ca_certs)
File “C:\python27\lib\ssl.py”, line 911, in wrap_socket
ciphers=ciphers)
File “C:\python27\lib\ssl.py”, line 579, in __init__
self.do_handshake()
File “C:\python27\lib\ssl.py”, line 808, in do_handshake
self._sslobj.do_handshake()
SSLEOFError: EOF occurred in violation of protocol (_ssl.c:590)
02:35 PM Rolling back the update.
Traceback (most recent call last):
File “appcfg.py”, line 136, in
run_file(__file__, globals())
File “appcfg.py”, line 132, in run_file
execfile(_PATHS.script_file(script_name), globals_)
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 5403, in
main(sys.argv)
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 5394, in main
result = AppCfgApp(argv).Run()
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 2957, in Run
self.action(self)
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 5050, in __call__
return method()
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 3789, in Update
self._UpdateWithParsedAppYaml(appyaml, self.basepath)
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 3842, in _UpdateWithParsedAppYaml
self.UpdateVersion(rpcserver, basepath, appyaml, APP_YAML_FILENAME)
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 3727, in UpdateVersion
return appversion.DoUpload(paths, openfunc)
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 2406, in DoUpload
missing_files = self.Begin()
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 1999, in Begin
CloneFiles(‘/api/appversion/clonefiles’, files_to_clone, ‘application’)
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 1987, in CloneFiles
payload=BuildClonePostBody(chunk))
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appcfg.p
y”, line 1702, in Send
result = self.rpcserver.Send(url, payload=payload, **kwargs)
File “C:\Program Files\Google\google_appengine\google\appengine\tools\appengin
e_rpc_httplib2.py”, line 247, in Send
url, method=method, body=payload, headers=headers)
File “C:\Program Files\Google\google_appengine\lib\oauth2client\oauth2client\c
lient.py”, line 569, in new_request
redirections, connection_type)
File “C:\Program Files\Google\google_appengine\lib\httplib2\httplib2\__init__.
py”, line 1584, in request
(response, content) = self._request(conn, authority, uri, request_uri, metho
d, body, headers, redirections, cachekey)
File “C:\Program Files\Google\google_appengine\lib\httplib2\httplib2\__init__.
py”, line 1332, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, he
aders)
File “C:\Program Files\Google\google_appengine\lib\httplib2\httplib2\__init__.
py”, line 1268, in _conn_request
conn.connect()
File “C:\Program Files\Google\google_appengine\lib\httplib2\httplib2\__init__.
py”, line 1014, in connect
self.disable_ssl_certificate_validation, self.ca_certs)
File “C:\Program Files\Google\google_appengine\lib\httplib2\httplib2\__init__.
py”, line 80, in _ssl_wrap_socket
cert_reqs=cert_reqs, ca_certs=ca_certs)
File “C:\python27\lib\ssl.py”, line 911, in wrap_socket
ciphers=ciphers)
File “C:\python27\lib\ssl.py”, line 579, in __init__
self.do_handshake()
File “C:\python27\lib\ssl.py”, line 808, in do_handshake
self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:590)
C:\Program Files\Google\google_appengine>
请问是什么问题,谢谢
去下载并安装1.9.38的Google App Engine 应用,再试一下。
我在第三步添加代码后保存出现unable to save的错误,请问一下这个要怎么解决?谢谢。
C:\Program Files (x86)\Google\google_appengine>C:\python27\python.exe appcfg.py update C:\kindleear\app.yaml C:\kindleear\module-worker.yaml
01:20 PM Host: appengine.google.com
01:20 PM Application: catstreetnews; version: 1
01:20 PM Starting update of app: catstreetnews, version: 1
01:20 PM Getting current resource limits.
Traceback (most recent call last):
File “appcfg.py”, line 136, in
run_file(__file__, globals())
File “appcfg.py”, line 132, in run_file
execfile(_PATHS.script_file(script_name), globals_)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 5495, in
main(sys.argv)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 5486, in main
result = AppCfgApp(argv).Run()
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 2964, in Run
self.action(self)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 5142, in __call__
return method()
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 3844, in Update
self.UpdateUsingSpecificFiles()
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 3836, in UpdateUsingSpecificFiles
self.UpdateVersion(rpcserver, self.basepath, module_yaml, file_name)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 3812, in UpdateVersion
return appversion.DoUpload(paths, openfunc)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 2399, in DoUpload
self.error_fh)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 497, in GetResourceLimits
resource_limits.update(_GetRemoteResourceLimits(logging_context))
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 467, in _GetRemoteResourceLimits
yaml_data = logging_context.Send(‘/api/appversion/getresourcelimits’)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appcfg.py”, line 1709, in Send
result = self.rpcserver.Send(url, payload=payload, **kwargs)
File “C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\appengine_rpc_httplib2.py”, line 246, in Send
url, method=method, body=payload, headers=headers)
File “C:\Program Files (x86)\Google\google_appengine\lib\oauth2client\oauth2client\client.py”, line 579, in new_request
self._refresh(request_orig)
File “C:\Program Files (x86)\Google\google_appengine\lib\oauth2client\oauth2client\client.py”, line 787, in _refresh
self._do_refresh_request(http_request)
File “C:\Program Files (x86)\Google\google_appengine\lib\oauth2client\oauth2client\client.py”, line 806, in _do_refresh_request
self.token_uri, method=’POST’, body=body, headers=headers)
File “C:\Program Files (x86)\Google\google_appengine\lib\httplib2\httplib2\__init__.py”, line 1584, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File “C:\Program Files (x86)\Google\google_appengine\lib\httplib2\httplib2\__init__.py”, line 1332, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File “C:\Program Files (x86)\Google\google_appengine\lib\httplib2\httplib2\__init__.py”, line 1268, in _conn_request
conn.connect()
File “C:\Program Files (x86)\Google\google_appengine\lib\httplib2\httplib2\__init__.py”, line 1011, in connect
sock.connect((self.host, self.port))
File “C:\Program Files (x86)\Google\google_appengine\socks.py”, line 362, in connect
raise GeneralProxyError((5,_generalerrors[5]))
socks.GeneralProxyError: (5, ‘bad input’)
之前安装了,但是不好用,从来不投地,重新上传,总是出现上面的,求解,谢谢大神了
HENRY 您好。这是代理错误,在上传之前请确认使用的代理软件是可用的。
谢谢,用了自己的vpn,然后去掉sock.py 和 之前加的代码,部署成功,非常感谢
我的kindleear定时推送无法使用,现在推送却使用正常,求解???
appcfg.py: error: Error parsing C:\kindleear\app.yaml: mapping values are not allowed here
in “C:\kindleear\app.yaml”, line 2, column 8.
app.yam里的代码如下,哪里出错了?
application:vidoc
version: 1
runtime: python27
api_version: 1
threadsafe: true
instance_class: F1
vidoc 您好。您在
application:
后面填写的vidoc
确定是申请到的 APPID 吗?当然不是这个了,不会写错的,是用fr**gat*穿越去申请的
请把
application:vidoc
改成application: vidoc
,分号后面需要有一个空格。你好,KindleEar 这个在本地怎么运行调试啊?
hule 您好。使用 GAE Launcher 添加本地的 KindleEar 项目后,需要在项目设置 Extra Flags 中添加 module-worker.yaml 的路径。运行后通过 127.0.0.1:8081 访问。