实现kindle的订阅及推送服务(二)——订阅网页搭建
rss4kindle(rss4kindle是什么?详见实现kindle的订阅及推送服务(一))是跑在服务器上的小程序,需要将用户的设置信息传递给它,因此在服务器上搭建设置网页,引导用户访问该网页并设置用户信息以及选择订阅源。
采用微信公众号做为用户入口,用微信公众号的好处是,简单便捷,可发布文章,将微信作为流量入口(谁还没个朋友圈呢)。 由于大部分微信接口不对个人公众号开放,因此无法对公众号菜单及结构进行定制,所以这里采取的是利用公众号原生菜单指导用户做相关kindle配置,并将用户引导至设置页面,也就是架构图中的这一部分。
1. 网页编写
采用 web.py搭建网页。
web.py 是一个轻量级web框架,非常简单易学,教程和示例代码都写得较好,部分说明甚至有中文翻译。最最重要的一点是,原作者秉持开放态度,web.py完全公开,无论何种目的使用web.py,都没有任何限制,并且,web.py同时支持py2.x和py3.x,这为将来的升级奠定了基础。
1.1 定义网站URL结构
urls = ('/', 'index')
app = web.application(urls, globals())
目前并未搭建完整网站,只需要一个设置页面录入用户的kindle邮箱以及需要订阅的源的信息,因此这里只需要一个网页。
1.2 Templator的使用
Templator实现了在HTML的模板中复用python语法,也就是说,通过web.py框架,可以 在HTML中使用python部分语句,可同时使用HTML语言和python语言,大大方便了开发。 在render HTML时,将参数传入网页,再在HTML中对参数进行处理。
#index.html HTML模板,用于显示订阅内容
$def with (form)
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<title>Setting</title>
</head>
<h1 height="1em"><b>rss4kindle</b></font></h1>
<form name="main" method="post">
$if not form.valid: <p class="error">Try again</p>
$:form.render()
<h3 height="1em"><b>订阅源设置</b></font></h3>
<input type="checkbox" name="id" value="知乎每日精选"> <label for="zhihu">知乎每日精选</label></br>
<input type="checkbox" name="id" value="Nhzy资讯"> <label for="nhzy">Nhzy资讯</label></br>
<input type="checkbox" name="id" value="TheEconomist经济学人经济学家中文版"> <label for="ecocn">经济学人</label></br>
<input type="checkbox" name="id" value="什么值得买"> <label for="smzdm">什么值得买</label></br>
<input type="checkbox" name="id" value="MOOC中国"> <label for="mooc">MOOC中国</label></br>
<input type="checkbox" name="id" value="读书笔记"> <label for="readnote">读书笔记</label></br>
<input type="checkbox" name="id" value="战隼的学习探索"> <label for="fightfalcon">战隼的学习探索</label></br>
<input type="checkbox" name="id" value="读写人"> <label for="rwer">读写人</label></br>
<input type="checkbox" name="id" value="cnBeta.COM业界资讯"> <label for="cnbeta">CNBeta</label></br>
<input type="checkbox" name="id" value="PanSci泛科學"> <label for="pansci">Pansic泛科学</label></br>
<input type="checkbox" name="id" value="大家"> <label for="dajia">大家</label></br>
<input type="checkbox" name="id" value="海德沙龙(HeadSalon)"> <label for="headsalon">海德沙龙</label></br>
<input type="checkbox" name="id" value="学而时嘻之"> <label for="xesxz">学而时嘻之</label></br></br>
<input type="submit" />
</form>
#result.html HTML模板,用于显示订阅结果
$def with (input)
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta content="text/html" http-equiv="Content-Type" />
<title>Result</title>
</head>
<body>
<h1 height="1em"><font size="7"><b>rss4kindle</b></font></h1>
<p height="1em" width="0">您的kindle邮箱:$input["email"]</p>
<p height="1em" width="0">您设置的发送时间:$input["sendtime"]</p>
<p height="1em" width="0">您勾选的rss订阅源:</p>
<ul>
$for feed in input["feeds"]:
<li style="margin-bottom:0px">$feed</li>
</ul>
<p height="1em" width="0"><b><font color="#CE0000">设置结果:SUCCESS</font></b></p>
</body>
</html>
#定义传入index.html的参数
myform = form.Form(
form.Textbox("email",
form.notnull,
form.regexp('.*@kindle.cn|.*@kindle.com', u'必须以 @kindle.com or @kindle.cn 结尾'),
description=u'您的kindle邮箱:',),
form.Dropdown('time', ['8:00','20:00'], description=u'设置发送的时间:'))
Templator文档:templator
1.3 GET 和 POST的处理
GET和POST与HTTP方法类似,GET处理用户的页面访问请求,POST处理用户的提交。
class index:
def __init__(self):
self._dbH = dbExecutor.dbExecutor('../sql/user.db')
#判断用户表是否存在,不存在则创建新表
if not self._dbH.isTableExist(TABLE_SUBS_NAME):
self._dbH.createTable(TABLE_SUBS_NAME)
if not self._dbH.isTableExist(TABLE_USER_NAME):
self._dbH.createTable(TABLE_USER_NAME)
def GET(self):
form = myform()
# make sure you create a copy of the form by calling it (line above)
# Otherwise changes will appear globally
return render.index(form)#将参数传入模板
def POST(self):
i = web.input(id=[])
ids = i.get('id')
form = myform()
if not form.validates():#如果传入参数不对,提示用户重新输入
return render.index(form)
else:
#feed
posts = {}
posts['email'] = form.d.email
posts['sendtime'] = form.d.time
feeds = []
#将用户数据写入用户表
self._dbH.setUserSubs(TABLE_USER_NAME, addr=posts['email'] , sendTime=posts['sendtime'])
for item in ids:
feeds.append(item)
#将选中的订阅源写入订阅表
self._dbH.setUserSubs(TABLE_SUBS_NAME, sendTime=posts['sendtime'], addr=posts['email'] , feed=item)
posts['feeds'] = feeds
#在网页result.html上显示订阅结果
return render.result(posts)
其中,TABLE_USER_NAME和TABLE_SUBS_NAME为两个表名
分别存放用户信息和用户订阅的信息
2. 网站部署
官方给出多种方式部署web.py的方法,本文在Centos上采用Web.py + Nginx with FastCGI
部署方法详见官方文档:fastcgi-nginx
订阅页面如下所示:
3. 微信公众号设置流程
流程如上图所示,不做赘述。
- 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