本篇文章首先實(shí)現(xiàn)與公眾號(hào)的對(duì)接,,實(shí)現(xiàn)簡(jiǎn)單的回復(fù)文字,、圖片內(nèi)容,。下一篇會(huì)對(duì)接騰訊的AI平臺(tái),,實(shí)現(xiàn)對(duì)照片的人臉檢測(cè)與分析,,分析年齡,、性別,、表情,、魅力值等,。
準(zhǔn)備工作
首先要注冊(cè)一個(gè)公眾號(hào),這個(gè)很簡(jiǎn)單,,我們到微信公眾平臺(tái)注冊(cè)就可以了,,選擇個(gè)人訂閱號(hào)就可以。但是如果可以認(rèn)證的,,我建議選擇認(rèn)證訂閱號(hào),,因?yàn)槲凑J(rèn)證的號(hào)很多功能權(quán)限都沒有。好了,,話不多說進(jìn)入正題,。
1. 配置公眾號(hào)
打開公眾號(hào),在 開發(fā)->基本配置 頁面填寫內(nèi)容,。
下面說下需要填的內(nèi)容,,第一個(gè)URL要填的就是我們的服務(wù)地址,這個(gè)地址必須是外網(wǎng)地址并且是80端口,。我們要本地開發(fā)時(shí)可以用 ngrok 解決,。在ngrok.com官網(wǎng)下載。解壓后就是一個(gè)exe程序,。在當(dāng)前目錄下輸入.\ngrok.exe http 80即可啟動(dòng),。啟動(dòng)后如下圖所示,圖片中網(wǎng)址就是我們需要的
- 然后我們復(fù)制紅色方框里面的地址到微信的URL輸入框中,,比如我的就輸入http://c9b15df5./connect
后面這個(gè)connect是我自己的服務(wù)的地址,。就是我們?cè)诔绦蜷_發(fā)中自己命名的一個(gè)請(qǐng)求路徑,如果是新手的話建議按照我的來,。不要改動(dòng),避免程序跑不起來,。
- 第二個(gè)Token,,自己想一個(gè)就行了,隨便填,,你可以當(dāng)他為一個(gè)密碼,。
- 第三個(gè)自己生成就可以了。
- 最后一個(gè)消息加解密方式選擇明文模式,。配置到這里就結(jié)束了,,我們先不要關(guān)閉這個(gè)頁面,,等我們Python程序驗(yàn)證部分寫好以后點(diǎn)擊頁面下面的提交就可以了。現(xiàn)在點(diǎn)會(huì)報(bào)錯(cuò)的,。
2.接口驗(yàn)證部分代碼編寫
查看官方文檔,,當(dāng)我們點(diǎn)擊配置頁面的提交按鈕時(shí),微信后臺(tái)會(huì)向我們配置的地址發(fā)送signature,、timestamp,、nonce、echostr四個(gè)信息,,我們拿到這部分信息后通過哈希加密算法計(jì)算出(timestamp,nonce,token)的哈希值與微信發(fā)送的signature對(duì)比,,如果相等則說明是微信后臺(tái)的請(qǐng)求,然后把echostr返回,,就表示驗(yàn)證成功,。
這一步,我們使用三個(gè)庫,,wechatpy-微信的Python SDK,falcon一個(gè)非常微小的Python Web框架,,Waitress-一個(gè)Python WSGI服務(wù)器,當(dāng)然在Linux上可以使用gunicorn代替waitress,。通過pip install wechatpy[pycrypto]和pip install falcon,,pip install waitress安裝。代碼如下,,只需要把配置界面的token替換到代碼里
import falcon
from falcon import uri
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='這里填寫配置界面你輸入的token', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
代碼寫好以后,,我們?cè)诿钚休斎?waitress-serve --port=80 connect:app在80端口啟動(dòng)我們的程序。啟動(dòng)后如下圖,,代表啟動(dòng)成功,,這時(shí)候我們到微信的配置頁面點(diǎn)擊提交,會(huì)彈出提交成功消息框,,代表我們成功接入微信
簡(jiǎn)單說明以下上面代碼,,on_get函數(shù)接收微信發(fā)來的get請(qǐng)求,并且通過query_string拿到微信發(fā)送的參數(shù),,之后通過wechatpy的check_signature函數(shù)來校驗(yàn),。校驗(yàn)成功后把echostr返回給微信。
3.發(fā)送文本信息給用戶
接入成功后,,就可以回復(fù)用戶的信息了,。我們?cè)黾右粋€(gè)函數(shù)處理用戶發(fā)送的消息,整體代碼如下:
import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
'''
遇到不懂的問題,?Python學(xué)習(xí)交流群:821460695滿足你的需求,,資料都已經(jīng)上傳群文件,可以自行下載!
'''
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='xxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
def on_post(self, req, resp):
xml = req.stream.read()
msg = parse_message(xml)
if msg.type == 'text':
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
我們導(dǎo)出了parse_message,TextReply,ImageReply函數(shù),。當(dāng)拿到用戶消息時(shí),,判斷是文本消息,就原樣返回給用戶?,F(xiàn)在我們啟動(dòng)腳本后,,向公眾號(hào)發(fā)送文本消息就會(huì)收到自動(dòng)回復(fù)了。
4. 發(fā)送圖片信息給用戶
我們簡(jiǎn)單修改下on_post函數(shù),,使其不僅能處理文本,,也能處理圖片信息。完整代碼如下:
import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='xxxxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
def on_post(self, req, resp):
xml = req.stream.read()
msg = parse_message(xml)
if msg.type == 'text':
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
elif msg.type == 'image':
reply = ImageReply(media_id=msg.media_id, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
我們?cè)诖a中加入了圖片處理邏輯,,如果是圖片類型的消息,,則把圖片返回給用戶。我們把圖片發(fā)送給微信后臺(tái)后,,會(huì)自動(dòng)生成一個(gè)media_id,我們發(fā)送這個(gè)media_id就可以了,。
效果圖
|