倒騰完靜態(tài)博客的搭建后,又開始琢磨著動(dòng)態(tài)頁面的事情了。
一旦可以與用戶產(chǎn)生交互,那就有了非常多的想象空間了。
現(xiàn)在移動(dòng)開發(fā)漸漸變得主流起來,連一開始搭建這個(gè)Hexo博客挑選主題時(shí),對(duì)移動(dòng)端的良好適配也變成了首要考慮的因素。
結(jié)合以上因素,想到之前申請的微信訂閱號(hào)可以做開發(fā),定制自己想要的功能,為何不拿來試一試呢。
1. 預(yù)期目標(biāo)
打通開發(fā)各環(huán)節(jié),實(shí)現(xiàn)消息的通信。
因此,只實(shí)現(xiàn)一個(gè)最簡單的功能,即接收用戶發(fā)來的消息,并將該消息發(fā)回用戶。
2. 基本方案
開發(fā)環(huán)境
網(wǎng)上搜了一下發(fā)現(xiàn),目前做公眾號(hào)開發(fā)的主流方案是PHP或Java,無奈自己都不會(huì),于是考慮用Python。
Python有很多現(xiàn)成的web框架,可以快速實(shí)現(xiàn)功能,不用重復(fù)造輪子了。這里選用了Flask。
服務(wù)器
因?yàn)橹皇亲约和妫韵韧泄茉诿赓M(fèi)的云服務(wù)器上好了。
最終選定的方案為:
- Python+Flask框架
- Coding.net的項(xiàng)目演示平臺(tái)。
3. 前期準(zhǔn)備
3.1 開發(fā)者功能
在公眾號(hào)管理平臺(tái)打開開發(fā)者功能。
服務(wù)器地址之后在部署的時(shí)候會(huì)得到,Token令牌就是一個(gè)密碼,可以任意設(shè)置。
3.2 Flask安裝
通過python的包管理工具pip來安裝Flask是最簡單的方法:
$ pip install flask
系統(tǒng)會(huì)自動(dòng)安裝Flask及其依賴包Werkzeug和Jinja2。
4. 程序設(shè)計(jì)
主程序:
import time
from flask import Flask, request, make_response
import hashlib
import xml.etree.ElementTree as ET
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def wechat_auth():
if request.method == 'GET':
token = 'your token'
query = request.args
signature = query.get('signature', '')
timestamp = query.get('timestamp', '')
nonce = query.get('nonce', '')
echostr = query.get('echostr', '')
s = [timestamp, nonce, token]
s.sort()
s = ''.join(s)
if (hashlib.sha1(s).hexdigest() == signature):
return make_response(echostr)
else:
xml_recv = ET.fromstring(request.data)
ToUserName = xml_recv.find("ToUserName").text
FromUserName = xml_recv.find("FromUserName").text
Content = xml_recv.find("Content").text
reply = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>"
response = make_response(reply % (FromUserName, ToUserName,
str(int(time.time())), Content))
response.content_type = 'application/xml'
return response
5. 項(xiàng)目部署
5.1 其他項(xiàng)目文件
依賴說明文件:requirements.txt
Flask==0.10.1
Jinja2==2.8
Werkzeug==0.11.2
gunicorn==19.0.0
指定應(yīng)用的啟動(dòng)命令:Procfile
web: gunicorn hello:app -b $VCAP_APP_HOST:$VCAP_APP_PORT
更詳細(xì)的說明可以參看官方文檔說明。
5.2 啟動(dòng)服務(wù)
在Coding.net中新建一個(gè)項(xiàng)目,本地添加遠(yuǎn)程代碼庫地址后,用Git工具將項(xiàng)目文件push到相應(yīng)的代碼庫中。
在項(xiàng)目菜單中進(jìn)入演示選項(xiàng),點(diǎn)擊開始檢測進(jìn)行部署環(huán)境的自動(dòng)檢測。檢測完成后,點(diǎn)擊開啟功能。

進(jìn)入演示控制臺(tái),設(shè)置訪問域名以及應(yīng)用內(nèi)存。
該訪問域名就是公眾號(hào)平臺(tái)中需要設(shè)置的服務(wù)器地址。
選擇一建部署,等待一會(huì)兒,項(xiàng)目在云端就部署完成了。

6. 系統(tǒng)測試
在微信中打開公眾號(hào)對(duì)話框,現(xiàn)在來發(fā)消息試試。

可以看到,系統(tǒng)會(huì)將我們的消息再次發(fā)送回來。
現(xiàn)在看起來有點(diǎn)傻,也沒有什么實(shí)際的使用意義,但只要服務(wù)器能夠收到用戶發(fā)送的消息,并正確解析,那么對(duì)該消息進(jìn)行何種處理,做出怎樣的反饋,都是可以進(jìn)一步開發(fā)的。做出一個(gè)像Siri或者Cortana那樣的聊天機(jī)器人也不是不可能啊。
7. 后續(xù)任務(wù)
7.1 Flask相關(guān)
-
基本功能
目前只不過實(shí)現(xiàn)了Flask的Hello World,基本的使用方法還需要更深入的研究。 -
項(xiàng)目架構(gòu)
為了測試最基本的功能,將整個(gè)應(yīng)用在一個(gè)模塊中實(shí)現(xiàn),并不符合基本的MVC模式。
Flask應(yīng)用有推薦的項(xiàng)目架構(gòu),為了后續(xù)更復(fù)雜功能的開發(fā),據(jù)其做相應(yīng)的調(diào)整。 -
數(shù)據(jù)庫
一般的Web應(yīng)用都會(huì)用到數(shù)據(jù)庫。以SQLite為例,研究數(shù)據(jù)庫在Flask中的調(diào)用方法。 -
應(yīng)用擴(kuò)展
Flask的設(shè)計(jì)思想就是核心簡單易用,功能易于擴(kuò)展。利用Flask-Script等擴(kuò)展應(yīng)用,實(shí)現(xiàn)更加豐富的功能。
7.2 公眾號(hào)相關(guān)
-
開發(fā)文檔
閱讀公眾號(hào)開發(fā)文檔,熟悉最基本的API及調(diào)用方法。 -
開發(fā)框架
有很多基于Python的公眾號(hào)開發(fā)框架,將官方API進(jìn)行打包,更加利于使用。 -
本地調(diào)試
如果每次開發(fā)調(diào)試都要將項(xiàng)目重新部署到遠(yuǎn)程服務(wù)器上,那就非常不方便,需要尋找一種本地調(diào)試的方法。