1. 程式人生 > >Python3: Django開發微信公眾號平臺功能測試之普通訊息回覆

Python3: Django開發微信公眾號平臺功能測試之普通訊息回覆

在開發微信公眾號平臺時,若上層或自己要求實現自動化的訊息回覆模組功能測試,則需要用程式碼模擬使用者向微信公眾號發訊息,具體的實現是利用python的urllib庫往對應的url傳送post訊息,再接受redirect或render後的結果,對其進行解析即可。

微信伺服器接受使用者輸入後,向第三方傳送的資料為XML格式,詳情可見微信公眾平臺-接受訊息-接送普通訊息

根據官方文件的說明,我們可以構造相應的獲取XML格式文字訊息選單點選事件資料的函式。若需要修改傳送的其他資訊,可以自行修改介面。

# 獲取文字訊息資料,data為傳送的文字訊息,open_id為使用者的open_id
def get_message_text(data, open_id='1'):
    result =  b'''<xml><ToUserName><![CDATA[gh_4d853060485f]]></ToUserName>
        <FromUserName><![CDATA[''' + open_id.encode() + b''']]></FromUserName> 
        <CreateTime>1508031926</CreateTime>
        <MsgType><![CDATA[text]]></MsgType>
        <Content><![CDATA[''' + data.encode() + b''']]></Content>
        <MsgId>6476947803910477524</MsgId>
        </xml>'''
    return result

# 獲取選單點選事件資料,event_key為該選單對應的EventKey,open_id為使用者的open_id
def get_message_event_click(event_key,  open_id='1'):
    result = b'''<xml><ToUserName><![CDATA[gh_4d853060485f]]></ToUserName>
        <FromUserName><![CDATA[''' + open_id.encode() + b''']]></FromUserName> 
        <CreateTime>1508031926</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[CLICK]]></Event>
        <EventKey><![CDATA[''' + event_key.encode() + b''']]></EventKey>
        <MsgId>6476947803910477524</MsgId>
        </xml>'''
    return result

獲得要傳送的資料後,需要向自己的伺服器發出text/xml型別的post請求,其中url為要測試的伺服器地址+/wechat?access_token=自己的access_token,關於access_token,下面使用框架已封裝好的函式,若你的框架沒有該介面,實現方式詳見我的另一篇文章:Python3: Django開發微信公眾平臺功能測試之獲取access_token

首先,匯入函式用到的python庫。

import urllib.request
然後,實現傳送訊息的函式。
# 向自己的伺服器傳送XML資料,url_local為伺服器地址,data為XML二進位制資料
def send_message(url_local, data):
    lib = CustomWeChatView.lib
    url = url_local + '/wechat?access_token=%s' % (
        lib.get_wechat_access_token()
    )
    req = urllib.request.Request(
        url=url, data=data, headers={'Content-Type':'text/xml'}
    )
    res_data = urllib.request.urlopen(req)
    res = res_data.read().decode()
    return res
有了這三個函式,就能輕鬆的模擬微信伺服器向自己伺服器發訊息並得到結果的過程了,具體使用方式如下:
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
class CalculatorHandlerTest(StaticLiveServerTestCase):
    def test_express_right(self):
        # 向有計算功能的伺服器傳送表示式
        result = send_message(self.live_server_url, get_message_text('99 * 99 + 1'))
        # 返回的資料為XML型別,結果只是其中的一部分
        self.assertIn("9802", result)

選單點選事件採用以下發送方式:

result = send_message(self.live_server_url, get_message_event_click('TEST_SEND_MENU_CLICK'))