1. 程式人生 > >技術學得好,老婆加班少!

技術學得好,老婆加班少!

國慶本來打算好好休息下的,沒想到第一天就被領導的電話叫醒,說微信服務掛了,抓緊修復。

mmp…

這就是我老婆的第一天假期,問題修復後,老婆心有餘悸,一直手動在那測試微信服務,就是往他們公眾號發個訊息,看是不是能夠正常返回。

我看著心疼,立志要用技術手段實現微信介面的巡檢。

這就是志氣 enter description here

我先捋了下思路,技術實現的話,大概需要解決如下幾個問題:

1、微信後臺介面如何測試? 2、如何用 Python 實現? 3、如何及時獲取測試結果? 4、如何定時執行測試?

下面開始!

1 微信介面如何測試?

最開始,我比較鬧心的就是微信介面怎麼測,因為之前基本沒有接觸過。

我先去他們微信後臺找到了配置的服務介面資訊,然後又再往上各種找如何測試。

官方測試工具

於是我打開了瀏覽器開發者工具,檢視後臺請求資訊:

請求詳情

然後,我用我們熟悉的 Postman 進行介面測試,果然,OK!

能夠得到我們想要的資料。

返回資料長這樣:

返回資料

2 Python 如何實現介面測試?

經過上面的分析,如何測試介面,流程已經很清晰,我們接下來要做的就是資料解析。

由上圖可見,返回的其實是一個 HTML,我們想要的資料在其中的 resultData 變數中。

resultData 變數對應的是一個 json 資料,其中的 body 是我們最想要的內容,它還是一個 XML 格式的資料。

resultData 對應的資料如下(已經過 UrlDecode):

{
	"status_line"
: "200\tOK", "header": ["Cache-Control: private", "Date: Tue, 02 Oct 2018 07:50:50 GMT", "X-Powered-By: ASP.NET", "Set-Cookie: ASPSESSIONIDCCRCTCTQ=DPFLKAJBFOJLDAFAFNOCDDFI; path=\/", "Server: WWW Server\/1.1", "Content-Type: text\/html; Charset=utf-8", "Content-Length: 270"], "body": "<xml><ToUserName><![CDATA[xxx]]></ToUserName><FromUserName><![CDATA[xxx]]></FromUserName><CreateTime>2018/10/2 15:50:50</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[您所查詢的數碼不存在,請仔細確認,謹防假冒。]]></Content></xml>"
, "hint": "請求成功" }

因此,主要需要做的工作就是:

1、從返回資料中解析出 resultData 對應的資料; 2、從 body 資料中解析出 <Content> 標籤對應的內容;

## 解析 resultData

本來打算用 BeautifulSoup 解析返回的 HTML 資料,但是 resultData 其實是其中 js 程式碼中的一個變數,我不知道怎麼處理,於是想到了用正則直接解析字串。

需要做的就是用正則匹配出 resultData =} 之間的內容。

參考正則:匹配兩個字串 A 與 B 中間的字串包含 A 但是不包含 B:

表示式: A.*?(?=B)

寫出來我們的正則就是:

pattern = re.compile(r'(?<=resultData = ).*?}')

看著有點懵吧,正則的一大頭疼問題就是難看,難懂!

body 內容的解析

resultData 對應資料解析完成後,我們得到了一個 json 資料,然後很容易可以獲取到 body 資料。

接下來就是解析 body 對應的 xml 資料了。

這裡,我們使用的是 xml.etree.ElementTree,解析 xml 非常簡單:

xml_data = ET.fromstring(body)
text = xml_data.find('Content').text

這個元件在之前的文章 《Python 助你填寫高考志願》也有用過,有興趣的可以點選查閱。

重要資訊我們都獲取到了,下面我們就要想怎麼把介面結果發出去了。

3 如何及時獲取測試結果?

這裡,我首先想到的還是之前用過的 pushbear 的微信推送服務,因為實現很簡單,而且也不是正式場合使用。

def send_wechat(tiele, text):
    url = "https://pushbear.ftqq.com/sub?sendkey=xxx5&text={}&desp={}".format(tiele, text)
    resp = requests.get(url)

通過上面的函式,就可以將資訊推送到微信了,不懂得可以參考之前的文章:1 行程式碼,實現微信訊息傳送

4 如何定時執行介面測試?

介面測試程式碼也有了,訊息推送也有了,下面就是如何定時執行介面測試了,比如半小時執行一次?

一種方案是使用 Linux 系統自帶的 crontab 模組。

還有就是 Python 也有定時任務的模組,我找到了一個輕量級的定時任務排程的庫:schedule

import schedule
import time
 
def job():
    print("I'm working...")
 
schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every(5).to(10).days.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
 
while True:
    schedule.run_pending()
    time.sleep(1)

這個栗子簡單到我不需要怎麼解釋。而且,通過這個栗子,我們也可以知道,schedule 其實就只是個定時器。

在 while True 死迴圈中,schedule.run_pending() 是保持 schedule 一直執行,去查詢上面那一堆的任務,在任務中,就可以設定不同的時間去執行。跟 crontab 是類似的。

我們只要把我們的測試介面方法放在上面的 job() 方法裡,然後通過 schedule.every(30).minutes.do(job) 就可以實現半小時一次執行啦!

最終執行效果

總結

至此,我的任務基本完畢,雖然功能簡單,也沒有什麼高階的架構。

但是涉及的東西還是挺多的,網路互動、XML 解析、JSON 解析、正則表示式、微信推送、定時任務等。

這次,就到這吧,大家節日快樂~

如果覺得有用,歡迎關注我的微信,一起學習,共同進步,不定期推出贈書活動~

![你的關注是對我最大的鼓勵!][33]

最近蒐集到傳智播客 2018 最新 Python 和 Java 教程!關注本公眾號,後臺回覆「2018」即可獲取下載地址。