微信公眾平臺(tái)開發(fā)之用Flask+SAE實(shí)現(xiàn)簡單被動(dòng)消息回復(fù)功能

程序可以實(shí)現(xiàn)很多美好的事情,如果有好的Idea,微信開發(fā)實(shí)現(xiàn)的功能完全可以替代電腦程序或手機(jī)APP。

偶然聽同事聊天,說關(guān)注了某一電影資源微信公眾號(hào),只需在對話框回復(fù)電影名稱,對方公眾號(hào)便可直接推送這部電影的下載鏈接。

我便梳理了一下這個(gè)流程,這就相當(dāng)于將電影網(wǎng)站的搜索框的功能,移植到了微信公眾平臺(tái)上面了。具體的實(shí)現(xiàn)思路應(yīng)該是:

  1. 利用微信提供的接口,獲取用戶發(fā)送的消息
  2. 處理用戶發(fā)來的消息,通過在事先準(zhǔn)備好的數(shù)據(jù)庫中匹配到對應(yīng)的電影資源
  3. 再次通過消息回復(fù)接口發(fā)送給用戶

上面第二部功能部分就不講了,本文主要介紹對接微信公眾平臺(tái)的消息接口,然后實(shí)現(xiàn)簡單消息自動(dòng)回復(fù)的功能。

開發(fā)前的準(zhǔn)備

需要準(zhǔn)備兩個(gè)東西:申請好的微信訂閱號(hào)和一臺(tái)云服務(wù)器。目前市面上為大家所熟知的云服務(wù)器包括:阿里云、新浪SAE和騰訊云。因?yàn)楸救撕茉绫闵暾埩诵吕嗽频姆?wù)器,所以本文是基于在SAE上測試的。

如果你需要申請SAE,可以使用我的專屬推薦鏈接:http://t.cn/R5p4gRu,如果申請成功,對于我們兩人都會(huì)有獎(jiǎng)勵(lì)。

另外:本文使用Python的Flask來開發(fā)。

新浪SAE的配置

因?yàn)槲⑿藕笈_(tái)配置時(shí),需要驗(yàn)證自己事先設(shè)置好的服務(wù)器,所以這里先簡單介紹一下新浪SAE的配置,和簡單的微信驗(yàn)證代碼。

進(jìn)入自己的新浪云后臺(tái),選擇創(chuàng)建新應(yīng)用,然后開發(fā)語言選擇Python,運(yùn)行環(huán)境選擇標(biāo)準(zhǔn)環(huán)境,填寫自己唯一想要的二級(jí)域名和自己的應(yīng)用名稱,之后點(diǎn)擊右邊的創(chuàng)建應(yīng)用按鈕,即可創(chuàng)建成功。

下圖為我已經(jīng)創(chuàng)建好的應(yīng)用:

之后便可以使用Git在自己電腦上編輯好代碼,然后傳至自己已經(jīng)申請好的云應(yīng)用中。

Git代碼部署說明

在你應(yīng)用的git代碼目錄里,添加一個(gè)新的git遠(yuǎn)程倉庫 sae

$ git remote add sae https://git.sinacloud.com/jikenow

編輯代碼并將代碼部署到 sae 的版本1。

$ git add .
$ git commit -m 'Init my first app'
$ git push sae master:1

SAE支持Git、SVN、代碼打包上傳三種提交方式,具體請參考:http://www.sinacloud.com/doc/sae/tutorial/code-deploy.html#git

下面我給出的代碼,也是通過以上git方法傳到云應(yīng)用中,如果不是很清楚,可以閱讀上面給出的幫助文檔。

微信驗(yàn)證代碼

當(dāng)在微信后臺(tái)配置自己的云服務(wù)器時(shí),微信的服務(wù)器會(huì)發(fā)送GET請求至我們提供的URL,這時(shí)需要我們通過一些判斷來確認(rèn)其確實(shí)是由微信發(fā)起的請求,如果確認(rèn)ok,就返還給微信echostr參數(shù)內(nèi)容。具體Python-Flask代碼如下:

#coding:utf-8
from flask import Flask,request,make_response
import time,hashlib,re,requests
import xml.etree.ElementTree as ET

app = Flask(__name__)

@app.route('/weixin',methods = ['GET','POST'])
def weixin():
    # 微信驗(yàn)證
    if request.method == 'GET':
        token = 'weixin'
        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)

注意我上面路由設(shè)置的是/weixin后綴,所以我之后向微信后臺(tái)添加的配置URL就是http://jikenow.applinzi.com/weixin,前面的網(wǎng)址便是我申請的二級(jí)域名。

參考網(wǎng)址:微信接入指南

附邏輯流程圖:

寫好了之后保存為main.py,然后還需要新建一個(gè)index.wsgi的文件,是SAE要用到,文件內(nèi)容如下:

import sae
from main import app

application = sae.create_wsgi_app(app)

保存好之后,將以上兩個(gè)文件通過Git傳至云應(yīng)用中。

微信公眾平臺(tái)后臺(tái)開發(fā)者配置

  1. 進(jìn)入微信公眾平臺(tái)后臺(tái),選擇開發(fā)選項(xiàng)下的基本配置
  2. 之后可以看到服務(wù)器配置選項(xiàng),點(diǎn)擊修改配置
  3. 填寫對應(yīng)的服務(wù)器URLhttp://jikenow.applinzi.com/weixin)和Token參數(shù)(本人用的是weixin,你可以設(shè)置自己唯一的字符),為了方便開發(fā),加解密方式設(shè)置為明文模式,提交
  4. 此時(shí)微信便會(huì)發(fā)送GET請求至我們的服務(wù)器URL中,我們之前已設(shè)置好,所以應(yīng)該會(huì)通過驗(yàn)證
  5. 點(diǎn)擊啟用即可成功

下圖顯示已啟用(驗(yàn)證成功):

重頭戲:被動(dòng)回復(fù)用戶消息

上面說了一大堆,只是一些準(zhǔn)備工作而已,如果上面的準(zhǔn)備工作有所不明白的,你可以參考我在文章末給出的幾個(gè)鏈接文章。

回歸正題,現(xiàn)在需要編寫一個(gè)很簡單的小程序,模仿用戶說話,也就是用戶向你發(fā)送什么文本內(nèi)容,你原樣返回給用戶此文本內(nèi)容即可。

流程有下面三點(diǎn):

  1. 接收用戶發(fā)送的普通文本消息,微信會(huì)通過POST方式將XML數(shù)據(jù)包發(fā)送給我們的URL中
  2. 復(fù)制此文本消息且生成回復(fù)的XML格式的數(shù)據(jù)
  3. 被動(dòng)消息回復(fù)給微信服務(wù)器,然后即發(fā)送給用戶

上面三點(diǎn)的邏輯清楚了,代碼也就不難理解了,接著上面的微信驗(yàn)證代碼來:

def weixin():
    # 微信驗(yàn)證
    # 上面給出
    # 被動(dòng)回復(fù)消息
    else: # 即如果為POST請求執(zhí)行下面的代碼
        xmlData = ET.fromstring(request.stream.read())
        msg_type = xmlData.find('MsgType').text
        if msg_type == 'text':
            ToUserName = xmlData.find('ToUserName').text
            FromUserName = xmlData.find('FromUserName').text
            Content = xmlData.find('Content').text
            reply = '''<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[text]]></MsgType>
                    <Content><![CDATA[%s]]></Content>
                    </xml>'''
            response = make_response( reply % (FromUserName, ToUserName, str(int(time.time())), Content ) )
            response.content_type = 'application/xml'
            return response

搞好之后,保存main.py文件,上傳至服務(wù)器。至此,我們的微信模仿用戶說話的小功能已經(jīng)做好了。

功能雖小,但是已經(jīng)邁出了第一步,之后的所有更強(qiáng)大的功能,都會(huì)在此基礎(chǔ)上延伸。

參考網(wǎng)址

  1. 微信入門指引
  2. 微信消息對應(yīng)的借口:接受普通消息被動(dòng)回復(fù)用戶消息
  3. Flask+SAE快速打造微信公眾帳號(hào)(有碼)
  4. python,flask,SAE(新浪云),搭建開發(fā)微信公眾賬號(hào)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評(píng)論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,523評(píng)論 25 708
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,572評(píng)論 7 249
  • 高效課堂有一個(gè)評(píng)課五條,有人稱之為“評(píng)五條”: ◆看狀態(tài):是基于常識(shí)的判斷,主要通過看動(dòng)作、聽聲音、察表情來感知課...
    云海2閱讀 264評(píng)論 0 1
  • 很多人都說異地戀不靠譜,但總有些感動(dòng),能夠讓人鼓起勇氣堅(jiān)定信念。我希望我可以在這條路上好好走下去吧,不會(huì)為了貪新鮮...
    旅人未安閱讀 169評(píng)論 0 0