Python微信公衆號開發—小白篇

本文面向想經過Python學習公衆號開發的同窗。一站式解決新手開發微信公衆號遇到的全部問題。python

爲了防止個人文章被處處轉載,貼一下個人公衆號【智能製造社區】,歡迎你們關注。git

github倉庫地址https://github.com/injetlee/Python/tree/master/wechatgithub

本篇文章首先實現與公衆號的對接,實現簡單的回覆文字、圖片內容。下一篇會對接騰訊的AI平臺,實現對照片的人臉檢測與分析,分析年齡、性別、表情、魅力值等。算法

準備工做

首先要註冊一個公衆號,這個很簡單,咱們到微信公衆平臺註冊就能夠了,選擇我的訂閱號就能夠。可是若是能夠認證的,我建議選擇認證訂閱號,由於未認證的號不少功能權限都沒有。好了,話很少說進入正題。服務器

1. 配置公衆號

  • 打開公衆號,在 開發->基本配置 頁面填寫內容。

配置.png

  • 下面說下須要填的內容,第一個URL要填的就是咱們的服務地址,這個地址必須是外網地址而且是80端口。咱們要本地開發時能夠用 ngrok 解決。在ngrok.com官網下載。解壓後就是一個exe程序。在當前目錄下輸入.\ngrok.exe http 80便可啓動。啓動後以下圖所示,圖片中網址就是咱們須要的

ngrok啓動.jpg

  • 而後咱們複製紅色方框裏面的地址到微信的URL輸入框中,好比個人就輸入http://c9b15df5.ngrok.io/connect 後面這個connect是我本身的服務的地址。就是咱們在程序開發中本身命名的一個請求路徑,若是是新手的話建議按照個人來。不要改動,避免程序跑不起來。微信

  • 第二個Token,本身想一個就好了,隨便填,你能夠當他爲一個密碼。
  • 第三個本身生成就能夠了。
  • 最後一個消息加解密方式選擇明文模式。配置到這裏就結束了,咱們先不要關閉這個頁面,等咱們Python程序驗證部分寫好之後點擊頁面下面的提交就能夠了。如今點會報錯的。app

2.接口驗證部分代碼編寫

  • 查看官方文檔,當咱們點擊配置頁面的提交按鈕時,微信後臺會向咱們配置的地址發送signature、timestamp、nonce、echostr四個信息,咱們拿到這部分信息後經過哈希加密算法計算出(timestamp,nonce,token)的哈希值與微信發送的signature對比,若是相等則說明是微信後臺的請求,而後把echostr返回,就表示驗證成功。微信公衆平臺

  • 這一步,咱們使用三個庫,wechatpy-微信的Python SDK,falcon一個很是微小的Python Web框架,Waitress-一個Python WSGI服務器,固然在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)
  • 代碼寫好之後,咱們在命令行輸入 waitress-serve --port=80 connect:app在80端口啓動咱們的程序。啓動後以下圖,表明啓動成功,這時候咱們到微信的配置頁面點擊提交,會彈出提交成功消息框,表明咱們成功接入微信

waitress-serve.png

  • 簡單說明如下上面代碼,on_get函數接收微信發來的get請求,而且經過query_string拿到微信發送的參數,以後經過wechatpy的check_signature函數來校驗。校驗成功後把echostr返回給微信。

3. 發送文本信息給用戶

  • 接入成功後,就能夠回覆用戶的信息了。咱們增長一個函數處理用戶發送的消息,總體代碼以下:
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='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)
  • 咱們導出了parse_message,TextReply,ImageReply函數。當拿到用戶消息時,判斷是文本消息,就原樣返回給用戶。如今咱們啓動腳本後,向公衆號發送文本消息就會收到自動回覆了。

4. 發送圖片信息給用戶

  • 咱們簡單修改下on_post函數,使其不只能處理文本,也能處理圖片信息。完整代碼以下:
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)
  • 咱們在代碼中加入了圖片處理邏輯,若是是圖片類型的消息,則把圖片返回給用戶。咱們把圖片發送給微信後臺後,會自動生成一個media_id,咱們發送這個media_id就能夠了。

效果圖

效果.png

總結

  • 以上就是第一部分的內容,咱們首先作了接口認證,以後經過一個on_post函數處理了用戶發送的文本和圖片信息,不過目前就是原樣返回。函數

  • 下一篇咱們接入騰訊AI平臺,對照片進行人臉分析檢測以後再返回給用戶,不要走開哦。

相關文章
相關標籤/搜索