倒騰完靜態博客的搭建后,又開始琢磨著動態頁面的事情了。
一旦可以與用戶產生交互,那就有了非常多的想象空間了。
現在移動開發漸漸變得主流起來,連一開始搭建這個Hexo博客挑選主題時,對移動端的良好適配也變成了首要考慮的因素。
結合以上因素,想到之前申請的微信訂閱號可以做開發,定制自己想要的功能,為何不拿來試一試呢。
1. 預期目標
打通開發各環節,實現消息的通信。
因此,只實現一個最簡單的功能,即接收用戶發來的消息,并將該消息發回用戶。
2. 基本方案
開發環境
網上搜了一下發現,目前做公眾號開發的主流方案是PHP或Java,無奈自己都不會,于是考慮用Python。
Python有很多現成的web框架,可以快速實現功能,不用重復造輪子了。這里選用了Flask。
服務器
因為只是自己玩,所以先托管在免費的云服務器上好了。
最終選定的方案為:
- Python+Flask框架
- Coding.net的項目演示平臺。
3. 前期準備
3.1 開發者功能
在公眾號管理平臺打開開發者功能。
服務器地址之后在部署的時候會得到,Token令牌就是一個密碼,可以任意設置。
3.2 Flask安裝
通過python的包管理工具pip來安裝Flask是最簡單的方法:
$ pip install flask
系統會自動安裝Flask及其依賴包Werkzeug和Jinja2。
4. 程序設計
主程序:
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. 項目部署
5.1 其他項目文件
依賴說明文件:requirements.txt
Flask==0.10.1
Jinja2==2.8
Werkzeug==0.11.2
gunicorn==19.0.0
指定應用的啟動命令:Procfile
web: gunicorn hello:app -b $VCAP_APP_HOST:$VCAP_APP_PORT
更詳細的說明可以參看官方文檔說明。
5.2 啟動服務
在Coding.net中新建一個項目,本地添加遠程代碼庫地址后,用Git工具將項目文件push到相應的代碼庫中。
在項目菜單中進入演示選項,點擊開始檢測進行部署環境的自動檢測。檢測完成后,點擊開啟功能。
進入演示控制臺,設置訪問域名以及應用內存。
該訪問域名就是公眾號平臺中需要設置的服務器地址。
選擇一建部署,等待一會兒,項目在云端就部署完成了。
6. 系統測試
在微信中打開公眾號對話框,現在來發消息試試。
可以看到,系統會將我們的消息再次發送回來。
現在看起來有點傻,也沒有什么實際的使用意義,但只要服務器能夠收到用戶發送的消息,并正確解析,那么對該消息進行何種處理,做出怎樣的反饋,都是可以進一步開發的。做出一個像Siri或者Cortana那樣的聊天機器人也不是不可能啊。
7. 后續任務
7.1 Flask相關
-
基本功能
目前只不過實現了Flask的Hello World,基本的使用方法還需要更深入的研究。 -
項目架構
為了測試最基本的功能,將整個應用在一個模塊中實現,并不符合基本的MVC模式。
Flask應用有推薦的項目架構,為了后續更復雜功能的開發,據其做相應的調整。 -
數據庫
一般的Web應用都會用到數據庫。以SQLite為例,研究數據庫在Flask中的調用方法。 -
應用擴展
Flask的設計思想就是核心簡單易用,功能易于擴展。利用Flask-Script等擴展應用,實現更加豐富的功能。
7.2 公眾號相關
-
開發文檔
閱讀公眾號開發文檔,熟悉最基本的API及調用方法。 -
開發框架
有很多基于Python的公眾號開發框架,將官方API進行打包,更加利于使用。 -
本地調試
如果每次開發調試都要將項目重新部署到遠程服務器上,那就非常不方便,需要尋找一種本地調試的方法。